菜单 English Ukrainian 俄语 主页

面向爱好者和专业人士的免费技术图书馆 免费技术库


无线电电子与电气工程百科全书
免费图书馆 / 无线电电子和电气设备方案

什么是PIC? 无线电电子和电气工程百科全书。 无线电电子电气工程百科全书

免费技术库

无线电电子与电气工程百科全书 / 微控制器

文章评论文章评论

介绍。 PIC16CXX 是 Microchip Technology 制造的 8 位 RISC 微控制器。 该系列微控制器的特点是价格低、功耗低、速度快。

微控制器具有内置程序 EEPROM、数据 ​​RAM,并提供 18 和 28 输出封装。

PIC OTP 是用户可编程的一次性控制器,专为经过全面测试的成品而设计,不会进行进一步的代码更改。 这些控制器采用廉价塑料外壳,配有预设类型的外部振荡器 - 石英或 RC。

为了调试程序和原型设计,可以使用具有紫外线擦除功能的控制器版本。 这些控制器允许大量写入/擦除周期,并且擦除时间非常短——通常为 1-2 分钟。

然而,此类控制器的价格明显高于一次性编程的控制器,因此在批量生产中安装它们是无利可图的。

对于程序可以更改或包含任何可变部件、表格、校准参数、密钥等的产品,可以使用电可擦除和可重新编程的PIC16C84控制器。 它还包含一个电闪存数据 ROM。 我们将使用这个控制器进行实验。

为了充分利用本文,您需要一台兼容 IBM PC 的个人计算机、一个连接到计算机并行端口的编程器、一个 PIC16C84 芯片、一个面包板、8 个带电阻的 LED、一个 +5V 电源和一个用于芯片。

我们将输入一些 PIC 软件,组装它们,将它们放在芯片上,然后在 LED 上观察结果。 我们将在本文中使用基本的 MICROCHIP 助记符,以便您可以更轻松地使用嵌入式控制手册中提供的其他应用示例和列表。

PIC16CXX 系列 我们将开始详细描述 PIC 系列微电路以及这些微控制器区别于其他微控制器的特性和优点。 对于数据安全应用,每个 PIC 都有一个安全位,可以对其进行编程以禁止读取程序代码和数据 ROM。 编程时,首先写入程序代码,检查写入是否正确,然后设置安全位。 如果尝试读取设置了安全位的芯片,则对于 PIC16C5X,代码的高 8 位将被读取为 0,而低 4 位将被扰乱为命令的 12 位。 对于 PIC16C84,类似地,7 个最高有效位将被读取为零,7 个最低有效位将代表命令的加扰 14 位。 当安全位置位时,无法读取 PIC16C84 EEPROM 数据。 图 1 显示了当前生产的所有微控制器并给出了它们的简要特性。 (第 2-1 页上的图) PIC 系列微控制器具有非常高效的指令集,仅包含 35 条指令。 除条件跳转和改变程序计数器的指令需要 2 个周期执行外,所有指令均在 4 个周期内执行。 一个指令执行周期由4个时钟周期组成。 因此,在 1 MHz 频率下,指令执行时间为 14 µs。 每条指令由 16 位组成,可被操作码和操作数整除(可能使用寄存器、内存位置和立即数据进行操作)。 PIC2CXX 微控制器的命令集如图 7.2 所示。(第 2-569 页表 XNUMX) PIC 中命令执行的高速是通过使用双总线哈佛架构而不是传统的单总线冯诺依曼架构来实现的建筑学。 哈佛架构基于一组具有独立总线的寄存器以及用于指令和数据的地址空间。 寄存器组意味着所有软件对象,例如 I/O 端口、存储单元和定时器,都是物理实现的硬件寄存器。

PIC16CXX 的数据存储器(RAM)为 8 位,PIC12C16X 的程序存储器(PROM)为 5 位,PIC14CXX 的程序存储器(PROM)为 16 位。 使用哈佛架构可以让您实现高速的位、字节和寄存器操作。 此外,哈佛架构允许指令的流水线执行,即执行当前指令并同时读取下一条指令。 在传统的冯诺依曼架构中,命令和数据通过单个共享或多路复用总线传输,从而限制了流水线的可能性。 图 3 显示了 PIC16CXX 双总线结构的框图。 (第 2-536 页上的图 B)如您所见,构成 PIC16CXX 的内部物理和逻辑组件与您迄今为止使用过的任何其他微控制器相似。 因此,为 PIC 编写程序并不比为任何其他处理器编写程序困难。 逻辑,只有逻辑……

当然,哈佛架构和大命令长度使得 PIC 代码比其他微控制器更加紧凑,并显着提高了程序执行速度。

PIC 寄存器集 PIC 可以使用的所有软件对象都是物理寄存器。 要了解 PIC 的工作原理,您需要了解它有哪些寄存器以及如何使用每个寄存器。 图 4 显示了 PIC16C84 的所有寄存器。 (第 3.7.1 页的图 XNUMX)

2-541) 让我们从一组操作寄存器开始。 该组由间接地址寄存器(f0)、定时器/计数器寄存器(f1)、程序计数器(f2)、状态字寄存器(f3)、选择寄存器(f4)和输入/输出寄存器( f5,f6)。

您必须了解如何使用这些寄存器,因为它们代表了微控制器的大部分软件可访问对象。 由于我们主要需要了解“如何管理”而不是“内部是如何完成的”,因此我们提供了非常简单的示例,展示了每个寄存器的可能用途。

f0...间接地址寄存器 IND0 间接地址寄存器 f0 物理上不存在。 它使用 f4 选择寄存器来间接选择 64 个可能的寄存器之一。

任何使用f0的指令实际上访问的是f4指向的数据寄存器。

