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

Post on 26-Oct-2019

3 views 0 download

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

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)

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

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.

11

12

• Wichtige Register :

GISR :

MCUCR:

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 :

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:

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