IO端口动态测试范例[/B] | HotPower 发表于 2004-8-22 10:08 侃单片机 ←返回版面 举报该贴 |
/* 本例程是以前发表的一个主题的关键部分
原主题为: <<如何保护IO管脚直接外接电源或地不烧毁?>>
本例程只给出了P1口的2种测试方法,其它PX基本同理.
本例程若加在某个定时器中断中,且在50mS时调用此2个函数(1个或2个) 将会实现对IO的实时检测,依据"理论"以后道来... */
/*------------------------------------ P1端口测试 主要测试管脚接电源或地及相临管脚的短路 -------------------------------------*/ unsigned char Port1Test(void) { unsigned char testval; P1 = 0x55;//奇数管脚发低电平 _nop_();//延时 testval = P1 ^ 0x55;//比较发送及接收结果 P1 = 0xaa;//偶数管脚发低电平 _nop_();//延时 testval |= P1 ^ 0xaa;//比较发送及接收结果(2次的) P1 = 0xff;//释放P1口,防止外部接入电源 return testval;//测试成功返回0 }
/*------------------------------------ P1端口扫描 实现Port1Test()的全部功能及任意管脚短路 -------------------------------------*/ unsigned char Port1Scan(void) { unsigned char scanval; unsigned char val; scanval = 0;//暂设为成功标志 if (P1 == 0xff) {//P1口未工作才测试 val = 0xfe;//从P1.0开始测起 CY = 1;//每次移入高电平 do{ P1 = val;//发送数据 _nop_();//延时 scanval = P1 ^ val;//比较发送及接收结果 P1 = 0xff;//释放P1口,防止外部接入电源 if (scanval) break;//P1管脚出错,立即退出 _rlcr_(val);//带进位位左移 } while (CY);//8位数据未移完继续 } return scanval;//测试成功返回0 }
| http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?id=1334940 |
IO端口保护及实时检测"理论依据"[/B] | HotPower 发表于 2004-8-22 10:47 侃单片机 ←返回版面 举报该贴 |
在一般MCU软件中,开机IO自检是常用的手段之一. 但开机IO自检的缺点是不能动态地捕捉运行中IO接地或电源问题. 在产品批量生产时的烤机过程中,芯片的损坏是很自然的事情. 而且有时用编程器烧写是好的芯片,但上机却因为IO端口的受损而不能正常使用. 特别是光板也存在着线路短路的问题...
由于以上种种原因的存在,IO端口保护及实时检测问题也应该受到重视...
在51中,由于采用准双向IO,这就给我们提供了一个可钻的空子!!!
地球人都知道准双向IO天生不怕IO接地,但它与其他双向IO一样输出也怕接电源!
但是,IO管脚直接外接电源被烧毁是有先决条件的,至少要满足一定的时间及温升. 这样才能将IO烧毁或"重残"... 这就是我们需要的"空子",即如果能保证在小于一定的时间内检测出来IO出错,就能成功地阻止IO短路造成的温升!!!
所以,迅速检测(发低电平),快速释放(发高电平即高阻),就是我们的"基本原则".
最后特别注意:
当某IO发低电平时,此IO接电源时,读回此IO的测试值为'1'.!!!!!!而非'0'.
|
|
IO端口保护的"后勤支援"[/B] | HotPower 发表于 2004-8-22 19:09 侃单片机 ←返回版面 举报该贴 |
在本主题中,最好采用串口进行显示,即通过串口报告IO端口动态测试的信息. 若用LED,则只需TXD,RXD连接74hc164.
这样,只要保证TXD,RXD这2个IO不出问题,则其他30个IO出现的问题都会被动态捕捉...
|
|
如果真要这样,可以修改函数以屏蔽此IO[/B] | HotPower 发表于 2004-8-23 00:25 侃单片机 ←返回版面 举报该贴 |
/*------------------------------------ P1端口测试(例P1.0平时为低) 主要测试管脚接电源或地及相临管脚的短路 -------------------------------------*/ unsigned char Port1Test(void) { unsigned char testval; P1 = 0x55;//奇数管脚发低电平 _nop_();//延时 testval = P1 ^ 0x55;//比较发送及接收结果 testval &= 0xfe;//屏蔽P1.0 P1 = 0xaa;//偶数管脚发低电平 _nop_();//延时 testval |= P1 ^ 0xaa;//比较发送及接收结果(2次的) P1 = 0xff;//释放P1口,防止外部接入电源 return testval;//测试成功返回0 } |
|
* - 本贴最后修改时间:2009-3-27 23:21:42 修改者:hotpower
IO端口动态测试范例
|
文章评论(0条评论)
登录后参与讨论