f1... TMR0 定时器/计数器寄存器 TMR0 定时器/计数器寄存器可以像任何其他寄存器一样写入和读取。 TMR0 可以通过施加到 RTCC 引脚的外部信号或与命令频率相对应的内部频率来增加。

定时器/计数器的主要用途是统计外部事件的数量并测量时间。 来自外部或内部源的信号也可以使用 PIC 的内置可编程分频器进行预分频。

f2...PCL 程序计数器 程序计数器 (PC) 用于生成包含 14 位指令的程序 ROM 单元地址序列。 PC具有13位容量,允许您直接寻址8Kx14 ROM单元。 然而,对于 PIC16C84,物理上只有 1K 个单元可用。 PC的低8位可以通过f2寄存器读写,高5位从PCLATCH寄存器加载,地址为0Ah。

f3... 状态寄存器 状态字寄存器与大多数微处理器中的 PSW 寄存器类似。 它包含进位、十进制进位和零位,以及使能模式位和分页位。

f4...FSR 选择寄存器 如前所述,FSR 选择寄存器与间接寻址寄存器 f0 结合使用,以间接选择 64 个可能的寄存器之一。 物理上涉及位于地址 36Ch-0Fh 的 2 个用户 RAM 寄存器和位于不同地址的 15 个服务寄存器。

f5、f6... I/O 寄存器 PORTA、PORTB 寄存器 f5 和 f6 对应于 PIC16C84 上的两个可用 I/O 端口。 端口 A 有 5 位 PA4-PA0,可以使用地址 85h 处的 TRISA 寄存器将其单独编程为输入或输出。 端口 B 有 8 位 PB7-PB0,使用地址为 86h 的 TRISB 寄存器进行编程。 TRIS 寄存器位中的设置 1 将相应的端口位编程为输入。 当读取端口时,读取输出的立即状态,当写入端口时,写入发生在缓冲寄存器中。

f8、f9...EEDATA、EEADR EEPROM 寄存器 PIC16C84 具有内置 64 字节 EEPROM,可使用 EEDATA 数据寄存器和 EEADR 地址寄存器进行读写。 写入一个新字节大约需要 10 毫秒,并由内置定时器控制。 写入和读取的控制是通过EECON1寄存器进行的,该寄存器的地址为88h。 为了对记录进行额外控制,使用地址为 2h 的 EECON89 寄存器。

通用寄存器 通用寄存器是位于地址 0Ch-2Fh 的静态 RAM。 PIC16C84 中总共可以使用 36 个 RAM 单元。

特殊寄存器 W、INTCON、OPTION 最后,让我们看一下特殊的 PIC 寄存器。 其中包括工作寄存器 W(在大多数命令中用作累加器寄存器)以及 INTCON 和 OPTION 寄存器。 INTCON 中断寄存器(地址 0Bh)用于控制中断模式,包含来自各种源的中断使能位和中断标志。 OPTION 模式寄存器(地址 81h)用于设置预分频器和定时器/计数器的信号源,以及设置预分频器的分频系数、RTCC 信号的有效沿和中断输入。 此外,使用选项寄存器,可以为编程为输入的端口 B 位启用终端电阻器。

WDT WDT 看门狗 WDT 看门狗旨在防止意外程序故障造成灾难性后果。 它还可用于定时应用,例如丢失脉冲检测器。 使用看门狗定时器的想法是在其时间延迟到期且处理器不复位之前,在程序的控制下或外部影响下定期对其进行复位。 如果程序运行正常,那么CLRWDT看门狗复位指令应该定期执行,以防止处理器复位。 如果微处理器意外地超出了程序的限制(例如,由于电源电路中的强干扰)或卡在程序的某些部分,则看门狗复位命令很可能不会在足够的时间内执行,并且处理器将发生完全重置,初始化所有寄存器并使系统进入工作状态。

PIC16C84中的看门狗定时器不需要任何外部元件,并在内置RC振荡器上运行,即使在没有处理器时钟频率的情况下,生成也不会停止。 典型的看门狗周期为 18 ms。 您可以将预分频器连接到看门狗定时器,并将其周期增加到 2 秒。

看门狗定时器的另一个功能是从低功耗模式开启处理器,在该模式下处理器通过 SLEEP 命令转移。 在此模式下,PIC16C84 消耗的电流非常小 - 大约 1 µA。 您可以通过按下按钮、触发传感器或看门狗定时器等外部事件从该模式切换到工作模式。

时钟发生器 PIC 系列微控制器可使用四种类型的时钟发生器: XT 石英谐振器 HS 高频石英谐振器 LP 微消耗 RC 晶体 RC 电路芯片编程过程。 如果设置了 XT、HS 和 LP 选项,则将石英或陶瓷谐振器或外部时钟源连接到微电路,如果设置了 RC 选项,则连接电阻器和电容器。 当然,陶瓷谐振器(尤其是石英谐振器)更加准确和稳定,但如果不需要高精度计时,则使用 RC 发生器可以降低设备的成本和尺寸。

复位电路 PIC 系列微控制器将内部加电复位电路与振荡器启动定时器结合使用,在大多数情况下无需使用传统的电阻器和电容器。

只需将 MCLR 输入连接到电源即可。 如果接通电源时可能出现浪涌或浪涌,最好使用100-300欧串联电阻。 如果功率上升非常慢(小于 70 ms),或者您以非常低的时钟速度运行,则必须使用传统的电阻器和电容器复位电路。

从理论到实践...

我们简要了解了 PIC 系列微控制器的主要组成部分。 现在让我们继续进行实际练习。

我们将编写短程序,组装它们,将它们写入微电路,然后看看会发生什么。

为此,我们需要以下东西: - 芯片 PIC16C84; - 汇编器MPALC; - PROPIC 编程器; - 直流或交流18-36V电源; - 带显示设备的原型板。

