INT外部中斷是幾乎所有通用單片機,嵌入機中都會帶有的,早期的51系列和arm系列也都有,然而大多數(shù)因為設計原因,多只有帶兩個INT,最近別人提到了一個“所有端口都可以外部中斷”這樣的說法,因為表示存疑,因此找了些資料,也就找到了avr328p自帶的PCINT引腳功能
INT外部中斷和AVR和PCINT具體區(qū)別如下:
差別1. INT限制在了兩個端口上面,而PCINT則是所有接口都具備。
差別2. INT具有上沿,下沿,低電平,高電平觸發(fā)這幾種模式,而PCINT只有測量電平的變化這一個模式。
差別3. INT可以了解具體是哪個口觸發(fā)的,而PCINT不行。
差別4. PCINT不會直接跳轉入指定的程序,用戶需要讀取寄存器來做判斷是哪個PCINT端口產生了變化。
差別5. INT0和INT1各自可配置一個中斷程序入口,而所有的PCINT都只會觸發(fā)跳轉進入一條指定的程序。
提供一道avr環(huán)境下的PCINT相關代碼與注釋,代碼功能是初始化三個PCINT
參考地址:https://sites.google.com/site/qeewiki/books/avr-guide/external-interrupts-on-the-atmega328
#include
#include// 頭文件,內含了uint8的聲明
#include// Needed to use interrupts
volatileuint8_t portbhistory = 0xFF;// default is high because the pull-up
int main(void)
{
DDRB &= ~((1 << DDB0) | (1 << DDB1) | (1 << DDB2));//拉低PB0,1,2三個口的電平
// PB0,PB1,PB2 (PCINT0, PCINT1, PCINT2 pin)現(xiàn)在處于輸入態(tài)
PORTB |= ((1 << PORTB0) | (1 << PORTB1) | (1 << PORTB2));//開啟上拉
// PB0, PB1, PB2 現(xiàn)在處于上拉輸入狀態(tài)下
PCICR |= (1 << PCIE0);//設置 PCIE0以啟用 PCMSK0 偵測
PCMSK0 |= (1 << PCINT0);//設置 PCINT0 來測量狀態(tài)變化并產生中斷
sei();// turn on interrupts
while(1)
{
}
}
ISR (PCINT0_vect)
{
uint8_t changedbits;//設立一個無符號整數(shù)來記錄寄存器的變化
changedbits = PINB ^ portbhistory;
portbhistory = PINB;
if(changedbits & (1 << PINB0))
{
}
if(changedbits & (1 << PINB1))
{
}
if(changedbits & (1 << PINB2))
{
}
}
結論:
PCINT在當年的設計中堪稱創(chuàng)新,但和所謂的全端口外部中斷依然有一定差距,但相對于按鍵掃描等方式來說,依然有一部分中斷服務的優(yōu)勢





