Hallo,
ich bin relativ neu in der Welt der AVR und versuche momentan mittels
Assembler Timer1 meines ATmega16 beizubringen im Sekundentakt einen
Overflow zu generieren. In C hat das ganze bereits wunderbar geklappt,
allerdings klappt folgender ASM-Code nicht so, wie ich es mir erhofft
habe:
OUT TCNT1H,tmp // Bis hier klappt alles wunderbar, TCNTH1 ist 0xE3...
26
LDI tmp, 0xE0 // ...aber ab hier ist TCNT1H laut Simulation wieder 0x00
27
OUT TCNT1L,tmp
28
29
SEI
30
31
32
timer1_overflow:
33
// hier versuch ich das selbe Spiel wie oben, ebenfalls erfolglos
34
RETI
TCNT1H lässt sich einfach nicht ändern. Ich hab auch die Routinen aus
dem Manual versucht, jedoch blieb auch dies erfolglos.
Ich hoffe jemand weiß Rat :)
crazy horse wrote:
> sehr bekannter Anfängerfehler, schau mal ins Datenblatt, wie> 16bit-Register zu schreiben/lesen sind :-)
Nö. Das ist schon OK so (vielleicht auch zufällig...?). Beim Schreiben
erst das High-Byte, beim Lesen erst das Low-Byte. Das Low-Byte triggert
den jeweiligen Vorgang.
Das Problem in diesem Fall ist vermutlich eher der Simulator und nicht
das Programm. Der AVRStudio-Simulator ist an der Stelle ein wenig buggy.
Zitat AVRStudio-Hilfe:
"Some simulator modules do not properly simulate the register buffering
and write order requirement of register pairs such as TCNT1H/TCNT1L. The
value of the high byte register is immediately set when written to.
Some register bits that should be cleared by setting them (writing 1)
will be cleared if they are written to 0."
Einen Workaround bietet die Hilfe in diesem Fall nicht (ich hab
zumindest jetzt keinen gefunden).
Die Frage ist allerdings, ob es tatsächlich erforderlich ist, das TCNT1
zu schreiben. Das ist nämlich in den seltensten Fällen wirklich nötig.
Wenn es ein Timer-Nachladen geht, um nach einer bestimmten Zeit einen
Overflow zu erhalten, ist es bei den AVRs eigentlich üblich, das mit
einer Compare-Einheit zu machen (z.B. im CTC-Modus) und dann den
Compare-Interrupt auszuwerten. Schau Dir im Datenblatt und/oder im
AVR-Tutorial vielleicht mal die Abschnitte zu den Compare-Einheiten
an.
BTW: Welche AVRStudio-Version hast Du? ich meine mich erinnern zu
können, dass das Problem in älteren Versionen (ich selber habe 4.13 und
daraus ist auch obiges Zitat) noch größer war.
So, mittlerweile hab ich das Ganze zum laufen gekriegt. Es war unter
anderem falsch, im Register TCCR1A das erste und dritte Bit zu setzen
(CS10 u. CS12), da diese nämlich in TCCR1B gesetzt werden müssen.
Zusätzlich läuft's jetzt im CTC-Modus, wie's mir empfohlen wurde. Vielen
Dank nochmals :)
Hier der Code:
Eric Barmeyer wrote:
> So, mittlerweile hab ich das Ganze zum laufen gekriegt. Es war unter> anderem falsch, im Register TCCR1A das erste und dritte Bit zu setzen> (CS10 u. CS12), da diese nämlich in TCCR1B gesetzt werden müssen.
Aha, da hab ich z.B. gar nicht drauf geachtet. Schön, dass es läuft...