Beruflich Dokumente
Kultur Dokumente
Unter einem Interrupt kann man sich einen durch Hardware ausgelsten
Unterprogrammaufruf vorstellen.
Aufgrund einer Interruptanforderung wird das laufende Programm unterbrochen und
das hierfr vorgesehene Unterprogramm ausgefhrt. Danach wird das unterbrochene
Programm an der Unterbrechungsstelle wieder fortgesetzt.
Interrupts werden bei Mikrocontrollern dazu eingesetzt, um auf uere und interne
Systemzustnde augenblicklich reagieren zu knnen. So kann zum Beispiel in einem
gesteuerten Prozess ein gefhrlicher Betriebszustand eintreten oder ein interner
Prozessorzustand erfordert eine Reaktion, zum Beispiel beim Empfang von Daten an
der seriellen Schnittstelle.
Ein Programm mit Interruptsteuerung hat folgende Merkmale:
Es muss eine Interrupt-Service-Routine vorhanden sein (das auszufhrende
Unterprogramm)
Die Interruptsteuerung muss an Anfang des Hauptprogramms aktiviert worden sein.
Die folgenden Ereignisse knnen einen Interrupt auf einem AVR ATmega32 auslsen,
wobei die Reihenfolge der Auflistung auch die Prioritt der Interrupts entspricht:
Das Makro sei() schaltet die Interrupts ein. Eigentlich wird nichts anderes gemacht,
als das Global Interrupt Enable Bit im Status Register gesetzt.
Das Makro cli() schaltet die Interrupts aus, oder anders gesagt, das Global
Interrupt Enable Bit im Status Register wird gelscht.
Die Interrupt-Service_Routinen heien alle ISR und haben als Parameter fr den
betreffenden Interrupt einen Interruptvektor.
Mit Hilfe des Interruptvektors sorgt der Compiler dafr, dass die ISR an der
richtigen Interrupt-Einsprungadresse im Controller platziert wird.
Damit eine ISR aufgerufen werden kann, muss der Interrupt im Hauptprogramm
aktiviert werden. Diese Aktivierung besteht aus der Aktivierung des jeweiligen
Interrupts und aus der allgemeinen Interruptfreigabe mit sei();
INT0_vect
INT1_vect
INT2_vect
TIMER2_COMP_vect
TIMER2_OVF_vect
TIMER1_CAPT_vect
TIMER1_COMPA_vect
TIMER1_COMPB_vect
TIMER1_OVF_vect
TIMER0_COMP_vect
TIMER0_OVF_vect
SPI_STC_vect
USART_RXC_vect
USART_UDRE_vect
USART_TXC_vect
ADC_vect
EE_RDY_vect
ANA_COMP_vect
TWI_vect
SPM_RDY_vect
Beispiel 1:
Interruptgesteuerte Fugngerampel mit dem externen Interrupt INT0:
Die Abbildung zeigt die Lage der Pin-Anschlsse der externen Interrupts
INT0, INT1 und INT2.
Initialisierung von INT0:
GICR|=(1<<INT0); // INT0 enable im General Interrupt Control Register
MCUCR|=(1<<ISC01)|(1<<ISC00); //Steigende Flanke lst aus
sei();
Die Interrupt-Service-Routine:
Die ISR wird automatisch aufgerufen, wenn ein Fugnger beim Drcken der
Ruftaste an PD2 eine ansteigende Signalflanke erzeugt.
ISR(INT0_vect){
uint8_t n;
for(n=0;n<6;n++){
PORTC=sampel[n];
PORTD=fampel[n];
warten_ns(zeit[n]);
}
}
//---------------------------------------------------------------int main(void){
FussgaengerAmpel_init();
while(1);//Endlosschleife, die nichts macht
return 0; }
Beispiel 2
Software-Uhr mit Timer/Counter0 im CTC-Mode
(CTC: Clear Timer On Compare Match)
Timer/Counter0 Compare Match Interrupt:
Im Timer Interrupt Masken Register muss das Bit OCIE0 = 1 gesetzt werden.
(OCIE0 : Output Compare Interrupt Enable 0)
Stellt man nun das Register OCR0 auf 249, so wird das Zhlregister TCNT0
125-mal in der Sekunde zurckgesetzt (31250/250=125).
Damit knnen 125 OutputCompare0-Interruptsausgelst werden, die das Timing
einer Softwareuhr bewirken
void uhrzeit_anzeigen(void){
lcd_gotoxy(0,0);lcd_putui_0(stunde,2);
lcd_putc(':'); lcd_putui_0(minute,2);
lcd_putc(':'); lcd_putui_0(sekunde,2);
}
void main(){
lcd_init(12);
TIMER0_interrupt_init();
do{
uhrzeit_anzeigen();
}while(1);