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

Documents pareils