中斷顧名思義就是 先中斷目前的程序 優先處理突發的狀況

一般程式都是照編寫的順序執行程式

我們稱之為輪詢(polling)

當有些緊急的狀況發生時,

使用輪詢的方式可能會發生不可預期的問題

須使用中斷來優先處理

 

AVR的外部中斷有許多,這邊只簡單介紹INT0和INT1

 

※本文使用的晶片為Atmega128 

中斷暫存器.jpg

 

EIMSK 暫存器 

中斷INTX.jpg

 

INTx 中斷觸發方式,上升電平、下降電平、連續低電平等

觸發方式1.jpg

觸發方式2.jpg

 

EICRA EICRB 暫存器位置

ISC00 ISC01 為 INT0    ISC10 ISC11 為INT1 以此類推 至INT7

觸發暫存1.jpg

觸發暫存2.jpg

 

中斷使用方式

 

1.包含中斷的 .h檔

#include <avr/interrupt.h>

 

2.初始化中斷設置

EIMSK   //中斷的選擇

EICRA   //中斷觸發的條件

sei( )    //設定(全域)中斷開啟位元

 

3.中斷程式撰寫

ISR( )

 

假設使用按鈕模擬發生中斷,進而觸發中斷的程序

假設按鈕為PD2,

按鈕狀態改變INT0的狀態也會跟著變化

※下圖為其他擷取 不為Atmega128腳位

2.jpg

 

3.jpg

 

#include <avr/io.h>
#include <avr/interrupt.h>
  
 
//Interrupt Service Routine for INT0
ISR(INT0_vect)
{
  //中斷觸發時所需的處理
}	
 
int main(void)
{

	EISMK |= (1<<INT0);		// Enable INT0
	EICRA |= (1<<ISC00);	// Trigger INT0 on rising edge
 
	sei();				//Enable Global Interrupt
 
    while(1)
    {
	
    }
}

 

參考資料:

AVR C Programming of External Interrupt

AVR External Interrupts

arrow
arrow

    東勢厝滴yang 發表在 痞客邦 留言(210) 人氣()