AVR Tutorial: Interrupts
Transcription
AVR Tutorial: Interrupts
Interruptsystem AVR • Interrupt-Quellen: Extern, Timer, ADC, USART usw. (siehe IVT im Anhang) • Rücksprungadresse automatisch am Stack ◦ Stack im SRAM ◦ SP initialisieren • Interrupt-Kontrollregister im IO Space • Global Interrupt Enable Bit in SREG • sei(), cli() … setzt,löscht das I Flag • SREG wird nicht automatisch gesichert, vor dem Rücksprung muss der Status des Hauptprogramms wiederhergestellt werden • Mehrere Requests gleichzeitig: beim Aussprung aus ISR wird immer min. 1 Zyklus im Hauptprogramm abgearbeitet, bevor ein weiterer I ausgeführt wird • cli() wirkt schlagartig • nach sei() wird noch ein Befehl abgearbeitet, bevor anstehende Interrupts verarbeitet werden • Reaktionszeit auf einen Interrupt: Einsprung 4 Zyklen (Speichern der Rücksprungadresse, löschen des I Flags); Rücksprung auch 4 Zyklen • jede I-Quelle braucht ein zugehöriges Enable-Flag • Request Flag wird durch das Gerät gesetzt; ob die Anfrage einen Interrupt auch auslöst hängt davon ab, ob dieser Interrupt enabled ist und ob die Priorität hoch genug ist • SREG:I wird automatisch resetiert, wenn in die ISR gesprungen wird; wird automatisch wieder gesetzt, wenn aus der ISR zurückgesprungen wird. Im folgenden Code: ISR(TIMER2_OVF_vect){ cli(); } … würde also das i Flag automatisch wieder gesetzt • sei() innerhalb einer ISR->verschachtelte Interrupt-Aufrufe (jeder Interrupt darf die ISR unterbrechen); es gehen jedoch ein paar Zyklen verloren bis das sei() wirkt; braucht man es schneller, dann mit ISR(INT0_vect,ISR_NOBLOCK) {…} • Interrupt request flag löschen: eine 1 schreiben ◦ TIFR |= _BV(TOV0); /* wrong! */ simply use TIFR = _BV(TOV0); ◦ warum falsch: weil es länger dauert und TIFR = 00000010 die anderen Bits ohnehin nicht verändert (sie werden ja durch 0 nicht gelöscht) Interrupt Vector Table (IVT) • • Jede Interrupt-Quelle hat eine eigene ProgrammspeicherAdresse (= Interrupt Vector ) • Priorität geregelt nach der Anordnung innerhalb der IVT (Reset hat höchste Prio) • die Interrupts können an den Anfang des BOOTBereichs verschoben werden (IVSEL InterruptVector-Select-Flag oder BOOTRST Boot-Reset-Fuse) ◦ IVSEL … bewegt die IVT in Bootbereich, Reset-Adresse bleibt 0 ◦ BOOTRST … gesamte IVT (inkl. Reset) in Bootbereich • werden die Interrupts nicht benötigt, so kann der Speicherbereich der I-Vectortable für Programmcode genutzt werden • Interrupt-Arten 1. Ein Ereignis setzt ein Request-Flag ◦ Hardware resetiert das Request Flag ◦ Software kann das Request Flag auch löschen (Schreiben einer „1“) ◦ Request ohne Enable bleibt bestehen, bis Enable aktiviert oder Software-Reset ◦ stehen mehrere Requests an, entscheidet die eingebaute Priorität ◦ Einsprung I-Vektor 2. Trigger ohne Request Flag, solange die Interrupt-Bedingung erfüllt ist ◦ verschwindet der Request vor einem Enable, dann wird kein I ausgelöst ◦ e.g. level triggered external interrupt Externe Interrupts • Pins: INT0, INT1 oder PCINT23...0 • wird auch ausgelöst, wenn die Pins als Outputs geschaltet sind (Software-Interrupt) Pin Change Interrupt Pins PCINT23...0 • PCI2 … pin change interrupt … wird getriggert, wenn einer der Pins PCINT23..16 togglet • PCI1 … Pins PCINT14..8 togglet • PCI0 … Pins PCINT 7..0 togglet • Pin-Change Interrupts arbeiten asynchron, benötigen also keinen Takt, um aus einem Schlafmodus den uC aufzuwecken • PCICR pin change int control reg (allow PCI2/PCI1/PCI0) • PCMSK2,PCMSK1,PCMSK0 pin change mask register (ENABLE, allow single Pins) • PCIFR – Pin Change Interrupt Flag Register (REQUEST) Externe Interrupts INT0, INT1 • Modus: steigende Flanke, fallende Flanke, Pegel-Änderung und LOW Pegel löst aus • EICRA external int control register A (MODUS) • EIMSK – External Interrupt Mask Register (ENABLE) • EIFR – External Interrupt Flag Register (REQUEST) • LOW-Pegel Interrupt und Flankenerkennung-Interrupt arbeiten asynchron (wichtig für Aufwecken aus Sleep-Modi, weil dann evtl. kein Takt vorhanden ist) Programmierung • Abarbeitung eines Interrupts: ◦ Request ◦ Einsprung in den I-Vector (Rücksprungadresse automatisch vom Stack) ◦ Start der ISR (Register retten, abarbeiten, Register zurückladen, reti) ◦ Rücksprung aus der ISR (Rücksprungadresse automatisch vom Stack) • das Hauptprogramm darf von der Unterbrechung nichts mitbekommen, daher Status retten und wiederherstellen • in der ISR ist globales Intflag (SREG:I) automatisch gelöscht • Regel: ISR so schnell wie möglich verlassen • Datenaustausch mit main() über globale Variable • Unterbrechung verhindern: cli() uint8_t tmp_sreg = SREG; // Statusregister sichern cli(); ... SREG = tmp_sreg; // I-Flag wiederherstellen und nicht einfach cli(); … sei(); weil hier auf jeden Fall das I-Flag gesetzt wird • Serviceroutine #include <avr/interrupt.h> ISR(INT0_vect) { uint8_t _status = SREG; /* Interrupt Code */ SREG = _status; } Beispiel /* * kner 2015 * External Interrupt * a bouncing push button toggles a led * debounce ! * Atmega32 */ #include <avr/io.h> #include <avr/interrupt.h> #define LED 0 void setup(); //setup ports and interrupt control registers ISR(INT0_vect){ //I Flag is cleared if (bit_is_set(PORTC,LED)){ PORTC &= ~(1<<LED); } else { PORTC |= (1<<LED); } } int main(void) { setup(); while(1) { sei(); for (volatile int i = 0;i<10;i++ ); } } void setup(){ DDRD = 0; PORTD = 0b00000100; DDRC = 0x01; //PD.2 = INT0 Pin ==> Pullup //LED connected // falling edge on INT0 MCUCR |= (1<<ISC01); MCUCR &= ~(1<<ISC00); // enable INTO GICR |= (1<<INT0); } Anhang Interrupt Vector Table http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html Vector name ADC_vect ANALOG_COMP_0_vect ANALOG_COMP_1_vect ANALOG_COMP_2_vect ANALOG_COMP_vect ANA_COMP_vect CANIT_vect EEPROM_READY_vect EE_RDY_vect EE_READY_vect EXT_INT0_vect INT0_vect INT1_vect INT2_vect INT3_vect INT4_vect INT5_vect INT6_vect INT7_vect IO_PINS_vect LCD_vect LOWLEVEL_IO_PINS_vect OVRIT_vect PCINT0_vect PCINT1_vect PCINT2_vect PCINT3_vect PCINT_vect PSC0_CAPT_vect PSC0_EC_vect PSC1_CAPT_vect PSC1_EC_vect PSC2_CAPT_vect PSC2_EC_vect SPI_STC_vect Description ADC Conversion Complete Analog Comparator 0 Analog Comparator 1 Analog Comparator 2 Analog Comparator Analog Comparator CAN Transfer Complete or Error EEPROM Ready EEPROM Ready External Interrupt Request 0 External Interrupt 0 External Interrupt Request 1 External Interrupt Request 2 External Interrupt Request 3 External Interrupt Request 4 External Interrupt Request 5 External Interrupt Request 6 External Interrupt Request 7 External Interrupt Request 0 LCD Start of Frame Low-level Input on Port B CAN Timer Overrun Pin Change Interrupt Request 0 Pin Change Interrupt Request 1 Pin Change Interrupt Request 2 Pin Change Interrupt Request 3 PSC0 Capture Event PSC0 End Cycle PSC1 Capture Event PSC1 End Cycle PSC2 Capture Event PSC2 End Cycle Serial Transfer Complete SPM_RDY_vect SPM_READY_vect TIM0_COMPA_vect TIM0_COMPB_vect TIM0_OVF_vect TIM1_CAPT_vect TIM1_COMPA_vect TIM1_COMPB_vect TIM1_OVF_vect TIMER0_CAPT_vect TIMER0_COMPA_vect TIMER0_COMPB_vect TIMER0_COMP_A_vect TIMER0_COMP_vect TIMER0_OVF0_vect TIMER0_OVF_vect TIMER1_CAPT1_vect TIMER1_CAPT_vect TIMER1_CMPA_vect TIMER1_CMPB_vect TIMER1_COMP1_vect TIMER1_COMPA_vect TIMER1_COMPB_vect TIMER1_COMPC_vect TIMER1_COMPD_vect TIMER1_COMP_vect TIMER1_OVF1_vect TIMER1_OVF_vect TIMER2_COMPA_vect TIMER2_COMPB_vect TIMER2_COMP_vect TIMER2_OVF_vect TIMER3_CAPT_vect TIMER3_COMPA_vect TIMER3_COMPB_vect TIMER3_COMPC_vect TIMER3_OVF_vect TIMER4_CAPT_vect TIMER4_COMPA_vect TIMER4_COMPB_vect TIMER4_COMPC_vect TIMER4_OVF_vect TIMER5_CAPT_vect Store Program Memory Ready Store Program Memory Read Timer/Counter Compare Match A Timer/Counter Compare Match B Timer/Counter0 Overflow Timer/Counter1 Capture Event Timer/Counter1 Compare Match A Timer/Counter1 Compare Match B Timer/Counter1 Overflow ADC Conversion Complete TimerCounter0 Compare Match A Timer Counter 0 Compare Match B Timer/Counter0 Compare Match A Timer/Counter0 Compare Match Timer/Counter0 Overflow Timer/Counter0 Overflow Timer/Counter1 Capture Event Timer/Counter Capture Event Timer/Counter1 Compare Match 1A Timer/Counter1 Compare Match 1B Timer/Counter1 Compare Match Timer/Counter1 Compare Match A Timer/Counter1 Compare MatchB Timer/Counter1 Compare Match C Timer/Counter1 Compare Match D Timer/Counter1 Compare Match Timer/Counter1 Overflow Timer/Counter1 Overflow Timer/Counter2 Compare Match A Timer/Counter2 Compare Match A Timer/Counter2 Compare Match Timer/Counter2 Overflow Timer/Counter3 Capture Event Timer/Counter3 Compare Match A Timer/Counter3 Compare Match B Timer/Counter3 Compare Match C Timer/Counter3 Overflow Timer/Counter4 Capture Event Timer/Counter4 Compare Match A Timer/Counter4 Compare Match B Timer/Counter4 Compare Match C Timer/Counter4 Overflow Timer/Counter5 Capture Event TIMER5_COMPA_vect TIMER5_COMPB_vect TIMER5_COMPC_vect TIMER5_OVF_vect TWI_vect TXDONE_vect TXEMPTY_vect UART0_RX_vect UART0_TX_vect UART0_UDRE_vect UART1_RX_vect UART1_TX_vect UART1_UDRE_vect UART_RX_vect UART_TX_vect UART_UDRE_vect USART0_RXC_vect USART0_RX_vect USART0_TXC_vect USART0_TX_vect USART0_UDRE_vect USART1_RXC_vect USART1_RX_vect USART1_TXC_vect USART1_TX_vect USART1_UDRE_vect USART2_RX_vect USART2_TX_vect USART2_UDRE_vect USART3_RX_vect USART3_TX_vect USART3_UDRE_vect USART_RXC_vect USART_RX_vect USART_TXC_vect USART_TX_vect USART_UDRE_vect USI_OVERFLOW_vect USI_OVF_vect USI_START_vect USI_STRT_vect USI_STR_vect WATCHDOG_vect Timer/Counter5 Compare Match A Timer/Counter5 Compare Match B Timer/Counter5 Compare Match C Timer/Counter5 Overflow 2-wire Serial Interface Transmission Done, Bit Timer Flag 2 Interrupt Transmit Buffer Empty, Bit Itmer Flag 0 Interrupt UART0, Rx Complete UART0, Tx Complete UART0 Data Register Empty UART1, Rx Complete UART1, Tx Complete UART1 Data Register Empty UART, Rx Complete UART, Tx Complete UART Data Register Empty USART0, Rx Complete USART0, Rx Complete USART0, Tx Complete USART0, Tx Complete USART0 Data Register Empty USART1, Rx Complete USART1, Rx Complete USART1, Tx Complete USART1, Tx Complete USART1, Data Register Empty USART2, Rx Complete USART2, Tx Complete USART2 Data register Empty USART3, Rx Complete USART3, Tx Complete USART3 Data register Empty USART, Rx Complete USART, Rx Complete USART, Tx Complete USART, Tx Complete USART Data Register Empty USI Overflow USI Overflow USI Start Condition USI Start USI START Watchdog Time-out WDT_OVERFLOW_vect WDT_vect Watchdog Timer Overflow Watchdog Timeout Interrupt