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

2021-01-05 電子產品世界

在PORTB的RB4:RB7是電平變化中斷interrupt on change),要使用它,將它們引腳對應於TRISB的位設定為輸入是必須的,然後配置中斷。

工作原理:RB4:RB7是電平變化中斷的引腳的輸入狀態和上一次讀取PORTB的鎖存器的值進行比較,當兩組數據相異時,發生中斷同,當這四個引腳的一部分發生電平變化時,將會最後取或,只要有一個引腳的輸入狀態發生變化,就會發生中斷改變。

本文引用地址:http://www.eepw.com.cn/article/201612/325228.htm

注意:在進入中斷服務子程序時,一定要讀取或寫入PORTB鎖存器的值,這樣才會結束兩組數據的比較,然後再去清除中斷標誌位。如果沒有讀取PORTB的值,兩組數據的比較一直存在,先清除中斷標誌(RBIF)是沒有用的,RBIF也會一直被設定。如下面的例子:

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

void
interrupt on_change()
{
if(INTF)
{
f_r++;
INTF=0;
}
if(RBIF&&RB4) //高電平計數
{
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;}

}


相關焦點

  • PIC16F877A TIMER1計數操作
    /**********************Title:PIC16F877A TIMER1計數操作Author:hnrainDate:2010
  • 基於PIC16F877單片機的簡易測速計設計方案
    本文將基於PIC16F877 單片機的捕捉功能來完成脈衝計數,利用軟體編程實現相關物理關係的轉換,最終得出齒輪線速度,並顯示在數碼管上。  1 測速計原理  1.1 CCP1 捕捉功能  PIC16F877 單片機中有兩個CCP 模塊,其構造基本相同,分別記為CCP1 和CCP2.每個CCP 模塊可以任意配置為捕捉(Capture)、比較(Compare) 和脈寬調製(PWM)3 個功能模式之一。
  • C51中斷(void timer1(void) interrupt 3 using 3)
    IT0,IT1:外部中斷0,1觸發方式選擇位,由軟體設置;1→下降沿觸發方式,INT0/INT1管腳上高到低的負跳變可引起中斷;0→電平觸發方式, INT0/INT1管腳上低電平可引起中斷..七,中斷說明中斷不允許用於外部函數,它對函數目標代碼影響如下z·當調用函數時,SFR中的ACC,B,DPH,DPL和PSW(當需要時)入錢;.如果不使用寄存器組切換,甚至中斷函數所需的所有工作寄存器都入錢;.函數退出前,所有的寄存器內容出錢;·函數由8051的指令"RETI"終止.中斷服務程序使用的任何程序也使用同一寄存器組.
  • 關於PIC16F877A串口發送任意字符串的問題
    以前在使用51系列的單片機的時候,下面兩個函數使用起來完全沒有問題,一個是發送單個字符的,一個是發送任意長度字符串的。TRMT);TRMT = 0 ; //必須寫,不然有可能產生錯誤數據發送}//向串口發送一個字符串void send_string_com(uchar *str){uint16 k= 0 ;do{send_char_com(*(str + k));k++;
  • PIC16F877A.H頭文件詳細注釋
    /**Header file for the Microchip*PIC 16F873A chip*PIC 16F874A chip*PIC 16F876A chip*PIC 16F877A chip*Midrange Microcontroller*/本文引用地址:http://www.eepw.com.cn/article/
  • Linux中斷(interrupt)子系統之一:中斷系統基本原理
    在smp系統中,cpu之間也通過IPI(inter processor interrupt)中斷進行通信。  2. IRQ編號  系統中每一個註冊的中斷源,都會分配一個唯一的編號用於識別該中斷,我們稱之為IRQ編號。IRQ編號貫穿在整個Linux的通用中斷子系統中。
  • PIC16F877A DS1302晶片驅動
    本文引用地址:http://www.eepw.com.cn/article/201808/384806.htm本文大體介紹了PIC16F877A DS1302晶片驅動#includetypedefsck_l;//低電平時數據線可變if(dat0x01)io_h;elseio_l;sck_h;dat>>=1;}}uchar BCDtoDex(uchar dat)//BCD碼轉十進位{uchar i;i=dat/16
  • 在Linux設備樹(DTS)中指定中斷_在代碼中獲得中斷
    假設GPIO1有32個中斷源,但是它把其中的16個匯聚起來向GIC發出一個中斷,把另外16個匯聚起來向GIC發出另一個中斷。這就意味著GPIO1會用到GIC的兩個中斷,會涉及GIC裡的2個hwirq。這些層級關係、中斷號(hwirq),都會在設備樹中有所體現。
  • PIC16F877驅動DS1302晶片
    TimeString[7] = Time->Second%10 + 0;// Time->DateString[8] = /0;}下面是測試程序#include "main.h"#include "ds1302.h"void init_all(){init_ds1302() ;}void interrupt
  • ARM11---中斷---向量中斷控制器(VIC)---結合s3c6410
    5.在B4,PL192 VIC得到IRQACK 高電平信號,然後把IRQADDR改成IRQB的ISR地址。 6.在B6階段,VIC發出IRQADDRV信號(置高),IRQADDRV在處理器得到正確的ISR地址之前,一直是高電平,在這期間,就算來個更高優先級的中斷要置高!不然IRQB這次中斷就 丟失了。
  • Linux中斷機制:硬體處理,初始化和中斷處理
    其功能是:把外部設備的中斷請求,翻譯為local APIC的interrupt message,並按照配置的vector,發送給指定的local APIC處理(在SMP系統,存在多個CPU,也就有多個local APIC)。通常的配置方式是:第一個I/O APIC的前16個管腳,配置來處理之前的ISA IRQs,其它外設比如PCI設備,則直接使用其他管腳連接。
  • Linux中斷機制:硬體處理、初始化和中斷處理
    其功能是:把外部設備的中斷請求,翻譯為local APIC的interrupt message,並按照配置的vector,發送給指定的local APIC處理(在SMP系統,存在多個CPU,也就有多個local APIC)。通常的配置方式是:第一個I/O APIC的前16個管腳,配置來處理之前的ISA IRQs,其它外設比如PCI設備,則直接使用其他管腳連接。
  • stm32與pic單片機比較_哪個好
    2、當置位1時為輸入狀態,且不管該腳呈高電平或低電平,對外均呈高阻狀態;置位0時為輸出狀態,不管該腳為何種電平,均呈低阻狀態,有相當的驅動能力,低電平吸入電流達25mA,高電平輸出電流可達20mA。相對於51系列而言,這是一個很大的優點   3、它可以直接驅動數碼管顯示且外電路簡單。它的A/D為10位,能滿足精度要求。具有在線調試及編程(ISP)功能。
  • AVR單片機C語言的使用特點
    =0時輸出低電平,DDRx=0時,I/O口輸入,這時要讀取外部管腳的電平就應讀取PINx中的數值,而不是PORTx;PORTx是數據寄存器,而PINx不能稱為真正意義上的寄存器,更像是一個可控的三態口引用 幾種單片機C語言的中斷程序寫法本文引用自Ajiao《幾種單片機C語言的中斷程序寫法》引用Ajiao的 幾種單片機
  • 單片機定時器中斷實現長時間定時程序
    單片機定時器中斷實現長時間定時程序#include<reg51.h> // 包含51單片機寄存器定義的頭文件
  • S3C2410中斷機制及相關寄存器介紹
    ARM920T能處理8個類型的中斷,他們分別是:>Reset:當處理器的復位電平有效時,產生復位異常,程序跳轉到復位處理程序執行。>Undefined instruction:當處理器遇到不能處理的指令時產生未定義指令中斷。
  • 控制IO埠 s3c2410_gpio_setpin()的使用
    _0,IRQF_SHARED,IO_DEVICE_NAME,1);//註冊中斷0if(ret<0){printk("IRQ%dcannotrequest/n",IRQ_EINT0);returnret;}ret=request_irq(IRQ_EINT2,io_interrupt_2,IRQF_SHARED,IO_DEVICE_NAME,1);//註冊中斷2if(ret<0){printk
  • AVRGCC/WinAVR編譯環境中斷函數的使用方法
    早期版本的avr-libc 對中斷服務程序的書寫提供了兩個宏SIGNAL 和INTERRUPT,並且需要包含兩個頭文件:avr/signal.h 和avr/interrupt.h。
  • PIC16F72 Timer1 使用
    PIC16F72 定時器1使用,程序執行結果,LED一閃一閃。使用到的寄存器具體請看datasheet本文引用地址:http://www.eepw.com.cn/article/201611/316070.htm#include __CONFIG(11111110111001);//bit13-bit7=1;bit6 欠壓使能(1 enable);bit5=1;bit4 代碼保護(0保護);//bit3