嵌入式系统/PIC 微控制器
由 Microchip 制造的(“外设接口控制器”)微控制器在工程师和爱好者中都很受欢迎。PIC 微控制器有多种“类型”,每种类型都有不同的组件和功能。
许多类型的电子项目都可以使用 PIC 系列微处理器轻松构建,其中包括时钟、非常简单的视频游戏、机器人、伺服控制器等等。PIC 是一款非常通用的微控制器,可以提供多种选择,价格合理。
该系列中的其他微处理器包括 Parallax SX、Holtek HT66Fxxx 系列、Holtek HT48FxxE 系列,以及一些“PIC-on-a-FPGA”实现。
通用仪器公司生产了一款名为 PIC1650 的芯片,被描述为可编程智能计算机。该芯片是所有 PIC 芯片的鼻祖,在功能上与目前的 16C54 非常接近。它被设计为其 CP1600 微处理器的外设。也许这就是为什么大多数人认为 PIC 代表外设接口控制器。Microchip 从未将 PIC 作为缩写使用,仅作为 PIC。最近,Microchip 开始将其 PIC 称为 PICmicro MCU。
如何在近 2000 种不同型号的 PIC 微控制器中找到适合你的 PIC 呢?
Microchip 网站有一个很棒的 产品选择工具。你只需输入你的最低要求和可选的期望要求,就会显示结果零件号及其基本功能列表。
你可以直接从 Microchip 的在线商店 Microchip Direct 购买 PIC 处理器。价格与许多经销商相同,有时甚至更优惠。
规则一:只选择你可以实际获得的微处理器。PIC 都是相似的,因此你无需对使用哪种型号过于挑剔。
如果你的学校仓库中只有一种 PIC,就使用它。如果你从 Newark 或 DigiKey 等公司订购,请忽略任何“缺货”的零件 - 仅订购“有货”的零件。这将为你创建项目节省大量时间。
曾经,PIC16F84 是爱好者最好的 PIC。但 Microchip、Parallax 和 Holtek 现在正在生产许多性能更好、价格更低的芯片,因为它们拥有更高的生产水平。
- 我想要一个包含大约 4 个 PIC 推荐的列表,以及*为什么*推荐它们,这样当有更好/更便宜的芯片出现时,就可以轻松确认并将其添加到列表中。
(总结 PICList 针对 PIC 微控制器的初学者清单、PIC Elmer 160:附录“A”:“其他 PIC” 2003 和 Wouter van Ooijen :)
PIC:选择一个芯片并 购买一个。
许多人推荐以下 PIC 作为爱好者的“第一个 PIC”的不错选择,请注意修订号(例如 16F628A 中的 A)
- PIC18F4620:它有 13 个模拟输入 - Wouter van Ooijen 建议爱好者使用最大、功能最强大的芯片 [1],这就是它(截至 2006-01)。约 9 美元
PIC16F877A -- 16F87x 系列中最大的芯片;有 8 个模拟输入 - 由 Wouter (#2) 推荐;AmQRP;PICList。约 8 美元- PIC16F877A ,这可能是爱好者社区中最受欢迎的仍在生产的 PIC。这是其系列中最好的 PIC,曾经是用于大型爱好者项目的“PIC”,以及用于小型项目的 PIC16F84。它具有 14KB 的程序存储器、368 字节的 RAM、40 引脚封装、2 个 CPP 模块、8 个 10 位 ADC 通道。它还具有 UART 和 MSSP,MSSP 是一种能够作为主控的 SSP,可以控制连接到 I2c 和 SPI 总线的任何设备。与之前提到的其他 PIC 相比,它没有内部振荡器,这一点需要注意。此外,这款 PIC 的价格对于其包含的功能来说相对昂贵。这可能是 Microchip 为迫使迁移到更好的芯片而采取的措施。--由 Ivaneduardo747、Wouter (#2)、AmQRP 推荐--[2]。约 9 美元
PIC16F88 -- 有 7 个模拟输入 - 由 AmQRP 推荐;SparkFun。约 5 美元- PIC16F88,这是 PIC16F628A 的增强版。它具有 16F628 的所有功能,以及两倍的程序存储器,7KB;七个 10 位 ADC,一个 SSP(同步串行端口),能够接收通过 I2C 和 SPI 总线发送的消息。它还支持自编程,该功能由一些开发板使用来避免使用编程器,节省了购买编程器的成本。--由 Ivaneduardo747、AmQRP 推荐-- SparkFun。约 5 美元
PIC16F628 -- 比 PIC16F84A 更便宜,具有内置的 4 MHz 时钟和 UART,但没有模拟输入 - 由 Wouter (#3) 推荐;AmQRP -- 约 4 美元- PIC16F628A,这是一款不错的入门级 PIC,因为它与曾经最受爱好者喜爱的 PIC 之一:PIC16F84 兼容。这样,初学者就可以从大量项目和程序中选择,特别是在使用低级语言(如 PIC 汇编语言)创建项目时。它具有 18 引脚封装、3.5KB 的 Flash 存储器,可以使用 20MHz 晶体每秒执行高达 500 万条指令(MIPS)。需要注意的是它没有模数转换器 (ADC)。与 PIC16F84A 相比,它具有 UART,能够生成和接收 RS-232 信号,这对于调试非常有用。有些人觉得这款芯片比功能更少的 PIC16F84A 还便宜,这很有意思。-- 由 Ivaneduardo747、Wouter (#3) AmQRP 推荐-- 约 5 美元
- PIC16F1936,一款功能强大的中端 PIC,具有 11 通道、10 位 ADC;两个间接指针寄存器;XLP(超低功耗),用于电池供电设备的低功耗消耗。-- 由 PIClist 上的一些人推荐,作为 16F877 更快、更好、更便宜的替代品。-- 约 3 美元
- PIC12F683,一款小型 8 引脚微控制器。由于其体积小、功耗相对较高、功能多样(如 4 个 ADC 通道和内部 4MHz 振荡器),它是一款适用于小型应用的不错微控制器。--由 Ivaneduardo747 推荐;[3]。约 2.50 美元
Microchip 自 2003 年以来推出了许多新零件,其中是否有任何零件在某些方面比这些芯片更适合爱好者? 待办:"开始使用 PIC 编程:从哪个 PIC 芯片开始比较好?" 有没有一些有用的推荐可以添加到以上内容中?
有几个不同的“系列”。
- “F”后缀表示芯片具有可重新编程的 Flash 存储器。
PIC10F—in super-tiny 6 pin packages PIC12F—in tiny 8-pin packages PIC14F PIC16F—in tiny 14-pin packages PIC18F PIC24F PIC24E PIC24H dsPIC30F dsPIC33F dsPIC33E
- “C”后缀表示芯片使用 EPROM 存储器。以前,一些芯片需要使用非常昂贵的紫外线擦除器来擦除。这种方法主要由公司使用。但大多数这类芯片都是专门制造的,以便你写入后无法更改:它是 OTP(一次性可编程)。以前人们在将程序写入此类芯片之前会仔细检查程序。最近,随着 Flash 存储器成本的下降,这些芯片的使用越来越少,但有些芯片仍然在使用,因为它们可靠性高或成本较低。
PIC12C PIC16C PIC17C PIC18C
每个系列都包含一个具有所有功能的“完整”成员,以及缺少一项或多项功能的子系列变体成员。例如,在 16F84 系列中,16F84 是功能完整的 PIC,具有 Flash 存储器,程序空间是 16F83 的两倍。该系列还包含 16C84 和 16C83,它们是为数不多的可重新编程的 C 后缀 PIC 之一。在原型设计中,我们通常使用“完整”版本以确保原型至少能正常工作。在原型设计过程中,我们希望反复调整代码、重新编程和测试,直到它能够正常工作。因此,我们使用上述“Flash”系列之一,而不是“OTP”系列,除非有必要。对于短期的生产,建议使用 C 部分。对于非常长的生产线,以前曾使用过一些具有掩模编程 ROM 的 PIC。现在 Microchip 提供了工厂预编程服务。
每个系列的每个成员通常有多种不同的封装。爱好者通常使用塑料双列直插式封装(通常称为 DIP 或 PDIP),因为它最容易插到无焊面包板上进行调试。(“宽 DIP”效果也一样)。他们避免使用陶瓷双列直插式封装 (CDIP),不是因为陶瓷不好(它同样容易插到无焊面包板上),而是因为塑料部件效果一样好,而且便宜得多。
(后来,为了大规模生产,我们可能会找出哪种最便宜的削减版本,它仅仅有足够的东西可以工作,并使用最便宜的封装,它只有足够多的引脚适合这种特定应用… 也许甚至是一个 OTP 芯片)。
然后,每个系列的每个成员的每个不同封装都以“商用温度范围”和“工业温度范围”两种形式提供。
PIC 16x
[edit | edit source]PIC 16 系列被认为是一个优秀的通用 PIC 系列。PIC 16 通常有 3 个输出端口可用。以下是一些曾经常见的该系列型号。
- PIC 16C54 - 最初的 PIC 型号,'C54 采用 18 引脚 DIP 封装,有 12 个 I/O 引脚。
- PIC 16C55 - 采用 28 引脚 DIP 封装,有 20 个 I/O 引脚可用
- PIC 16C56 - 与 'C54 具有相同的形状尺寸,但功能更多
- PIC 16C57 - 与 'C55 具有相同的形状尺寸,但功能更多
- PIC 16C71 - 有 4 个 ADC 可用,它们映射到与端口 A 相同的引脚(双重用途引脚)。
- PIC 16C84 - 具有在电路中擦除和重新编程 EEPROM 的功能
互联网上提供许多为 PIC16x 系列编写的程序,可免费获取。
基于闪存的芯片,如 PIC16F88,在开发方面方便得多,并且可以运行为上述芯片编写的代码,几乎不需要进行任何更改。
PIC 12x
[edit | edit source]PIC12x 系列是最小的系列,具有 8 个引脚,最多有 6 个 I/O 引脚可用。当空间和/或成本是一个因素时,这些系列被使用。
PIC 18x
[edit | edit source]PIC 18x 系列采用 28 引脚和 40 引脚 DIP 封装。它们具有更多端口、更多 ADC 等等… PIC 18 通常被认为是高端微控制器,有时甚至被称为成熟的 CPU。
截至 2007 年,Microchip 目前正在生产 6 款具有 USB 接口的闪存微控制器。所有这些都属于 PIC18Fx 系列。(28 引脚 PIC18F2450、PIC18F2455、PIC18F2550;以及 40/44 引脚 PIC18F4450、PIC18F4455、PIC18F4550)。
PIC 栈
[edit | edit source]PIC 栈是一个专用的寄存器组(与程序员可访问的寄存器分开),它只能用于在函数调用(或中断)期间存储返回地址。
- 12 位:具有 12 位内核的 PIC 微控制器(第一代 PIC 微控制器)(包括大多数 PIC10、一些 PIC12、少数 PIC16)的硬件栈中只有 2 个寄存器。12 位 PIC 程序中的子程序最多只能嵌套 2 层,否则栈就会溢出,数据就会丢失。为 12 位 PIC 编程的人会花费很多精力来解决这个问题。(这些人被迫严重依赖那些避免使用硬件栈的技术。例如,宏、状态机和软件栈)。
- 14 位:具有 14 位内核的 PIC 微控制器(大多数 PIC16)的硬件栈中包含 8 个寄存器。这使得函数调用更容易使用,即使为它们编程的人应该了解一些剩余的陷阱 [4].
- 16 位:具有 16 位内核的 PIC 微控制器(所有 PIC18)的硬件栈深度为“31 层”。对于大多数人编写的程序来说,这已经足够深了。
许多算法涉及将数据压入某种类型的栈,然后稍后从中提取数据。在 PIC 上为这些算法编程的人必须使用一个单独的软件栈来存储数据(类似于Forth)。(使用其他微处理器的人通常为子程序返回地址和这个“栈数据”共享一个栈)。
可以使用调用树分析来查找程序使用的最深可能的子程序嵌套。 (除非程序使用w:recursion)。只要“主”程序的最深可能的嵌套,加上中断例程的最深可能的嵌套,得到的总和小于其运行的微控制器的栈大小,那么一切都会正常工作。一些编译器会自动执行这种调用树分析,如果硬件栈不足,编译器会自动切换到使用“软件栈”。汇编语言程序员必须手动进行这种分析。
你还需要什么
[edit | edit source]编译器、汇编器
[edit | edit source]PIC 微控制器的 BASIC、C、Forth 和其他几种编程语言版本都可用。请参阅嵌入式系统/PIC 编程。
下载器
[edit | edit source]你需要一种称为“下载器”的设备,将编译后的程序从你的 PC 传输并烧录到微控制器中。(不幸的是,“编程”有两个含义,请参阅嵌入式系统/术语#编程)。
下载器有两种类型。如果你的 PIC 在你的系统中,并且你想更改软件,
- 使用“IC 编程器”类型的设备,你必须拔出 PIC,将其插到“IC 编程器”中,重新编程,然后将 PIC 放回你的系统中。
- 使用“在电路编程器”类型的设备(ICSP),你不需要触碰 PIC 本身,只需将一根电缆从编程器直接连接到你在 PIC 旁边(希望如此)放置的接头上,重新编程,然后拔下电缆。
编程器(不完整)列表包括
- BobProg - 具有外部电源的简单 ICSP 编程器 [5]
- JDM 编程器 修改为 LVP 微控制器 [6]
- PIC16F84 的在电路编程器 PIC16F84 编程器
- IC 编程器 ICProg 程序:12Cxx、16Cxxx、16Fxx、16F87x、18Fxxx、16F7x、24Cxx、93Cxx、90Sxxx、59Cxx、89Cx051、89S53、250x0、PIC、AVR、80C51 等。
- MassMind 上列出了许多其他编程器。MassMind.
许多人更喜欢在可能的情况下使用“引导加载程序”进行编程。引导加载程序在第 引导加载程序和引导扇区 章中详细介绍。
电源
[edit | edit source]任何电子电路最重要的部分都是电源。PIC 编程器需要一个 +5 伏和一个 +13 伏的稳压电源。需要两个电源的原因是不同的编程算法。
- 高功率编程模式 - 在这种模式下,我们通过将 PIC 的 RB7(数据) 和 RB6(时钟) 引脚拉低,同时将 MCLR 引脚从 0 拉高到 VCC(+13v) 来进入 PIC 的编程模式。
- 低功率编程模式 - 该算法只需要 +5v 来进行编程操作。在该算法中,我们将 RB3(PGM) 从 VDD 拉低到 GND 来进入编程模式,然后将 MCLR 设置为 VDD(+5v)。
这已经在 PIC 烧录器硬件内部处理好了。如果你想知道这是如何实现的,你可能想看看网上各种 PIC 烧录器硬件原理图。[1][2]
引脚图
[edit | edit source]振荡器电路
[edit | edit source]所有 PIC 微控制器都内置了 RC 振荡器电路,尽管这些电路速度较慢且精度较高。外部振荡器电路也可以使用,最高频率可达 20 MHz。PIC 指令每个机器指令周期需要 4 个时钟周期,因此其最大有效运行速度为 5 MHz。然而,某些 PIC 内置了 PLL(锁相环)倍频器。用户可以启用 4 倍倍频器,从而产生 4 倍于外部振荡器的虚拟振荡频率。例如,如果最大允许振荡频率为 16 MHz,则虚拟振荡频率为 64 MHz。因此,PIC 的执行速度为 64 / 4 = 16 MIPS(每秒百万条指令)。某些 PIC 还内置了振荡器,通常为 4 MHz(对应 1 MIPS),或低功耗非精确 48 kHz 振荡器。这使得可以将两个 I/O 引脚用于其他目的。这些引脚也可以用来产生一个频率,如果您想将其他硬件与某个 PIC 的内部时钟同步,就可以使用这些引脚。
继续阅读 嵌入式系统/PIC 编程。
PICList 档案中包含大量有关使用 PIC 微控制器(以及一般电子设计)的信息。如果您真的遇到困难,可以考虑订阅 PICList,提出您的问题……并作为回报回答其他人的问题。PICList 档案托管在 MassMind
- PIC 微控制器文档指南 详细介绍了相关信息。
- 遥控飞机/RCAP 讨论了一个使用 PIC16F876A 的项目。
- Parallax SX 常见问题解答,作者:Guenther Daubach
- Microchip PIC:原始制造商的网站
- PICmicro 微控制器入门,作者:Wouter van Ooijen
- "PIC 16F628A:为什么 PIC 16F84 现在已经过时?"
- "PIC 16F88:为什么 PIC 16F84 现在真的过时了?"
- "免费的 PIC 资源和项目,包含描述、原理图和源代码。"
- "使用 C 语言编程 PIC 微控制器"
- "使用其他编程语言编程 PIC 微控制器:Forth、JAL、BASIC、Python 等。"
- "8 位 PIC® 微控制器解决方案手册" 描述了每个 PIC 微控制器系列中 PIC 硬件堆栈的大小,以及各个系列之间的其他主要区别。
- Micro&Robot - 877:带有可自编程 PIC 微控制器的机器人套件!您不需要 PIC 编程器。
- 使用 SDCC 编程 PIC16f628a:一个偶尔更新的示例列表,演示了如何使用 PIC 的外设以及如何使用免费的 SDCC pic 编译器与其他设备进行交互。