本帖最后由 yongruru 于 2019-6-21 10:58 编辑
本着上一篇设定的学习思路,理清各种名词,和已有知识形成关联。今天来学习PIC的IO端口。 首先介绍一些基本情况,PIC16F184X6的IO分为3组,PortA,PortB,PortC。每组的引脚数目根据封装会有所不同,以前接触8位单片机(51、AVR、STM8)每组IO的引脚还是8个的居多。我分析可能是因为这个系列引脚数目少,有一些裁剪。操作上PIC可以进行总线操作,也可以直接操作位。电源引脚最大电流250mA,IO引脚最大电流50ma。
IO的结构框图 名词解释
PORTx 端口组,包含整组的电平 LATx 输出锁存器 TRISx 数据方向 ANSELx 模拟选择 WPUx 弱上拉 INLVLx 输入电平控制 SLRCONx 压摆率控制 ODCONx 开漏控制
我们来分析下IO的框图。
钳位电路,对内部io有一定的保护作用,二极管的能力有限,只有20ma,不要用大电流刻意去试它。 看输出部分,写入引脚高低电平的数据到LATx或PORTx寄存器,通过TRISx方向寄存器控制是否输出到引脚。如图
这里需要做些说明。LATx写入效果写入PORTx相同,读取LATx,读出的是寄存器的值;读取PORTx,独处的是引脚实际的值 再看输入部分,过了钳位电路,IO引脚直接和模拟外设相连。当ANSELx=0时,与门打开,此时IO引脚才和数组外设相连。最后经过缓冲器进入数据总线,可在缓冲器读输入电平。由此也能看出ANSELx不会影响数字输出,所以配置成模拟输入,而方向寄存器TRIS没做修改,模拟输入的之将出错。 其实这个IO 有一点复杂,到数字外设还有PPS,外设还需要通过引脚表达出来等等,在此就不深入了,循序渐进。
最后结合上一篇的时钟,我们来实际写一段程序,对板载LED做些控制。 首先时钟采用内部31kHz,做512分频。约等于60Hz,由于PIC单片机4个机器周期为1个指令周期,所以指令速率是15Hz。
LED的引脚是RA2,在output行选择RA2。然后在Pin Module选项卡就会出现RA2的详细配置选项,Start High引脚初始电平;Analog是否用于模拟外设;Output是否为输出;WPU是否上拉;OD是否开漏;IOC电平变化,产生中断。
在main函数while loop里添加如下代码,功能很简单,对RA2做两次反转。 实际波形如下。绿框的宽度约为65ms,和一个指令1/15s相符,有三个65ms宽度方波,应该是执行了3条指令。但是后跟着的却是一个大约260ms的宽度方波,如红框。这是因为,RA2=1占一个指令,while(1)转成汇编应该需要3条指令(有待确定,不懂汇编呀)。一共用掉了4个指令周期。
下面我又做了些修改,实现大致1s的闪烁,并且加入一些节能的思想。在LED亮的那一秒用PWM代替。程序如下
波形如下。
亮灯时波形。由原理图得,低电平灯亮,高电平灯灭,所以通电的时间很短,电量消耗自然也短。
|