Atmega Interrupts Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös
Inhaltsverzeichnis Vorbereitung Was Sind Interrupts Interruptvektoren Software Interrupts Hardware Interrupts Quellen 2
Vorbereitung Rechner haben manchmal die Aufgabe mit Ihrer Umgebung zu kommunizieren: Empfang und Übertragung von Daten Messdaten Verarbeitung Knopfdruck Abwarten Zu bestimmten Schwellenwerten reagieren... Ein gutes Beispiel wäre die Strg+Alt+Entf Tastenkombinition Die (BS abhängig) der Rechner neustartet, abgestürtzte Programme beendet, oder Programme mit hoher Priorität öffnet (Wie der Task-Manager). 3
Wie kann der Rechner Sinnvollerweise diese Ereignisse abhandeln? 4
Was Sind Interrupts Interrupts ermöglichen dem Microcontroller auf bestimmte Ereignisse zu reagieren In diesem Prozess wird den Programmablauf angehalten, der Microcontroller führt einen Codeblock aus der zu diesem Ereignis vorprogrammiert ist. Nachdem dieses Ereignis abgehandelt wurde, springt das Programm zurück zu der Stelle wo es angehalten wurde. 5
In Detail : 1. Sobald ein Interrupt scharf ist, führt der Prozessor den aktuellen Befehl bis zum Ende aus. 2. Die Adresse des nächsten Befehls, die sich jetzt in Befehlszähler befindet, wird im Stack gespeichert. 3. Der Prozessor lädt die Adresse des Interrupt-Vectors in Befehlszähler und führt die entsprechende Befehle aus. 4. Der Prozessor lädt die Adresse aus dem Stack wieder und führt die nachfolgende Befehle aus. 6
Interruptvektoren Beim auftreten eines Interrupts wird an die Adresse des entsprechenden Interruptsvektors gesprungen. An dieser Stelle steht die Interrupt Service-Routine (ISR) die den Interrupt beantwortet. Atmega16 hat 17 interne- und 4 externe Interrupts : 7
Software Interrupts AVR Mikrocontroller besitzen 17 interne Interruptverktoren Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie z.b Timer und ADC. Atmega16 hat zwei 8-bit Timer und einen 16-bit Timer. 8
Beispiel : (16-bit Timer) #include <avr/io.h> #include <avr/interrupt.h> ISR(TIMER1_COMPA_vect){ PORTB ^= 1<<PINB0; //die LED blinkt in 1 Sekunde takt } int main(void){ sei(); // Interrupts zur Verfügung stellen DDRB = 1 << PINB0; // PIN 0 von Port B als Ausgang definieren TIMSK = 1<< OCIE1A; // Timer Interrupt aktivieren //hier wird der interne Timer skaliert : 1000000/64 = 15625 TCCR1B = 1<<CS10 1<<CS11 1<<WGM12; //Timer frequenz = 15625 -> wenn Timer = OCR1A an Interrupt springen } OCR1A = 15624; //nach 15624 Ticks ist eine Sekunde vegangen und Timer = //OCR1A-> springen while (1){ } 9
Hardware Interrupts Der Atmega16 besitzt 4 Interruptvektoren die Hardware Interrupts realisieren. In dem folgenden Beispiel werde ich an INT0 ein Schalter anschließen. Wenn betätigt wird die LED an PIN0 von PORTA an-/ausgeschaltet. Ein Pull down Widerstand wird eingesetzt. 10
11
Wichtige Register : GISR : MCUCR: 12
Programm Code in C : #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> ISR(INT0_vect){ PORTA ^= 1<<PINA0; //die LED wird umgeschaltet } int main(void){ sei(); // Globale Interrupts zur Verfügung stellen DDRA = 1 << PINA0; // PIN 0 von Port A als Ausgang setzen GICR =(1<<INT0); //INT0 bereitstellen. MCUCR =(3<<ISC00); //INT0 für steigende Flanken einstellen } while (1){ } 13
Programm Code in Assembler:.include "m8def.inc".def temp = r16.org 0x000 rjmp main ; Reset Handler.org INT0addr rjmp int0_handler ; IRQ0 Handler main: ; hier beginnt das Hauptprogramm ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, 0x00 out DDRD, temp ldi temp, 0xFF out DDRB, temp ldi temp, (1<<ISC01) (1<<ISC00) ; INT0 auf steigende Flanke konfigurieren out MCUCR, temp ldi temp, (1<<INT0) ; INT0 aktivieren out GICR, temp sei ; Interrupts allgemein aktivieren loop: rjmp loop ; eine leere Endlosschleife int0_handler: sbi PORTB, 0 reti 14
Quellen http://www.engineersgarage.com http://www.protostack.com YouTube Channel von Patrick Hood-Daniel (MCU Tutorial) http://www.youtube.com/user/anajonesr www.mikrocontroller.net Das Atmega16 Datenblatt 15
Vielen Dank für die Aufmerksamkeit! 16