色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > pic16f877a的電平變化中斷(interrupt on change)使用誤區(qū)

          pic16f877a的電平變化中斷(interrupt on change)使用誤區(qū)

          作者: 時間:2016-12-03 來源:網(wǎng)絡(luò) 收藏
          在PORTB的RB4:RB7是電平變化中斷interrupt on change),要使用它,將它們引腳對應(yīng)于TRISB的位設(shè)定為輸入是必須的,然后配置中斷。

          工作原理:RB4:RB7是電平變化中斷的引腳的輸入狀態(tài)和上一次讀取PORTB的鎖存器的值進(jìn)行比較,當(dāng)兩組數(shù)據(jù)相異時,發(fā)生中斷同,當(dāng)這四個引腳的一部分發(fā)生電平變化時,將會最后取或,只要有一個引腳的輸入狀態(tài)發(fā)生變化,就會發(fā)生中斷改變。

          本文引用地址:http://cafeforensic.com/article/201612/325228.htm

          注意:在進(jìn)入中斷服務(wù)子程序時,一定要讀取或?qū)懭隤ORTB鎖存器的值,這樣才會結(jié)束兩組數(shù)據(jù)的比較,然后再去清除中斷標(biāo)志位。如果沒有讀取PORTB的值,兩組數(shù)據(jù)的比較一直存在,先清除中斷標(biāo)志(RBIF)是沒有用的,RBIF也會一直被設(shè)定。如下面的例子:

          /*這是一個用INT中斷和電平變化中斷計光電編碼器(碼盤)的讀數(shù)*/

          void
          interrupt on_change()
          {
          if(INTF)
          {
          f_r++;
          INTF=0;
          }
          if(RBIF&&RB4) //高電平計數(shù)
          {
          RB4=~RB4;//先讀取或?qū)懭隤ORTB鎖存器的值
          f_l++;
          RBIF=0;//后清除中斷標(biāo)志(RBIF)
          }
          else {RB4=~RB4; RBIF=0;}//低電平時

          }

          下面的程序就是我們在試驗(yàn)中一直困擾的問題,就是出不了中斷。

          錯誤用法,沒有讀取鎖存器的值

          void
          interrupt on_change()
          {
          if(INTF)
          {
          f_r++;
          INTF=0;
          }
          if(RBIF&&RB4)
          {
          f_l++;
          RBIF=0;//
          }
          else {RBIF=0;}

          }



          評論


          技術(shù)專區(qū)

          關(guān)閉