英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 4052|回复: 0
打印 上一主题 下一主题

PIC单片机I/O端口使用设计技巧及错误解答

[复制链接]
跳转到指定楼层
1#
发表于 2009-4-18 20:16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问 1: 振荡器工作正常,但程序不能改变任何I/O 端口设置。是哪里出错了?
答 1:
1. 是否正确初始化了方向寄存器TRIS?在BANK1 中可以直接对方向寄存器进行设置。但是
大部分情况下,用户在对TRIS 寄存器写零前,并没有切换到BANK1。BSF STATUS,RP0
指令,切换到BANK1。
2. 如果您在BANK1(即RP0 = 1)中正确地设置了TRIS 寄存器,那么在对端口进行写操作
前,您可能并没有返回BANK0。返回BANK0,可使用BCF STATUS,RP0 指令。
3. 是否使能了引脚的外设复用功能?
4. 是否在器件烧写编程时,使能了看门狗定时器?如果是,应至少每隔9 ms 使用CLRWDT
指令将看门狗定时器清零一次。如果看门狗定时器使用了预分频器,那么时间间隔可适当
加长。
5. 您是否使用了正确的指令来写端口?当应该使用MOVWF 指令时,不止一个人都用成了
MOVF 指令。
6. 如果有中断处理,是否禁止了中断响应?如果没有,可以先禁止中断响应来验证一下是不
是中断响应造成的影响。
问 2: 当程序读一个端口时,得到的值与端口寄存器的值不同。这是什么原因?
答2:
1. 无论端口是设置成输入还是输出,读端口都是读端口的引脚值。所以,如果一个引脚被设
置成输入,无论寄存器的值为多少,读的都是引脚的值而不是寄存器的值。
2. 一个引脚被设置成输出时,假设相应的数据锁存器值为1。如果该引脚接地短路,那么读
引脚的值始终为零。这对于建立容错系统非常有用,也利于处理I2C 总线冲突:在实现 I2C
协议时,对I2C 总线只驱动输出低电平,而要输出高电平时,将引脚置为三态。如果引脚
为低电平而您却没有驱动引脚输出,此时其它器件就会试图占用总线。
3. 所有中档系列的单片机都至少有一个漏极开路(或集电极开路)引脚。这类引脚只能输出
一个低电平或三态。对大多数中档单片机来说,该引脚是RA4。漏极开路引脚需要外接上
拉电阻,才能输出高电平。这个引脚对于驱动需非标准电源的负载非常有用。上拉电阻可
以连接到一个电源(其电压一般小于VDD),此时引脚就可以输出高电平。
问 3: PIC16CXXX 的RB0 引脚被设置成中断输入,但却无法产生中断。当我改变程序
来查询该引脚时,读到值为高电平而且运行良好。这是什么原因?
答3:
PORTB 在多数情况下是TTL 电平输入的,所以当有一个3V 电平输入( VDD = 5V)时,读端口的
结果将为1。然而RB0 引脚的中断缓冲器输入是施密特触发输入,它的高电平输入要求电压比
TTL的高电平输入要求电压要高。所以读RB0引脚为1,但却可能无法产生中断。RB0引脚中断采
用具有滞后效应的施密特触发器输入,可以降低噪声。引脚上输入的短噪声脉冲可能使数据产生
错误,这与噪声引起中断不是一回事。 问 4: 当我执行一条BCF 指令时,该端口的其它引脚都清零了,为什么?
答4:
1. 另举一个读-修改-写指令意外改变其它引脚值的例子:假设PORTC全部为输出,而且引脚
输出为低电平。在每一个端口引脚上有一接地的LED,这样引脚输出高电平时将点亮
LED。LED 旁并联了一个100 μF 的电容。同样假设单片机的运行速度非常快,比方说
20 MHz。现在依次将各个引脚的输出置“1”:BSF PORTC,0,然后BSF PORTC,1,再
BSF PORTC,2 等等,此时只有最后一个引脚被置“1”而且仅点亮最后一个LED。这是因
为电容充电需要时间。当某个引脚置“1”时,其前一个引脚并没有完成充电,所以对前
一个引脚的读结果为零。这个零被写回端口锁存器(记住:执行的是读- 修改- 写指令),
而使之前要置“1”的位清零。对端口进行高速连续地操作时,这通常只是一种可能,但
是它也会发生,所以也应将其考虑在内。
2. 如果使用的器件是PIC16C7XX,那么您可能没有在ADCON1 寄存器中正确地设置I/O 引
脚。如果一个引脚设置成模拟输入,那么无论引脚的电压为多少,读该引脚的结果均为零。
一般情况下,读的都是引脚上的输入状态,但这是一个特例。您可以通过TRIS 寄存器将
模拟输入引脚设置成输出,然后对其执行写操作来驱动该引脚输出高或低电平,但是读该
引脚时结果始终为零。因此执行读- 修改- 写指令(参见前面的问题)时,所有模拟引脚
均读为零,这些未被指令修改的读入值可以在端口锁存器中重新写为零。对于设置成模拟
输入的引脚,其引脚输入值可能既不是逻辑高电平也不是逻辑低电平,也不是浮动的。数
字引脚应禁止浮动输入,因为它可能导致输入缓冲器较大的工作电流,因此此时数字电平
的输入缓冲器被禁止了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-5-6 12:57 , Processed in 0.053813 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表