使用 Linux 进行 PIC 编程

作者:Brian C. Lane

世界上绝大多数计算机都没有运行 Windows。虽然这对 Linux 爱好者来说是个好消息,但坏消息是它们根本没有运行 Linux 或任何类型的操作系统。这些计算机运行在您的电视机、录像机、手机、寻呼机和船用无线电设备中。它们的名字很神秘,如 MC68HC05、87C51 或 PIC16C84,由摩托罗拉、飞利浦和微芯等公司制造。

微控制器是世界上的主力计算机。它们执行几乎不需要或不需要人工干预的重复性任务,而且当“千年虫”袭击它们更大、更快的同类时,它们中的大多数甚至不会眨眼。它们启动、完成工作然后再次断电,使用非常少的电力,并且绝对不需要散热器和风扇。

这些小奇迹之一是微芯公司的 PIC16C84。这是一个 18 引脚处理器,具有 1KB 的电可擦除/可编程只读存储器 (EEPROM)、36 字节的 SRAM 和 13 条输入/输出线;它可以以 DC (0Hz) 到 10MHz 的速度运行。

PIC16C84 是嵌入式处理器和汇编语言的绝佳入门。RISC 指令集只有 35 条命令(操作码)需要学习,而且单个成本不到 8 美元。您可以花费不到 20 美元的零件构建一个 PIC 编程器,或者您可以从互联网上购买一个预制和预测试的。原型板也可用,只需要一个处理器;它们已经有晶振和编程器接头,以及用于添加到电路的小型原型区域(通常是几个 LED 用于您的第一个项目)。

这种低廉的开发成本并不意味着 PIC 不能用于严肃的工作。我的几个项目包括 PC 和达拉斯半导体 1-wire 总线之间的接口,以及使用 Sony Control-L 协议控制摄像机的有线遥控器。在最近的 Circuit Cellar Ink 竞赛中,一位获奖者使用 8 引脚 PIC12C672 实现了 PPP 和 TFTP 协议。

由于设计和构建连接到并行端口的 PIC 编程器很容易,因此有许多设计可用,所有设计都使用并行端口上的不同引脚。有些在所有控制线上使用反相器,而另一些仅在某些线上使用反相器。我的程序 picprg 可以处理所有这些,只要它们使用标准的五个控制线。由于所有这些变化,驱动编程器的软件需要易于配置。

这些设备的另一个特点是在电路中设计一个编程头,以便可以在不从所连接的设备上移除处理器的情况下对其进行编程。这有助于现场的软件工作,使技术人员可以轻松地维护和升级软件。

当我第一次开始使用 PIC16C84 时,Linux 已经有可用的编译器,但没有 Linux 软件运行我使用的 HOPCO 编程器。解决此问题的一种简单方法是让编程器附带的 DOS 软件在 DOSEMU 下运行。由于我似乎从不选择简单的方法,所以我决定编写一个原生的 Linux PIC 编程器。我决定使用全屏 ncurses 界面,只要 TERM 环境变量设置为 xterm-color,它就可以在 VT 控制台或 xterm 上运行。

我的 picprg 程序允许您编程 PIC 微控制器、读取先前编程的 PIC、根据内存中的程序验证 PIC 以及以十六进制查看程序。它还具有通用的配置屏幕,可以轻松地将其与各种可用的 PIC 编程器一起使用。

编译 picprg

编译 picprg 很简单:您只需在源目录中键入 make,就会生成一个名为 picprg 的二进制文件。picprg 唯一可能导致问题的依赖项是 ncurses 库。您必须安装 v1.9.9e 或更高版本才能使其工作。我所知道的所有 Linux 发行版默认都包含 ncurses,因此您应该可以设置。如果您想将其作为 suid root 安装在 /usr/local/bin 中,则键入 make install;否则,您必须将其移动到您首选的最终位置。

picprg 必须以 root 身份运行,因为它需要对 /dev/lp 设备进行低级访问,即使启用了写入访问权限,普通用户也无法访问。您可以以 root 身份运行它,也可以将其作为 suid root 安装,以便它可以作为 root 用户运行。请记住,任何以 suid root 身份运行的程序都存在潜在的安全风险。

首次启动 picprg 时,您必须将其连接编程器的打印机端口号 (/dev/lpX) 传递给它。我的修改后的 HOPCO 编程器连接到 /dev/lp2,所以我运行 picprg -p2 首次启动它。您将看到一个漂亮的蓝色屏幕(我仍然沉迷于我的 Atari 800 的配色方案),如图 1 所示。

PIC Programming with Linux

图 1. picprg 启动屏幕

