原创 IO端口动态测试范例

2006-12-30 01:27 4552 9 9 分类: MCU/ 嵌入式
IO端口动态测试范例
mood25.gif 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端口保护及实时检测"理论依据"
mood25.gif 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端口保护的"后勤支援"
mood25.gif HotPower 发表于 2004-8-22 19:09 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


在本主题中,最好采用串口进行显示,即通过串口报告IO端口动态测试的信息.
若用LED,则只需TXD,RXD连接74hc164.

这样,只要保证TXD,RXD这2个IO不出问题,则其他30个IO出现的问题都会被动态捕捉...


如果真要这样,可以修改函数以屏蔽此IO
mood25.gif 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
}
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条