pic16f877a的電平變化中斷(interrupt on change)使用誤區(qū)
工作原理:RB4:RB7是電平變化中斷的引腳的輸入狀態(tài)和上一次讀取PORTB的鎖存器的值進行比較,當兩組數(shù)據(jù)相異時,發(fā)生中斷同,當這四個引腳的一部分發(fā)生電平變化時,將會最后取或,只要有一個引腳的輸入狀態(tài)發(fā)生變化,就會發(fā)生中斷改變。
本文引用地址:http://butianyuan.cn/article/201612/325228.htm注意:在進入中斷服務子程序時,一定要讀取或寫入PORTB鎖存器的值,這樣才會結束兩組數(shù)據(jù)的比較,然后再去清除中斷標志位。如果沒有讀取PORTB的值,兩組數(shù)據(jù)的比較一直存在,先清除中斷標志(RBIF)是沒有用的,RBIF也會一直被設定。如下面的例子:
/*這是一個用INT中斷和電平變化中斷計光電編碼器(碼盤)的讀數(shù)*/
void
interrupt on_change()
{
if(INTF)
{
f_r++;
INTF=0;
}
if(RBIF&&RB4) //高電平計數(shù)
{
RB4=~RB4;//先讀取或寫入PORTB鎖存器的值
f_l++;
RBIF=0;//后清除中斷標志(RBIF)
}
else {RB4=~RB4; RBIF=0;}//低電平時
}
下面的程序就是我們在試驗中一直困擾的問題,就是出不了中斷。
錯誤用法,沒有讀取鎖存器的值
void
interrupt on_change()
{
if(INTF)
{
f_r++;
INTF=0;
}
if(RBIF&&RB4)
{
f_l++;
RBIF=0;//
}
else {RBIF=0;}
}
評論