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