Moin,
bclr TOV0 ergibt doch überhaupt keinen Sinn. bclr ist das Mnemonic zum löschen eines Bits im Statusregister.
Dein Befehl löscht also Bit 0 im Statusregister (da liegt das Carry-Flag drin), mehr nicht.
Zitat :
|
das Überlaufbit TOV0, das ich mit dem brbc Befehl anpollen will.
|
Auch dieser Befehl ist völlig fehl am Platze, denn er wertet das Carry-Flag im Status-Register (SREG) aus. Da TOV0 auf Bit0 gemappt ist, und du mit bclr TOV0 vorher das Carry-Flag gelöscht hast, ist völlig klar, dass dein Programm nicht das machst, was du willst.
Wenn du das Bit pollen willst, dann muss es ungefähr so aussehen (rn ist Platzhalter für ein konkretes Register):
label:
in rn, TIFR
sbrs rn, TOVO
rjmp label
Je nach IO-Adresse von TIFR kann man auch mal sbis anstelle von sbrs ausprobieren, dann ist kein temporäres Register (rn) nötig.
sbis kann aber nur bis zu einer bestimmten Adresse arbeiten (dann reicht der Platz nicht mehr aus, um die Adresse im Opcode zu speichern).
Außerdem löscht man Interruptflaggen bei den AVRs i.d.R., indem man das korrespondierende Bit setzt, also auf '1' schreibt; auszug aus dem Datenblatt des ATMega8s:
Zitat :
|
Alternatively,
TOV0 is cleared by writing a logic one to the flag.
|
Eleganter wäre es aber, den Timer gleich im Interruptmodus zu benutzen. So ist und bleibt es eine Warteschleife.
Dazu muss aber die von perl geforderte ISR-Vektorenliste ab Adresse 0x000 stehen. Weiterhin muss im SREG das I-Flag gesetzt werden und im TIMSK auch.
Wenn das I-Flag nicht gesetzt ist, kann auch erstmal nicht passieren, selbst wenn Interrupts autreten, die Handler werden nicht ausgeführt.
Edit: dein Programm restlichen Quelltext habe ich mir nicht angeschaut, da ich keine Lust habe, das Zip-Archiv zu öffnen. Hänge es lieber als Textdatei an, geht schneller.
Zitat :
|
Der Timer 1 hat das Überlaufbit TOV0
|
Ich denke mal, du spricht vom ersten Timer, also Timer0
.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 9 Mär 2010 18:48 ]