Also das mit dem Interrupt verhätl sich so, dass die ersten paar Wörter im Flash Interruptvektoren sind, das heist, das wenn ein Interrupt aktiviert ist und dieser aufgerufen wird dann springt dein Programmzeiger auf genau diese addresse ( zb $0010 ), da du da jab aber nur ein befehl ausführen könntest schreibt man dort ein rjmp rein, welches zu deiner Interruptroutine führt. Deine interruptroutine beendest du nicht mit ret sondern mit RETI !!!!
So das waren die Basics nun aber zum Code:
1.
Als erstes werden die Interruptvektoren eingerichtet:
Die addresse findest du entweder im Datenbaltt oder im INC File
Code:
;----[ Interrupt-Vektoren ]---------------------------------------------------------
.org 0000 ; Zum Programmbeginn springen
rjmp reset
.org OVF1addr ; Timer1 überlauf
rjmp Overflow
3.
Den Timer einrichten, aber das kannste ja schon
4.
Den Timerinterrupt aktivieren:
Dazu musst du im TIMSK Register den TOIE1 aktiverien ( TimerOverflowInterruptEnable1 für timer1 )
Code:
ldi tmp, (1<<TOIE1) ; Timer1 Interrupt
out timsk, tmp ; aktivieren
5.
GANZ WICHTIG!!! GLOBALE INTERRUPTFREIGABE!!!
sonst geht überhaupt kein Interrupt
Dazu einfach den befehl SEI benuzen.
Code:
sei ; Interuptts freigeben
6.
Zum schluß deine Iinterruptroutinen ans ENDE deines Quellcodes
beginen mit deinem LABELD ( hier Overflow ) und Ende mit RETI
Code:
Overflow:
; HIER DEIN CODE
reti
So das wars auch schon, das kannste so für alle Interrupts übernehmen.
Lesezeichen