主菜单是不言自明的。选择选项 C 进入配置菜单。使用箭头键导航配置选项列表,每个选择都会显示一条简短的帮助消息。

配置

我正在使用 HOPCO 的编程器,该编程器已重新接线以使用与 David Tait 风格的 PIC 编程器相同的并行端口连接。我的编程器的连接如下

Vpp control       pin 5  inverted logic
Vdd control       pin 4  inverted logic
Clock             pin 3  normal   logic
Data to PIC       pin 2  normal   logic
Data from PIC     pin 10 normal   logic

您的编程器的连接很可能不同,具体取决于它用于连接到并行端口的引脚以及用于实现开/关控制的晶体管逻辑。配置菜单(见图 2)允许您轻松指定正在使用的引脚以及用于控制它们的开/关逻辑。按 +- 切换用于控制每个引脚的逻辑。

PIC Programming with Linux

图 2. 配置菜单

输入每个功能的正确引脚号后,对其进行测试以确保被编程的 PIC 看到正确的逻辑电平。配置菜单也用于此目的。当使用箭头键选择其中一条控制线时,可以使用 OF 键打开和关闭该控制线。此开和关状态是从 picprg 的角度定义的,考虑到您在设置引脚时指定的极性。

测试

现在,拿出您信赖的电压表或您将用于检测电源的任何设备(它应该能够处理至少 13V)。将仪表的 GND 连接到编程插座上的引脚 5。然后在配置菜单中选择 Vpp,然后按 OF 以打开和关闭它。您应该看到引脚 4 从 0V 变为 13V 左右(取决于编程器)。对下面列出的每个引脚重复此操作

Vpp      pin 4   0 and approximately 12 volts
Vdd      pin 14  0 and 5 volts
Clock    pin 12  0 and 5 volts
Data Out pin 13  0 and 5 volts

配置显示上的 数据输入 引脚的状态应与 数据输出 引脚的状态相同。当 数据输出 为 1 时,数据输入 线也应为 1。

一旦您使所有电压都朝着正确的方向摆动,请按 S 将配置保存到 ~/.picprgrc;键入 picprg。您现在可以开始使用您的 PIC 编程器了。

ID 和熔丝配置

读取目标文件时,ID 和熔丝数据取自配置菜单中指定的内存位置。微芯将其定义为 0x2000,但有些汇编器将此数据放置在不同的位置。配置菜单允许您指定在加载的文件中查找 ID 和熔丝数据的位置。如果您正在使用 picasm 汇编器,则 ID、熔丝和 EEPROM 位置的默认值不需要更改。它们开箱即用即可正常工作。

EEPROM 配置

PIC16C84 具有 64 字节的内部 EEPROM 数据,可以使用唯一序列号或配置参数等数据进行编程。此数据可以包含在加载的文件中,位于配置菜单指定的内存位置。此地址通常设置为 0x2100

支持的文件类型

picprg 使用 Intel HEX 16 格式,大多数汇编器都支持此格式。(我推荐 Timo Rossi 的 picasm。)如果您的汇编器没有将熔丝和 EEPROM 位置放在标准位置,则可以在配置菜单中定义它们。picasm 也支持 Intel HEX 8 格式,picprg 会自动检测到此文件格式。只需键入文件名,程序就会弄清楚文件以哪种格式保存。

加载目标文件

加载目标文件后,它将存储在内部内存缓冲区中。当时钟类型和熔丝状态在内存中时,它们会显示在显示的第二行。时钟类型和熔丝状态通过查看存储在配置菜单中定义的熔丝内存位置中的数据来确定。

读取 PIC

确保编程器已连接且处理器已正确插入。从主菜单按 R 键,处理器中的数据将被读入内部缓冲区;其时钟类型和熔丝状态将显示在显示的第二行。在读取时,picprg 将每显示 16 个地址,只是为了让您知道它正在正常工作。

编程 PIC

在编程器已连接且处理器已朝着正确的方向插入的情况下,按 P 开始编程过程。RAM 中的数据将被写入 PIC,第三行将显示“正在编程 PIC”。如果发现任何错误,它们将与地址、从失败的验证期间从 PIC 读取的值以及期望的值一起显示。它编程的每 16 个地址都将显示,以向您保证它仍在工作。

从现在开始,就取决于您如何学习编写 PIC 的程序。互联网上有许多有用的网站可以帮助您入门;David Tait 的 PIC 资源列表是最好的起点。

资源

Brian Lane 与他的妻子 Denise 住在华盛顿州奥拉拉。他白天开发嵌入式软件,晚上编写 Linux 代码。可以通过 nexus@tatoosh.com 或 http://www.tatoosh.com/nexus/ 联系他。

加载 Disqus 评论