[PIC®/AVR®/dsPIC®产品]

【4月板卡】PIC16F184x6学习笔记-IO

[复制链接]
928|5
手机看帖
扫描二维码
随时随地手机跟帖
yongruru|  楼主 | 2019-6-6 23:35 | 显示全部楼层 |阅读模式
本帖最后由 yongruru 于 2019-6-21 10:58 编辑

本着上一篇设定的学习思路,理清各种名词,和已有知识形成关联。今天来学习PIC的IO端口。

首先介绍一些基本情况,PIC16F184X6的IO分为3组,PortA,PortB,PortC。每组的引脚数目根据封装会有所不同,以前接触8位单片机(51、AVR、STM8)每组IO的引脚还是8个的居多。我分析可能是因为这个系列引脚数目少,有一些裁剪。操作上PIC可以进行总线操作,也可以直接操作位。电源引脚最大电流250mA,IO引脚最大电流50ma。

引脚数目.jpg

IO的结构框图
框图.jpg
名词解释

PORTx                端口组,包含整组的电平
LATx                输出锁存器
TRISx                数据方向
ANSELx                模拟选择
WPUx                弱上拉
INLVLx                输入电平控制
SLRCONx        压摆率控制
ODCONx                开漏控制


我们来分析下IO的框图。

钳位电路,对内部io有一定的保护作用,二极管的能力有限,只有20ma,不要用大电流刻意去试它。

看输出部分,写入引脚高低电平的数据到LATx或PORTx寄存器,通过TRISx方向寄存器控制是否输出到引脚。如图

输出.jpg


这里需要做些说明。LATx写入效果写入PORTx相同,读取LATx,读出的是寄存器的值;读取PORTx,独处的是引脚实际的值

再看输入部分,过了钳位电路,IO引脚直接和模拟外设相连。当ANSELx=0时,与门打开,此时IO引脚才和数组外设相连。最后经过缓冲器进入数据总线,可在缓冲器读输入电平。由此也能看出ANSELx不会影响数字输出,所以配置成模拟输入,而方向寄存器TRIS没做修改,模拟输入的之将出错。
输入.jpg

其实这个IO 有一点复杂,到数字外设还有PPS,外设还需要通过引脚表达出来等等,在此就不深入了,循序渐进。


最后结合上一篇的时钟,我们来实际写一段程序,对板载LED做些控制。

首先时钟采用内部31kHz,做512分频。约等于60Hz,由于PIC单片机4个机器周期为1个指令周期,所以指令速率是15Hz。
内部时钟.jpg

LED的引脚是RA2,在output行选择RA2。然后在Pin Module选项卡就会出现RA2的详细配置选项,Start High引脚初始电平;Analog是否用于模拟外设;Output是否为输出;WPU是否上拉;OD是否开漏;IOC电平变化,产生中断。

IO选择.jpg

pin.jpg

然后生成代码。(这个按钮找了好久呀^V^)。

MCC生成按钮.jpg
main函数while loop里添加如下代码,功能很简单,对RA2做两次反转。
代码1.jpg

实际波形如下。绿框的宽度约为65ms,和一个指令1/15s相符,有三个65ms宽度方波,应该是执行了3条指令。但是后跟着的却是一个大约260ms的宽度方波,如红框。这是因为,RA2=1占一个指令,while(1)转成汇编应该需要3条指令(有待确定,不懂汇编呀)。一共用掉了4个指令周期。

波形.JPG

下面我又做了些修改,实现大致1s的闪烁,并且加入一些节能的思想。在LED亮的那一秒用PWM代替。程序如下
代码2.jpg

波形如下。
1s闪烁.JPG

亮灯时波形。由原理图得,低电平灯亮,高电平灯灭,所以通电的时间很短,电量消耗自然也短。
pwm.JPG


使用特权

评论回复
yongruru|  楼主 | 2019-6-6 23:37 | 显示全部楼层
本帖最后由 yongruru 于 2019-6-6 23:48 编辑

PIC16F184X6学习笔记-IO.pdf (712.66 KB)

使用特权

评论回复
CoolSilicon| | 2019-6-10 08:36 | 显示全部楼层
由此也能看出ANSELx不会影响数字输出,所以配置成模拟输入
这句话 有点问题...
你看你MCC的设置中, 这里都没勾上, 你可以试试如果勾上的话, 你看RA2还有没有输出嘛.
468315cfda5ececa62.png

使用特权

评论回复
yongruru|  楼主 | 2019-6-10 09:36 | 显示全部楼层
本帖最后由 yongruru 于 2019-6-10 10:45 编辑
CoolSilicon 发表于 2019-6-10 08:36
由此也能看出ANSELx不会影响数字输出,所以配置成模拟输入
这句话 有点问题...
你看你MCC的设置中, 这里都 ...

测试过了,配置成模拟,输出也是有效的。下面有截图和工程,你也可以试一下。模拟输入不会影响数字输出,在使用模拟输入时,要注意关掉TRISx,否则会有影响。
1.jpg
2.jpg


IO.X.rar (233.22 KB)

使用特权

评论回复
CoolSilicon| | 2019-6-10 10:47 | 显示全部楼层
你是对的...
但是不理ANSELx在输出模式下的应用, 这个习惯是非常不好的!
datasheet上有非常明确的说明, 作为数字口使用的时候, 这个寄存器需要清0;
这种不理ANSELx的输出模式, 是超纲使用, 出了问题, 要挨骂的...

687095cfdc4397b4c7.png

使用特权

评论回复
yongruru|  楼主 | 2019-6-10 11:51 | 显示全部楼层
CoolSilicon 发表于 2019-6-10 10:47
你是对的...
但是不理ANSELx在输出模式下的应用, 这个习惯是非常不好的!
datasheet上有非常明确的说明, 作 ...

我刚初学,很多外设还没仔细看、试验过。有些东西是感觉别扭,不能理解。外设学的再多些应该可以融汇贯通一些。另外这个IO还提到有优先级的区分,做模拟输出可能和这个有关系,你可以看看是不是。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

71

帖子

4

粉丝