Hallo,
ich habe das Problem, dass ich zwei Timer in einem Programm auf einem
Atmega8 starten will (Timer0 und Timer1), dies auch gelingt, wenn ich
sie einzeln starte, nicht jedoch wenn ich ich beide zusammen starte.
Es folgt ein Ausschnitt aus Meinem Programm:
...
.ORG OVF1addr ;Timerinterrupt Timer1
rjmp timer
.ORG OVF0addr ;Timerinterrupt Timer0
rjmp timera
.ORG $2A
start: ldi akku, LOW(RAMEND) ;Stapelzeiger laden
out SPL, akku
ldi akku, HIGH(RAMEND)
out SPH, akku
ldi akku,0b101 ;Systemtaktteiler : 1024
out TCCR0, akku
in akku, TIMSK
ori akku, 1 << TOIE0
out TIMSK, akku
ldi akku, 256 - 255
out TCNT0, akku
lds akku, low(65536)
out TCNT1l, akku
lds akku, high(65536)
out TCNT1h, akku
ldi akku,0b011 ;Systemtaktteiler 64
out TCCR1B, akku
in akku, TIMSK
ori akku, (1 << TOIE1)
out TIMSK, akku
...
Ich habe schon eineige Zeit damit verbracht selbst auf meinen Fehler zu
kommen - hab auch schon etwas hier im Forum geschaut - bin jedoch nicht
sonderlich erfolgreich gewesen, deshalb würde ich mich über eure Hilfe
freuen...
Andy
@Andy ich kann dir zwar nicht helfen aber mich würde Interessieren waru Du bei der Zeile ldi akku, 256 - 255 nicht gleich ne 1 einträgst! Ich beginne erst mit AVR und muss mich noch einarbeiten, da ich 8051er gewöhnt bin und bitte um Nachsicht.
>
lds akku, low(65536)
out TCNT1l, akku
lds akku, high(65536)
out TCNT1h, akku
<
Meinst Du "ldi" oder willst Du die Daten aus einer SRAM-Zelle holen, die
es nicht gibt???
...
oho - das mit dem "lds" habe ich total übersehen - soll natürlich ldi heißen - da war mal eine SRAM Variable drin, allerdings dürfte hier nicht mein eigentliche Problem entstehen. wegen der Frage von norad: natürlich könnte da auch 1 stehen, ich hatte da nur verschiedene Werte getestet und so ist das dann aus bequemlichkeit entstanden :)
Auch global freigeschaltet! - Wie gesagt einzeln funktionieren die Timer! Nochmal allgemein: ist es überhaupt möglich so ohneweiteres zwei Timer gleichzeitig laufen zu lassen? Und wenn (wie es ja scheint), muss noch etwas besonderes Beachtet werden? schon jetzt danke für mitdenken!
Andy wrote: > Nochmal allgemein: ist es überhaupt möglich so ohneweiteres zwei Timer > gleichzeitig laufen zu lassen? Ja klar. Ich wüsste nichts was dagagen spricht. > > Und wenn (wie es ja scheint), muss noch etwas besonderes Beachtet > werden? Zermartere mir schon die ganze Zeit das Hirn. Aber mit fällt nichts ein. Könntest du mal ein komplettes, vollständiges Pgm hier reinstellen.
Andy wrote: > Nochmal allgemein: ist es überhaupt möglich so ohneweiteres zwei Timer > gleichzeitig laufen zu lassen? Ja sicher doch, sonst würde Vieles ja nicht laufen, z.B.: http://www.hanneslux.de/avr/zuenduhr/index.html http://www.hanneslux.de/avr/zuenduhr/ZndUhr01.asm ...
Nebenbei bemerkt, müssen bei 16-Bit Registern erst die High-Register, dann die Low-Register geschrieben werden. Deine Timer-Init ist recht konfus (durcheinander), mach´s doch mal so, wie die Codebeispiele im Datenblatt zeigen. Also beginnen mit TCCRxA über TCCRxB und TCCRxC (falls vorhanden) und nach allen Registerzuweisungen erst dann die Interruptfreigabebits setzen. Das "sei" erst nach allen Initialisierungen aller benutzten Peripherie ausführen. Ach und eine komplette Interrupt-Vektorentabelle sollte Pflicht sein. Nichtbenutzte Interruptvektoren werden dann auf Reset oder auf eine Abhandlungsroutine zur Fehlerdiagnose geschickt.
> Ach und eine > komplette Interrupt-Vektorentabelle sollte Pflicht sein. Das ist auch meine Meinung. Da ich damit aber immer auf Widerspruch stoße, lasse ich es bleiben, darauf hinzuweisen. > Deine Timer-Init ist recht > konfus (durcheinander) Das ist wohl wahr. Da kommt man schon beim Lesen durcheinander. ...
Mit 'ldi' statt 'lds' (wie erwähnt) läuft der Timer1 bei 0 los, dann noch *64; ist das Absicht?
senex24 wrote: > Mit 'ldi' statt 'lds' (wie erwähnt) läuft der Timer1 bei 0 los, dann > noch *64; ist das Absicht? Glaub' nicht, dass das Absicht war, eher "zusammengefunden"... Duck&wech... ...
Na ja, 65536 == 0x10000. Klar dass da bei einer 16 Bit Variablen nur noch 0 übrigbleibt. Das 17te "Bit" trinkt ja der Programmierer ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.