A.    Interrupt-Technik

Für den Mikrocontroller existieren die  zwei Betriebszustände  RUN oder STOP.

Im  RUN befindet sich die CPU fortwährend in  einer  Programmschlaufe, um den gegebenen Befehlscode auszuführen. 
Diese Schlaufe beinhaltet neben dem eigentlichen Hauptprogramm (Main) auch allfällige Unterprogramme (Subroutine).

Veränderungen an I/O-Ports werden durch sog. Polling erfasst, worunter eine permanent-zyklische Statusabfrage der Register durch die CPU zu verstehen ist.

Um den Controller von dieser an sich monotonen und zeitraubenden Tätigkeit zu entlasten, bedient man sich der Interrupt-Request-Methode. Darunter wird die prozessgesteuerte Programmbearbeitung verstanden, welche hardwareseitig durch ein Ereignis (Signalwechsel) oder ein Zeitintervall (Timerüberlauf) ausgelöst wird.

Die controllerspezifisch vorhandenen Interrupt-Quellen können dabei sowohl interner als auch externer Natur sein.

Damit die CPU beim Auftreten einer Unterbrechungs-Anforderung (Interrupt-Request) die betreffende Interrupt-Routine handeln kann, muss in einer Tabelle ein Verweis (Vector) auf die durchzuführende Prozedur vorliegen.

Diese Interrupt-Vektoren werden im Flash-Memory (Programm- Speicher) durch  Adressierung eindeutig  zugeordnet.  Wird keine derartige Tabelle installiert, kann an den Anfangsadressen im Flash auch normaler Programmcode stehen.

Beim AT90S1200 befinden sich die Interrupt-Vektoren in den untersten Speicherzellen mit den Adressen $000 bis $003. 

Vector

Adresse

Source

Definition

1

$000

RESET Hardware- oder Watchdog- Reset (Pin1)

2

$001

INT0 Externe Interrupt-Anforderung (Pin6)

4

$002

TIMER0, OVF0 Timer/Counter Overflow

5

$003

ANA_COMP Analog Comparator (Pin 12 und Pin 13)

Die korrekte Installation einer Interrupt-Vektor-Tabelle mit nachfolgendem Programmcode für einen Timer-IRQ wird durch folgendes Beispiel veranschaulicht: 


.device AT90S1200 ;AVR-MCU

.include "1200def.asm" ;Registerdeklaration

.def .......................... ;

.def .......................... ;

rjmp INIT ;Reset Handler

reti ;INT0 (ext.)

rjmp blink ;Timer0 Overflow Handler

reti ;Analog Comparator

INIT: ......................... ;

.................................. ;

.................................. ;

.................................. ;

ldi ligth, .......... ;

ldi timer, ......... ;

out TIMSK, timer ;T0_Interrupt-MaskRegister

ldi timer, ......... ;

out TCNT0, timer ;lösche Timerwert

ldi timer, ......... ;

out TCCR0, timer ;T0_Prescaler

NOP ;(CK/1024 = 65.536 ms)

SEI ;Setze I-Flag im SREG

main: ................................. ;

comp: ................................ ;

.......................................... ;

.......................................... ;

LED: .................................. ;

out PortB, ligth ;

rjmp main ;

blink: ................................ ;

RETI ;Rücksprung aus Interrupt


Der zur Verfügung stehende Timer/Counter T0 ist als freilaufender 8-Bit-Up-Counter gefertigt. Nach dem durch die Initialisierungs-Routine vorgenommenen Start des Timers erfolgt beim Überlauf von $FF nach $00 eine Interrupt- Anforderung (Bit TOV0 im TIFR =[1]).

Danach wird der zugehörige Interrupt-Vektor ($002) in der Reset- Vector-Table im Flash ausgelesen, welcher im Beispiel mit rjmp "blink" auf die entsprechende Interrupt-Serviceroutine verweist.

Der ProgramCounter wird dabei auf die Adresse des betreffenden Labels gesetzt, wo dann die weitere Programmbearbeitung erfolgt.
Die Interrupt-Serviceroutine wird mit RETI abgeschlossen. Dieser Befehl bewirkt einen Rücksprung in das Hauptprogramm, um dort die zuvor unterbrochene Programmbearbeitung fortzusetzen.

Die Rücksprungadresse, mit welcher der ProgramCounter geladen werden muss, befindet sich auf dem 3-Level-Hardwarestack.

 

anipink06_next.gif     Interrupt-Handler

 

Aufgabe 1

Realisiere durch einen Timer-Interrupt einen Wechselblinker, bestehend aus 2 x 4 LED (0,1,2,3 und 4,5,6,7), welche im Sekundentakt ein/aus geschaltet werden. In einer Initialisierungsphase sind zuerst die massgebenden Register zu beschalten.

Aufgabe 2

Löse mit einem Microswitch auf dem Starterboard einen Interrupt-Request (IRQ) aus. Durch den Interrupt soll der Lautsprecher auf dem Digital-Simulator für 5 s eingeschaltet werden. Auch hier sind zunächst die entsprechenden Register zu initialisieren.

Aufgabe 3

Mit einem NTC-Widerstand soll bei erhöhter Temperatur (>100 °C) ein Blinklicht eingeschaltet werden, das nur mittels Hardware-Reset zurückgesetzt werden kann.