PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt TIMER



Exodus
06.06.2006, 14:49
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

uwegw
06.06.2006, 15:06
.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

Exodus
06.06.2006, 15:10
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

uwegw
06.06.2006, 15:24
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?

Exodus
06.06.2006, 15:34
Und wie aktiviere ich den overflow interrupt in TIFR??

uwegw
06.06.2006, 15:35
rtfds!
In TIMSK... siehe Datenblatt!

Exodus
06.06.2006, 15:45
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

Exodus
06.06.2006, 15:47
ok hab was vergessen! interrupt alle aktivieren mit dem Befehl sei!!

MFG
Michi
:-)

Exodus
06.06.2006, 15:57
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

uwegw
06.06.2006, 16:02
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.)

Exodus
06.06.2006, 16:07
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:

izaseba
06.06.2006, 17:42
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