Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt TIMER
Hallo leute!
Ich ahbe eine frage zu den uC ATMEGA8535!
Wie kann ich eine interruptroutine ablaufen lassen, wenn beim Timer die TOV0 (Überlauf) gesetzt ist?
Habs mal so probiert:
.include "m8535def.inc"
.org 0x000
rjmp Zeit
.org $008
rjmp Start
Zeit:
ldi R16, 0b00000001
out TCCR0, R16
rjmp Zeit
Start:
rjmp Start
bitte um rückantowrt!
MFG
Michi
.include "m8535def.inc"
.org 0x0000 ;mit vier Nullen, ist nen 16bit-Wert
rjmp Zeit
.org OVF0addr ;Name für Int-vektor aus der .inc, die 8 war falsch, müsste 9 sein!
rjmp Start
Zeit:
;stack einrichten: (sonst geht gar nichts!)
ldi mpr, HIGH(RAMEND);
out SPH, mpr
ldi mpr, LOW(RAMEND);
out SPL, mpr
ldi R16, 0b00000001
out TCCR0, R16
<<hier müsste noch der Overflow-Interrupt aktiviert werden!>>
rjmp Zeit
Start:
<<was im Int passieren soll>>
reti ;zurück zum Hauptprogramm
also dass heißt den Stackpointer immer vorher initialisieren bevor man ein programm schreibt? und noch was, Ramend Was hat dass zu bedeuten??
MFG
Michi
Der Stack wird benutzt, um die Rücksprungadresse der Interruptroutine abzulegen.
RAMEND ist ein konstante aus der .inc, die die letze Adresse im SRAM enthält. dort wird der stackpointer plaziert, und der stack wächsts dann zum vorderen ende des SRAMs.
PS: http://www.avr-asm-tutorial.net/ nicht gründlich genug gelesen?
Und wie aktiviere ich den overflow interrupt in TIFR??
rtfds!
In TIMSK... siehe Datenblatt!
Kann dass so funktionieren?
.include "m8535def.inc"
.org 0x0000
rjmp Zeit
.org OVF1addr
rjmp Start
;Stackpointer einrichten
Zeit:
ldi R18, HIGH(RAMEND);
out SPH, R18
ldi R18, LOW(RAMEND);
out SPL, R18
;Timer einrichten
ldi R16, 0b00000001
out TCCR0, R16
;Overflow Flag aktivieren
clr R16
ldi R16, 0b00000001
out TIMSK, R16
;Hauptprogramm
Start1:
rjmp Start1
;Unterprogramm
Start:
rjmp Start
mfg Michi
ok hab was vergessen! interrupt alle aktivieren mit dem Befehl sei!!
MFG
Michi
:-)
ah noch was muss man egentlich wenn man den Stack einrichten will immer dass schreiben??
;Stackpointer initialisieren
ldi R16, High(Ramend)
out SPH, R16
ldi R16, Low(Ramend)
out SPL, R16
ok hab was vergessen! interrupt alle aktivieren mit dem Befehl sei!!
Dafür gibts hier im Forum die Edit-Funktion....
Sieht schon mal fast richtig aus... nur diese Stelle nicht:
;Unterprogramm
Start:
rjmp Start
dort machst du im Unterprogramm eine Endosschleife. Du müsstest stattdessen mit reti wieder zurück zum Hauptprogramm springen, wenn die Interruptroutine vorbei ist.
ah noch was muss man egentlich wenn man den Stack einrichten will immer dass schreiben?? [quote]
man kann auch ein anderes Register nehmen, aber ansonsten ja. Du musst den stackpointer, der auf SPH und SPL aufgeteilt ist, auf die letzte Adresse im SRAM setzen. (gut, ne andere Adresse geht auch, aber dann hat der Stack wenigerr Platz. Nur sinnvoll, wenn du was dahinter alegen willst.)
ok will ein LED nach rechts verschieben! kann ich dass so machen? weiß nicht mehr weiter. Bitte helfen
.include "m8535def.inc"
.org 0x0000
rjmp Start
.org OVF0addr
rjmp rechtsverschieben
;Hauptprogramm:
Start:
;Stackpointer initialisieren
ldi R16, High(Ramend)
out SPH, R16
ldi R16, Low(Ramend)
out SPL, R16
clr R16
;Timer einrichten
ldi R16, 0b00000001
out Timsk, R16
out TCCR0, R16
;Schleife
sei
loop:
rjmp loop
;Unterprogramm
rechtsverschieben:
Helf Dir doch selber!
Uwe hat Dir ein Links geschickt, wo alles was Du brauchst drin steht
PS: http://www.avr-asm-tutorial.net/ nicht gründlich genug gelesen?
Wenn das zu schwer ist ist Bascom Dein Freund...
Aber Bits kannst Du mit lsl lsr ror rol schön schieben :-)
Gruß Sebastian
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.