显示设备的原理图如图 16 所示,我们将用它来演示基本 PIC84C5 命令的操作。(应绘制)如您所见,该设备仅由 8 个带有限流电阻的 LED 组成和频率设置元件。 PIC系列微控制器的每个输出都可以直接控制LED,无需额外的放大器。

什么是PIC?

让我们首先描述示例中将使用的基本代码。 当您开始为项目编写代码时,标头部分(直到 ORG 0 行的所有代码)应该特定于您的应用程序。 标头部分定义了项目中使用的所有资源的逻辑名称 - 端口、位和字节变量以及寄存器。 我们的头文件还设置 I/O 端口,以便在执行以下命令后将端口 A 和 B 的所有位设置为输出: MOVLW INITA MOVWF TRISA MOVLW INITB MOVWF TRISB 当电源打开时,PIC16C84 将设置端口A和B输入并从地址000h开始执行程序。 基本代码如图6所示。 (需要画)像这样的东西:; 演示程序的示例基本代码; 列表 P=16C84,E=2; ; 标题部分; ; 操作寄存器说明 TMR0 EQU 01h PC EQU 02h STATUS EQU 03h FSR EQU 04h ; I/O 寄存器 CNTRLPORT EQU 05h DATAPORT EQU 06h ; RAM 位置 SCRATCH EQU 0Ch DIGIT EQU 0Dh ; 寄存器位 STATUS C EQU 0h DC EQU 1h Z EQU 2h PD EQU 3h TO EQU 4h RP EQU 5h ; 控制寄存器 TRISA EQU 85h TRISB EQU 86h ; I/O 端口的初始化字 INITA EQU B'00000000' INITB EQU B'00000000' ; ; 工作部分; ; 可执行代码的开始 ORG 0 GOTO BEGIN ; ORG 100h 开始 MOVLW INITA MOVWF TRISA MOVLW INITB MOVWF TRISB ; ; 将示例代码粘贴到此处; 结尾 ; 在我们讨论基本代码时,如有必要,请返回图 4。 首先,所有以“;”开头的行都被汇编器视为注释。 让我们继续讨论表达式 TMR0。 我们告诉汇编器,每次遇到单词 TMR0 时,它都应该替换值 01h(01 十六进制)。 “EQU”一词的意思是平等。 因此,我们为 TMR0 分配了值 1h。 从图 4 中可以看出,TMR0 寄存器确实具有地址 1h。 每次想要对 TMR01 寄存器进行寻址时都可以使用 0h,但这会使调试更加困难,因为您必须记住 01h 始终表示 RTCC。 您还可能有等于 01h 的数据。 符号名称的使用消除了歧义并使源文本更易于阅读。 您还可以查看 PC、STATUS 和 FSR 寄存器的表达式。 名称 PC 对应寄存器地址 02h,名称 STATUS 对应寄存器地址 03h,名称 FSR 对应寄存器地址 04h,依此类推。 我们还为 I/O 端口指定了名称:CNTRLPORT (05h) 和 DATAPORT (06h)。 RAM 单元也可以有名称。 我们为 0Ch 处的单元选择名称“SCRATCH”,为 0Dh 处的单元选择名称“DIGIT”。 如果您读到本文的结尾,您将看到我们在任何地方都没有直接使用 PC,尽管这个名称已被定义。 这没有错误 - 您可以定义名称,然后不使用它们,当然,如果先前未定义名称,则不能使用名称。 不要太担心这一点 - 汇编器的工作是根据所有规则检查文本,如果某些内容不匹配,您将收到错误消息。 您不仅可以命名寄存器,还可以命名寄存器中的各个位。 请注意设置状态寄存器的部分。 图 7 显示了 STATUS 寄存器的组成。 (第 3.9.1-2 页上的图 544) 符号 C 设置为 0h,因为 C 或 CARRY 是 STATUS 状态字的位 XNUMX。 每次我们需要检查进位位(位0)时,我们都会使用预定义的字符“C”。 每次我们想要访问位 2 或零位时,我们将使用字符“Z”而不是 02h。 您可以定义寄存器的完整位结构,即使您之后不使用所有这些结构。 现在我们清楚了寄存器是如何描述的,我们可以继续讨论可执行代码。 在启动可执行代码之前,我们必须将 ORG 表达式设置为 0。 这是一个指向汇编器的指针,该表达式后面的代码从 EEPROM 地址 XNUMX 开始。 “ORG”表达式用于将代码段分配到EEPROM大小内的不同地址。 另一个 ORG 表达式出现在地址 100h 处的 BEGIN 标签之前,如 ORG 表达式 100h 所示。 可执行代码必须以 END 指令结尾,这意味着该指令后面没有可执行命令。 上电时,PIC16C84 跳转到地址 000h。 处理器执行的第一条指令是 GOTO BEGIN 命令,它将控制权转移到地址 100h,并从此地址继续进一步的工作。 BEGIN 是用户可选择的标签名称(标签必须始终从第一行位置开始),汇编器将其用作参考。 在操作期间,汇编器确定 BEGIN 标签的位置并记住,如果再次遇到该名称,则将用该标签的地址替换它。 CALL 和 GOTO 命令使用标签来引用源文本。 现在让我们看看处理器执行的以下命令。 MOVLW INITA 指令将分配给名称 INITA 的值加载到工作寄存器 W 中。 该值在标头中指定,等于 B'00000000',即 00h。 字符 B' 表示数据以二进制格式给出。 可以在同一位置写入 0(十进制)或 0h(十六进制)并得到相同的结果。 在需要对寄存器中的位进行操作的情况下,使用二进制表示更方便。 以下 MOVWF TRISA 指令将工作寄存器 W 中的值加载到 TRISA 端口 A 配置控制寄存器中。 将该寄存器的某位设置为 0 指定对应的端口 A 位为输出。 在我们的例子中,端口 A 的所有位均由输出设置。 请注意,端口 A 只有 5 位,写入 TRISA 寄存器的值的高 3 位(也有 5 位)未被使用。 例如,如果我们想将端口 A 的低位设置为输入,我们可以在寄存器描述部分将 INITA 的值设置为 B'00000001'。 如果在程序过程中我们需要重新定义各个端口位的分配,例如在双向传输期间,那么最方便的是在描述部分中指定所有必要的配置字,就像我们对 INITA 和 INITB 所做的那样。 接下来的两个命令 MOVLW INITB 和 MOVWF TRISB 定义端口 B 的配置。 我们可以通过不编写 MOVLW INITB 命令来节省成本,因为在我们的例子中 INITB 也是 0h。 然而,我们没有这样做,因为如果我们随后需要更改任何一位的分配,可能会导致难以发现的错误。 不是仅更改一个端口中的一位,而是两个端口中具有相同编号的两位将发生更改。 因此,当程序还没有完成时,不希望进行这样的节省,尽管在最后,在代码优化阶段,可以删除这样的重复。 我们已经做了什么? 1. 通过 EQU 行,我们告诉汇编器我们将使用哪些符号名称。 2. 我们已将复位向量设置为地址 000h。 3. 我们已经将程序执行的起始地址设置为从标号BEGIN到地址100h。 4. 我们已将端口 A 和 B 的所有位配置为输出。 现在我们可以在基本代码的标题和末尾之间插入示例代码,而不是注释行“在此处插入示例代码”。 我们将用实际命令替换这一行,组装生成的程序,将其写入微电路,用指示设备重新排列原型板上的微电路,看看会发生什么。 第一个程序 对于第一个程序,我们只需要三个命令: MOVLW k MOVWF f GOTO k 我们已经在基本代码的标头中使用了这些命令。 MOVLW 指令将字节文字或常量加载到 W 工作寄存器中。 以下 MOVWF 指令将一个字节从工作寄存器 W 移动到给定寄存器 f。 GOTO 命令将控制转移到地址 k。 以下程序将值 01010101 写入工作寄存器 W,然后将其内容写入端口 B。 启动该程序后,您将看到四个 LED 灯发光。 MOVLW B'01010101' ;将 01010101 加载到寄存器 W MOVWF DATAPORT ;将 W 写入端口 B (DATAPORT) GOTO $ ;永远循环 汇编指令“$”表示程序计数器 (PC) 的当前值。 因此,GOTO $命令意味着跳转到我们当前所在的位置。 这样的循环是无限的,因为没有办法(除了中断)可以摆脱它。 GOTO $ 命令通常用于在调试时停止代码。 汇编 我们将使用宏汇编器 MPALC,因为它是由 MICROCHIP 免费分发的,并且包含我们需要的所有功能。 如果您喜欢使用其他汇编器,请使用其描述来汇编我们的程序。 运行 MPALC 宏汇编器的命令行非常简单: MPALC <source_text> [options] 其中 <source_text> 是包含要汇编的源文本的文件的名称,并且可以有相当多的选项。 选项的完整描述由汇编器在选项 /? 上给出。 首先,我们不需要指定任何选项。 我们仍然需要做的唯一一件事是指定编写程序的处理器类型以及汇编器应产生的错误类型。 这是使用 LIST 汇编指令完成的(图 XNUMX)。 6)。 默认源文件扩展名为 .ASM。 必须明确指定另一个扩展。 因此,采用包含图 6 所示文本的 Examples.ASM 文件,并运行汇编器: MPALC Examples 作为汇编器的结果,将创建具有以下扩展名的文件: * OBJ 目标文件 * LST 列表文件 * ERL 错误和警告文件 * SYM 符号文件 目标文件以十六进制格式创建,包含必须写入芯片的代码。 列表文件包含程序的完整列表以及引导代码。 错误和警告文件记录了组装过程中发生的所有错误和警告。 它们也出现在列表文件中。 写入符号文件的符号标签表旨在供调试器进一步使用。 处理完我们的程序后,汇编器应该发出消息“汇编器未发现错误”,这意味着没有发现错误。 不应该创建错误文件。 如果您的汇编器生成任何错误消息,或者未创建 Examples.OBJ、EXAMPLE.LST 和 Examples.SYM 文件,请再次检查您是否正确执行了所有操作。 编程 您现在有一个目标文件,EXAMPLE.OBJ,必须将其写入芯片。 记录是在编程器和PROPIC程序的帮助下进行的。 运行 PROPIC 程序的命令行与运行汇编器的命令行类似: PROPIC <object_file> [options] 其中 <object_file> 是汇编器创建的目标文件的名称,选项决定写入的模式芯片。 选项列表由选项 /? 给出 与汇编程序的情况一样,首先我们不需要指定任何选项。 拿起编程器,将其电缆连接到打印机端口连接器(如果您的机器有 2 或 3 个打印机端口,则连接到第一个打印机端口)。

