Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne...

16
Atmega Interrupts Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös

Transcript of Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne...

Page 1: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

Atmega Interrupts

Rachid Abdallah Gruppe 3

Betreuer : Benjamin Bös

Page 2: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

Inhaltsverzeichnis

• Vorbereitung

• Was Sind Interrupts

• Interruptvektoren

• Software Interrupts

• Hardware Interrupts

• Quellen

2

Page 3: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

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

Page 4: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

Wie kann der Rechner Sinnvollerweise diese Ereignisse abhandeln ?

4

Page 5: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

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

Page 6: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

• 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

Page 7: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

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

Page 8: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

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

Page 9: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

Beispiel : (16-bit Timer)

9

#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){ } }

Page 10: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

Hardware Interrupts • Der Atmega16 besitzt 4 Interruptvektoren die Hardware

Interrupts realisieren.

10

• 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.

Page 11: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

11

Page 12: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

12

• Wichtige Register :

GISR :

MCUCR:

Page 13: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

13

#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){ } }

Programm Code in C :

Page 14: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

14

.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

Programm Code in Assembler:

Page 15: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

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

Page 16: Atmega Interrupts - Projektlabor Forum · •AVR Mikrocontroller besitzen 17 interne Interruptverktoren •Interne Interrupts sind durch interne Funktionen des MCs realisiert, Wie

Vielen Dank für die Aufmerksamkeit!

16