PIC单片机引脚中断程序的设计技巧
经验交流
PIC单片机引囊中断程序的设计技巧
?山东省宁阳一中殷建彬
1简述
所有的中档系列PIC单片机,PORTB端口最高的4 个引脚(RB7,RB4)在设为输入模式时,当输入电平由高 到低或由低到高发生变化时,可以让单片机产生中断.这 就是通常所说的引脚状态变化中断.
在设计引脚中断程序时,有三个需要特别注意的地 方.一是,在清除P0RTB中断标志位RBIF之前,必须安
以PORTB端口数据寄存器PORTB 排一条必不可少的,
为源寄存器的读操作指令.放置这一指令的目的有时并 不只是为了读取有用的数据,而是为了取消状态变化的硬 件信号,以便顺利清除RBIF标志位,为下一次中断做好 准备.二是,由于端口PORTB是引脚电平变化中断,即 无论引脚出现上升沿还是下降沿都会产生中断请求,所以 必须处理好不需要的虚假中断.三是,一般都利用PIC单 片机的引脚功能来检测按键,所以必须处理好按键消抖的 问题.
2引脚中断程序设计
在主程序里先设置有关的寄存器.
?设置TRISB寄存器,使RB7,RIM相关的引脚处 于输入状态;
?如果需要弱上拉,通过OPTION—REG的第7位 设置;
?RBIF一0;
?RBIE一1;
?GIF一1.
响应状态变化后的中断服务程序.
?检查RBIF是否为1,为1则是引脚变化引起的 中断;
?调用延时程序,延时20,30ms,目的是为了按键 去抖;
?判断是引脚出现上升沿还是下降沿引起的中断; ?调用按键处理程序;
?读PORTB口的值,取消状态变化的硬件信号; ?清除RBIF标志.
笔者认为上面程序设计最大的问题是在中断程序里 调用延时程序.大家知道,中档PIC单片机只有8层深度 的硬件堆栈,在中断里调用子程序出现极易堆栈溢出的情 况.另外,PIC单片机中断程序入口只有一个,在响应中 断的请求时,PIC单片机就会自动把全局中断的使能位 (INTCON的第7位GIF)清除,这样其他中断就暂时不能 被响应(此时,如果别的中断发出的中断请求,标志位将一 直保留着),直到这个中断程序退出后才会得到响应.这 就要求我们设计中断程序的时候必须尽量短,避免调用子 程序,更不要在中断里进行复杂的运算.
下面给出笔者设计程序时的思路.
当引脚状态变化引起中断时,在中断子程序里首先判 断引起中断的原因是不是我们需要的变化引起的中断. 如果是,不要在这里延时,而是设置一个标志位,接着清除 中断标志,退出中断.中断程序如下:
elseif((RBIE&RBIF)一一1){//如果引脚变化引起中断 if(RIM一一O){//RIM上的按钮接地
key=1;//按键标志位置位
}
RBIF=0;//清除引脚中断标志位
}
其中,if(RB4一一0)语句相当于读取了P0RTB端口 数据寄存器,取消了状态变化的硬件信号. 下面详细介绍怎么样进行按键去抖.
首先,在定时器中断里设置一个1ms的时间基准标 志位"SYSlms",每到1ms,"SYSlms"便置位.程序如下: unsignedcharcount;
if((TOIE&TOIF)一一1){//定时器中断
TMR0+一0x09;//每250s中断一次
if(count=一4){
count=0;
SYSlms=1;//系统时间标志
}
count++0
—lMicr0c0ntr011ers&EmbeddedSystems69
TOIF一0://清除时钟中断标志位
有了这个时间基准,便可以在主程序里进行按键去抖 处理了.为了更好地利用这个时间基准,定义一个消息标 志SYSTime,笔者把它称作时间消息.为了让这个消息 有自我发布和自我消失的功能,定义了如下一个宏: bitSYSTime;
#defineTimeEnable()SYSTime一0;if(SYSlms){SYSTime一 1;SYSlms=0;)
可以把TimeEnable()放到主程序死循环的任何地 方,每当程序执行这个宏,SYSTime就会清零,这就是标 志位的自我消失.如果在定时器时间基准标志位 SYS1ms已经置位的话,SYSTime就会置1,这样别的程
序就可以利用这个时间消息了,这就是消息的自我发布.
下面就是利用这个时间消息来进行按键延时去抖的,首先
看一下按键扫描子程序:
voidscankey(){ unsignedcharKeyTime,KeyTask;//定义任务时间参数,
ff任务参数
switch(KeyTask){ case0:if(key){ KeyTime=30}//准备延时30ms KeyTask++;//准备好下一个任务
key=0;
)
break;
case1:KeyTime--一;//延时30ms if(KeyTime=一O)KeyTask++; break;
case2:if(RB4一一0){
//调按键处理程序
KeyTask=0;
)
elseKeyTask=0;//退出任务
break;
)
)
在主程序的死循环中这样用:
while(1){
TimeEnable();
If(SYSTime=一1){scankey();) //在此可以添加其他程序
)
只有有时间消息的时候才执行按键扫描程序.可以 看到,进入扫描程序执行第一次的时候,程序首先判断按 键标志位有没有置位,置位的话(也就是有按键按下的 话),任务时间参数(KeyTime)赋值为3O,这是延时30ms 去抖,当然你也可以设置为其他的时间值;同时任务参数 (KeyTask)加1.1ms后,再进入扫描程序,这个时候扫 描程序执行case1的语句,这样3O次后(延时了30ms), 任务参数(KeyTask)加1,值为2.1ms后,再进入扫描程 序,将执行case2的语句,首先在这里再次判断是不是按 键还在按下,如果是就调按键的处理程序,如果不是,就退 出按键扫描程序.在这里,还可以加入按键是否抬起的判 断程序.
这样设计的引脚变化程序,CPU开销小,效率高,不 会出现堆浅溢出的问题,提高了系统的实时性.一 (收稿日期:2005—01—17)
-
实验时,摄像头的分辨率调整为320×240,两个 GPRS收发器分别在相距4rtl左右的房间两端,图5显示 了实验结果.实验结果
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
明:基于GPRS移动通信网络和 图5图像采集实验结果
DSP技术的半自主移动机器人远程系统达到了预期的效 果.同时在实验中也发现,GPRS传输数据的实时性是有 限的,虽然理论上传输速率高达171kb/s,但实际上受多 种因素的影响,实际速率较低,传输一帧3K的JPEG格式 图像大约需要30,60S的时间.因此,如何进一步提高 系统的实时性是本系统面临的最大挑战.?
参考文献
1丹尼斯?克拉克,迈克尔?欧文斯.机器人设计与控制.宗 光华,张慧慧译.北京:科学出版社,2004
2韩斌杰.GPRS原理及网络优化.北京:机械工业出版社,2003 3何苏勤,王忠勇.TMS320C2000系列DSP原理及实用技术. 北京:电子工业出版社,2003
4中国联通公司.中国联通CDMA直放站统一监控管理
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
规范. (收稿日期:2005—04—04)
70平疗缸嵌入禾'毛应两l?_