什么是PIC? 什么是PIC?

取一个能够提供高达 18 mA 电流的 36...100 V DC 或 AC 电源,并将其连接到编程器。 准备PIC16C84芯片,但不要将其插入编程器插座。 现在您可以启动编程器:

PROPIC Examples { 应在此插入有关程序员的程序如何工作的内容。 现在您已经有了一个已编程的芯片,您可以看到它是如何工作的。 测试

拿一块面包板并在其上组装如图 5 所示的电路。该电路中没有关键部件。 所有电阻器都可能与标称值有 + -30% 的偏差,LED 的额定电流不超过 10 mA。 要安装PIC16C84芯片,请使用插座。 为了给我们的电路供电,您可以使用与微电路编程时使用的电源相同的电源。 也可以使用5V实验室电源,此时不需要KR142EH5A稳压器、二极管电桥和电解电容,向图中的点5提供2V电压。

电路组装完毕后,仔细检查所有部件是否组装正确,LED 的极性是否安装正确,微电路的电源是否连接到正确的引脚且极性正确。 取出烧写好的芯片,插入面包板上的插座,打开电源。 4 个 LED 应该亮起(一个之后)。 您的第一个程序正在运行! PIC 命令集

现在您已经学会了如何汇编程序、将其写入芯片并在面包板上测试它,我们可以继续描述 PIC 系列微控制器的整套指令。 我们将继续关注 PIC16C84,尽管我们将讨论的几乎所有内容都适用于 PIC 系列的其他微控制器。 在描述过程中,我们将编写简短的程序,以便更好地理解某些命令的工作原理。 您可以将这些程序插入基本代码,组装它们,将它们放在芯片上,然后将芯片插入面包板,看看它是如何工作的。 如果您在下一段中对所有内容都完全清楚,则可以不尝试,而是直接进入下一段。 诺普

让我们从 NOP 命令开始我们的描述。 很难看到该命令的输出,因为它没有执行任何操作。 该指令通常用于延时循环或微调程序特定部分的执行时间。 CLRW

该命令清除工作寄存器 W。让我们在示例中添加一行,然后看到所有 LED 都亮起。

MOVLW B'01010101' ;加载01010101到寄存器W

CLRW ;清除寄存器W

MOVWF DATAPORT ;将 W 写入端口 B (DATAPORT)

GOTO $ ;永远循环 CLRF f

CLRF 对任何寄存器的作用与 CLRW 对工作寄存器 W 的作用相同。以下命令将端口 B 设置为 0h。

CLRF DATAPORT ;清除端口 B (DATAPORT) SUBWF f,d ADDWF f,d

从任意寄存器 f 中减去工作寄存器 W。 该命令还设置 STATUS 寄存器中的 CARRY、DIGIT CARRY 和 ZERO 标志。 执行命令后,您可以检查这些符号并确定结果是零、正数还是负数。 逗号后面的字符 d 表示命令结果将放置的地址。 如果d=0,则将结果放入工作寄存器W,如果d=1,则将结果写入命令中使用的寄存器f。

在我们的示例中,值 0FFh 被加载到 SCRATCH 寄存器中,值 01h 被加载到 W 寄存器中。 然后执行 SUBWF 命令并将结果显示在 LED 上。

MOVLW 0FFh ;将 0FFh 加载到寄存器 W

MOVWF SCRATCH ;将W的内容加载到SCRATCH寄存器

MOVLW 01h ;将01h加载到寄存器W中

SUBWF SCRATCH,0 ;减去 LED 应显示 11111110,其中 1 关闭,0 开启。

ADDWF 命令的工作方式完全相同,将工作寄存器 W 添加到任意寄存器 f 并设置相同的标志。 以下示例演示了 ADDWF 命令的工作原理。

MOVLW 0h ;将0加载到寄存器W中

MOVWF SCRATCH ;将W的内容加载到SCRATCH寄存器

MOVLW 1h ;将01h加载到寄存器W中

ADDWF SCRATCH,0 ;做加法 LED 应显示 00000001。

请注意,在减法示例中,FFh 值前面有一个“0”。 汇编器的符号“0”意味着这是一个数字,而不是标签。 如果没有符号 0,那么汇编器将开始寻找名称为 FFh 的标签,该标签在该程序中不存在,因此会发生错误。 值 0FF 后面的字符“h”表示该值以十六进制格式指定。 SUBLW k ADLW k

这两个命令的工作方式与上述完全相同,只是操作是在工作寄存器 W 和命令中指定的字节常量之间执行的。 SUBLW 命令从常数 k 中减去工作寄存器 W,ADDLW 命令将工作寄存器 W 添加到常数 k。 这些命令还设置 CARRY、DIGIT CARRY 和 ZERO 标志。 命令的结果放置在工作寄存器 W 中。以下示例将 SCRATCH 减 5。

MOVLW 0FFh ;将 0FFh 加载到寄存器 W

MOVWF SCRATCH ;将W的内容加载到SCRATCH寄存器

SUBLW 05h ;从工作寄存器中减去 5

MOVWF SCRATCH ;加载 SCRATCH 的新内容 LED 应显示 11111010。 DECF f,d INCF f,d

DECF 命令将给定寄存器减 1,INCF 将给定寄存器加 1。结果可以放回给定寄存器(对于 d=1)或工作寄存器 W(对于 d=0)。 作为执行这些命令的结果,可以在状态寄存器中设置零符号。 以下是使用这些命令的示例:

MOVLW 0FFh ;将 0FFh 加载到寄存器 W

MOVWF SCRATCH ;将W的内容加载到SCRATCH寄存器

DECF SCRATCH,0 ;将 SCRATCH 减 1

此示例会将 SCRATCH 从 0 增加到 1。

CLRF SCRATCH ;清除 SCRATCH

INCF SCRATCH,0 ;将 SCRATCH 增加 1 IORWF f,d ANDWF f,d XORWF f,d

这三个命令执行逻辑运算“OR”、“AND”和“EXCLUSIVE OR”。 逻辑加或运算最常用于设置寄存器中的各个位。 然后通过逻辑与运算将这些位复位。当对相同的位执行异或运算时,结果为 0。因此,异或运算经常用于检查某个位中某些位的状态(设置或清除)。登记。 以下过程将使用 IORWF 命令设置端口 B 上的位 1:

CLRF DATAPORT ;清除端口 B

MOVLW B'00000010' ;在寄存器W中设置掩码

IORWF DATAPORT,1 ;通过掩码 W 设置端口 B 中的位

GOTO $ ;永远循环 LED 应显示 00000010。现在使用 ANDWF 指令清除 2 位:

MOVLW B'11111111' ;将0FFh装入W寄存器

MOVWF DATAPORT ;设置端口 B 中的所有位

MOVLW B'00000101' ;在寄存器W中设置掩码

ANDWF DATAPORT,1 ; 通过掩码 W 清除端口 B 中的位

GOTO $ ;永远循环 LED 应显示 00000101。

假设我们使用了 SCRATCH 寄存器并想知道它是否等于 04h。 这是使用 XORWF 命令的好时机:

MOVLW 04h ;将04h加载到寄存器W中

MOVWF SCRATCH ;将寄存器 W 加载到 SCRATCH 中

XORWF SCRATCH,0 ;检查W 和SCRATCH 是否相等 由于SCRATCH 和W 相等,XORWF 运算的结果为零(所有LED 都亮起)。 状态寄存器将设置零位,然后实际程序可以检查和处理该零位。 IORLW k ANDLW k XORLW k

这三个命令执行与上述对应命令相同的操作,不同之处在于操作是在工作寄存器 W 和命令中指定的掩码之间执行的。 命令执行的结果放入工作寄存器W中。例如:

MOVLW 0FFh ;将 0FFh 加载到寄存器 W

ANDLW 040h ;保留第 6 位 LED 将显示 01000000。

MOVLW 10h ;将10h加载到寄存器W中

IORLW 09h ;设置位 0 和 3 LED 将显示 00011001。

MOVLW B'00100000' ;加载40h到寄存器W

XORLW B'11111111' ;反转 W LED 显示 11011111。 MOVF f,d

该命令主要用于将一个寄存器移至工作寄存器W(d=0)。 如果设置 d=1,则该命令会将寄存器加载到其自身中,但 STATUS 寄存器中的 ZERO 位将根据寄存器的内容进行设置。 例如,我们要加载到SCRATCH寄存器0Fh中,然后将SCRATCH寄存器加载到工作寄存器W中。

MOVLW 0Fh ;将0Fh装入工作寄存器W

MOVWF SCRATCH ;将寄存器 W 加载到 SCRATCH 中

CLRW ;清除 W

MOVF SCRATCH,0 ;将 SCRATCH 加载到 W 寄存器

MOVF SCRATCH,1 如果满足条件 (SCRATCH = 0h),则 STATUS 寄存器的 ZERO 位将被置位。 COMF f,d

该命令反转任何给定的寄存器。 当d=0时,结果存入工作寄存器W,当d=1时,将指定寄存器的内容取反。 作为示例,让我们反转值 01010101:

MOVLW B'01010101' ;加载01010101到寄存器W

MOVWF SCRATCH ;将寄存器 W 加载到 SCRATCH 中

COMF SCRATCH,0 ;反转 SCRATCH LED 将显示 10101010。 DECFSZ f,d INCFSZ f,d

当您获得一些 PIC 汇编器的经验后,您将经常使用这些命令。 当 d=1 时,DECFSZ 指令减 0,INCFZ 指令将指定寄存器加 XNUMX,如果寄存器变为零则跳过下一条指令。 当 d=XNUMX 时,结果被写入 W 寄存器,如果工作寄存器 W 变为零,则跳过下一个命令。 这些命令用于生成时间延迟、计数器、循环等。 这是使用循环的典型示例: START

MOVLW 0FFh ;将 FFh 加载到寄存器 W

MOVWF SCRATCH ;将寄存器W加载到SCRATCH LOOP中

DECFSZ SCRATCH,1 ;将 SCRATCH 减 1

GOTO LOOP ;并循环直到 = 0

MOVF DIGIT ;将 DIGIT 寄存器加载到 W 中

MOVWF DATAPORT ;输出到 LED

DECF DIGIT,1 ;将 DIGIT 寄存器减 1

GOTO START ;转到开始 因此,LED 将以不同的速率闪烁。 低位 LED 闪烁最频繁,高位 LED 闪烁最少。 当时钟频率为 4 MHz 时,最高阶 LED 的闪烁频率约为 8 Hz,而接下来的每个 LED 的闪烁频率将是原来的两倍。 现在让我们弄清楚我们是如何做到的。 这里的 DECFSZ 命令在由两个命令组成的延迟循环中工作 - DECFSZ 和 GOTO LOOP。 因为我们在 SCRATCH 寄存器中预加载了 0FFh,所以该循环将执行 255 次,直到 SCRATCH 变为零。 时钟频率为 4 MHz 时,延迟为 1 µs/指令 * 2 条指令 * 255 = 510 µs。 在 DIGIT 寄存器中,我们事先没有写入任何内容,因此第一次通过时 LED 上可能会显示任何值。 然后 DIGIT 寄存器减 1,并从头开始重复循环。 结果,DIGIT寄存器在256个周期内迭代所有值,即大约 130 毫秒。

通过将加载到 SCRATCH 寄存器中的值从 FFh 更改为 0h,可以将相同的代码与 INCFSZ 指令一起使用。 如果用 INCF 命令替换 DECF 命令,LED 将以相同的方式闪烁。 SWAF f,d

该命令交换任何寄存器中的半字节。 对于其他命令,当d=0时,结果写入工作寄存器W,当d=1时,结果保留在寄存器中。 这是使用此命令的简单示例:

MOVLW B'00001111' ;加载0Fh到寄存器W

MOVWF SCRATCH ;将寄存器 W 加载到 SCRATCH 中

SWAPF SCRATCH,0 ;交换半字节 LED 将显示 11110000。 RRF f,d RLF f,d

PIC 汇编器中有两条移位指令 - 右移通过任何 RRF 寄存器的 CARRY 位,左移通过任何 RRF 寄存器的 CARRY 位。 对于其他命令,当d=0时将移位结果写入W寄存器,当d=1时保留在寄存器中。 移位指令用于执行乘法和除法运算、串行数据传输以及其他目的。 在所有情况下,从 8 位寄存器移出的位都会写入 STATUS 寄存器中的 CARRY 位,并且根据移位方向,将 CARRY 位写入寄存器的另一端。 左移将 RLF CARRY 写入寄存器的最低有效位,右移将 RRF CARRY 写入寄存器的最高有效位。

CLRF STATUS ;清除状态寄存器

MOVLW 0FFh ;将 0FFh 加载到寄存器 W

MOVWF SCRATCH ;将寄存器 W 加载到 SCRATCH 中

RRF SCRATCH,0 ;右移 LED 应显示 01111111,因为 CARRY 已加载到高位。 现在让我们向左移动:

CLRF STATUS ;清除状态寄存器

MOVLW 0FFH ;加载0FFh到寄存器W

MOVWF SCRATCH ;将寄存器 W 加载到 SCRATCH 中

RLF SCRATCH,1 ;左移 LED 应显示 11111110。 BCF f,b BSF f,b

清除 BCF 位和设置 BSF 位命令用于对寄存器中的各个位进行操作。 参数b表示执行操作的位数,可以取0到7的值。我们尝试使用BCF命令打开LED:

MOVLW 0FFh ;将 0FFh 加载到寄存器 W

MOVWF DATAPORT ;关闭 LED

BCF DATAPORT,7 ;清除端口 B 中的位 7

GOTO $ ;永远循环 这将打开对应于位 7 的 LED。回想一下,我们使用掩码和 ANDWF 命令做了同样的事情。 不同之处在于 ANDWF 和 IORWF 指令需要预先形成掩码并将其存储在某个寄存器中,但同时它们能够同时设置或清除多个位。 BCF 和 BSF 指令仅对一位进行操作。 此外,BCF 和 BSF 指令不会更改 STATUS 寄存器,因此它们通常用于不需要后续检查状态寄存器的情况。 BTFSC f,b BTFSS f,b

条件跳转指令 BTFSC 和 BTFSS 检查任何寄存器中给定位的状态,并根据结果跳过下一条指令。 如果指定位清零,则 BTFSC 命令将跳过该命令;如果指定位已设置,则 BTFSS 命令将跳过该命令。 这是一个简单的例子:

MOVLW 0FFh ;将 0FFh 加载到寄存器 W

MOVWF DATAPORT ;关闭 LED

MOVLW B'00000001' ;加载01h到寄存器W

MOVWF SCRATCH ;将寄存器W加载到SCRATCH LOOP中

BTFSS CNTRLPORT,0 ;检查 CNTRLPORT 中的位 0

GOTO LOOP ;等待位 0 被设置

BCF DATAPORT,7 ;打开LED

GOTO $ ;永远循环 此示例检查端口 A(芯片引脚 0)的位 17,如果该引脚设置为高电平,则打开 LED。 在此示例中尝试将 BTFSS 替换为 BTFSC。 当端口 A 的位 0 变低时,LED 将亮起。

前面我们提到了检查 STATUS 寄存器中的状态位的可能性。 这也可以通过 BTFSS 和 BTFSC 命令完成:

;检查进位位

BTFSS STATUS,C ;如果设置了 C,则跳过 GOTO

转到任何地方; 以同样的方式检查 ZERO 位:

;检查位零

BTFSS STATUS,Z ;如果设置了 Z,则跳过 GOTO

转到任何地方; 可以肯定地说,您会经常使用这些示例。 呼叫 k 返回

这两个命令用于处理子例程。 CALL命令用于跳转到命令中指定地址的子程序,RETURN命令用于从子程序返回。 两个命令均在 2 个周期内执行。 CALL 命令所在的地址存储在专门组织的寄存器中,称为堆栈。 这些寄存器不可访问,仅用于子程序调用和返回。 堆栈深度,即特殊寄存器的数量为8 个。因此,主程序中嵌套调用子程序的次数不能超过8 个。 子程序返回后,继续执行 CALL 后的下一条指令。 当调用子程序时,W 寄存器和 STATUS 寄存器不会被保存,因此如果需要,可以将它们存储在单独的存储位置中。 这是使用子例程的简单示例: START

BSF DATAPORT,7 ; 关闭 LED

CALL TURNON ;调用子程序

GOTO START ;转到启动 TURNON

BCF DATAPORT,7 ;打开LED

RETURN ; 从子程序返回 结果,LED 将以大约 150 kHz 的频率闪烁。 RETLW 为 RETFIE

还有两个用于从子例程返回的命令。 RETLW 命令在工作寄存器 W 中返回该命令中指定的常数,并且 RETFIE 命令使能中断。 RETLW 命令通常用于创建值表。 让工作寄存器 W 包含距表开头的偏移量。 然后您可以通过以下过程获取所需的元素:

MOVLW 02h ;设置偏移量

CALL SHOWSYM ;调用子程序

MOVWF DATAPORT ;将表元素输出到端口 B

GOTO $ ;永远循环 SHOWSYM

ADDWF PC ;计算表偏移量

RETLW 0AAh ;表的第一个元素

RETLW 0BBh ;表的第二个元素

RETLW 0CCh ;第 3 个表条目 LED 应显示 10111011。 特殊命令

我们还需要提到两个特殊命令 - CLRWDT 和 SLEEP。 CLRWDT 命令旨在重置看门狗定时器,其目的我们已经讨论过。 该指令必须出现在程序的此类部分中,以便两个相邻 CLRWDT 指令之间的程序执行时间不会超过看门狗定时器。 SLEEP 命令旨在将处理器置于低功耗模式。 执行该命令后,处理器时钟发生器关闭,处理器可以通过复位输入、看门狗定时器或中断切换回工作模式。 结论

本文并不声称完整描述了 PIC16C84 微控制器的功能。 为此,您应该阅读其技术说明。 另外,了解 MPALC 汇编器、宏、选项等的所有可能性。 阅读他的手册对您很有用。 要正确设置所有必要的选项,您应该阅读编程器的使用说明。 微控制器的应用示例将为您的独立项目奠定坚实的基础。 如果您有任何疑问,可以联系 MICROCHIP 产品的区域支持中心,地址如下:Moscow, Rubtsovskaya nab。 3 办公室 502,电话。 (095)-263-9930 他们将随时准备回答您的所有问题。 您还可以通过拨打(095)-162-8405在地区BBS获取新版本软件、应用示例、参考信息

AD微论坛

出版:N. Bolshakov, rf.atnn.ru

查看其他文章 部分 微控制器.

读和写 有帮助 对这篇文章的评论.

<< 返回

科技、新电子最新动态:

用于触摸仿真的人造革 15.04.2024

在现代科技世界,距离变得越来越普遍,保持联系和亲密感非常重要。萨尔大学的德国科学家最近在人造皮肤方面的进展代表了虚拟交互的新时代。萨尔大学的德国研究人员开发出了超薄膜,可以远距离传输触觉。这项尖端技术为虚拟通信提供了新的机会,特别是对于那些发现自己远离亲人的人来说。研究人员开发的超薄膜厚度仅为 50 微米,可以融入纺织品中并像第二层皮肤一样穿着。这些薄膜充当传感器,识别来自妈妈或爸爸的触觉信号,并充当将这些动作传递给婴儿的执行器。父母触摸织物会激活传感器,对压力做出反应并使超薄膜变形。这 ... >>

Petgugu全球猫砂 15.04.2024

照顾宠物通常是一项挑战,尤其是在保持房屋清洁方面。 Petgugu Global 初创公司推出了一种有趣的新解决方案,这将使猫主人的生活变得更轻松,并帮助他们保持家中干净整洁。初创公司 Petgugu Global 推出了一款独特的猫厕所,可以自动冲掉粪便,让你的家保持干净清新。这款创新设备配备了各种智能传感器,可以监控宠物的厕所活动并在使用后激活自动清洁。该设备连接到下水道系统,确保有效清除废物,无需业主干预。此外,该厕所还具有较大的可冲水存储容量,非常适合多猫家庭。 Petgugu 猫砂碗专为与水溶性猫砂一起使用而设计,并提供一系列附加功能 ... >>

体贴男人的魅力 14.04.2024

长期以来,女性更喜欢“坏男孩”的刻板印象一直很普遍。然而,英国莫纳什大学科学家最近进行的研究为这个问题提供了新的视角。他们研究了女性如何回应男性的情感责任和帮助他人的意愿。这项研究的结果可能会改变我们对男性对女性吸引力的理解。莫纳什大学科学家进行的一项研究得出了有关男性对女性吸引力的新发现。在实验中,女性看到了男性的照片,并附有关于他们在各种情况下的行为的简短故事,包括他们对遇到无家可归者的反应。一些人无视这名无家可归的人,而另一些人则帮助他,比如给他买食物。一项研究发现,与表现出同理心和善良的男性相比,表现出同理心和善良的男性对女性更具吸引力。 ... >>

来自档案馆的随机新闻

防潮防尘读卡器 PocketBook 640 07.03.2014

在俄罗斯,展示了电子书阅读器PocketBook 640,据制造商称,这是“世界上第一款系列防潮防尘阅读器”。

这种新颖性可以承受完全浸入水下一米深的情况。 坚固的设计可保护电子元件免受盐水、沙子和肥皂水的损坏。

阅读器配备 6 英寸 E Ink Pearl 显示屏,分辨率为 600x800 像素。 支持触控。 制造商应用了Film Touch技术:将最薄的敏感薄膜贴在屏幕表面,这使得设备比其他类似的触摸屏小工具更轻,并提高了文本显示的质量。 面板在明亮的阳光下可读性很好。

阅读器配备了时钟速度为 1,0 GHz 的处理器、256 MB RAM 和容量为 4 GB 的闪存模块。 有一个用于无线网络 Wi-Fi (802.11b / g / n) 的适配器和一个 microUSB 端口。 该设备重 170 克,尺寸为 174,4x114,6x9 毫米。

Linux 被用作软件平台。 支持 PDF、PDF (DRM)、EPUB、EPUB (DRM)、DJVU、FB2、FB2.ZIP、DOC、DOCX、RTF、PRC、TCR、TXT、CHM、HTM、HTML 和图像 JPEG、BMP、PNG、TIFF .

由 1300 mAh 可充电电池供电,其电量足以查看多达 8000 页。 PocketBook 640 的价格是 7000 卢布。

其他有趣的新闻:

▪ 遗传是智力老化的罪魁祸首

▪ 从上面的房子视图

▪ 对抗海盗的技术

▪ 太空弹射器

▪ 纸瓶

科技、新电子资讯

 

免费技术图书馆的有趣材料:

▪ 网站标准职业安全说明 (TOI) 部分。 文章精选

▪ 文章西伯利亚苍蝇拍。 给家庭主人的提示

▪ 中国的具体情况是什么?详细解答

▪ 文章本质种子。 传说、栽培、使用方法

▪ 文章 USB 仪表 LC。 无线电电子电气工程百科全书

▪ 文章晶体管领域国外。 无线电电子电气工程百科全书

留下您对本文的评论:

Имя:


电子邮件(可选):


点评:





本页所有语言

主页 | 图书馆 | 用品 | 网站地图 | 网站评论

www.diagram.com.ua

www.diagram.com.ua
2000-2024