hi, ich wollte in einem programm so lange warten, bis der 8bit Timer im mega8 einen Overflow meldet. Eigentlich ganz einfach, hatte ich mir gedacht: wait: sbrs TIFR, 0 rjmp wait cbi TIFR, 0 Kompiliert er mir aber nicht (illegal argument), obwohl TIFR wie z.b. PINB in der m8def.inc unter I/O-Register steht. Hat jemand eine Lösung?
cbi geht nur mit den 32 unteren I/O-Registern. Außerdem löscht man ein Interrupt-Flag mit einer 1 und nicht mit einer 0. Bitte lies Dir das Datenblatt und das Instruction Set Manual mal genauer durch.
wait: in r16, TIFR
sbrs r16, 0
rjmp wait
out TIFR, r16
Kleiner Tip am Rande: Bei Assembler-Programmierung immer das
Instruction Set Manual und das Datenblatt des jeweiligen µCs (sowieso)
in Reichweite haben. Wenn mal irgendwas wie oben passiert, kann man
schnell im ISM nachsehen, was der Befehl für Operanden hat und wenn er
nur mit bestimmten Registern funktioniert, im Datenblatt im Register
Summary nachsehen, ob das gewünschte Register überhaupt in Reichweite
des Befehls liegt.
Einige Befehle, die mit I/O-Registern arbeiten (eben z.B. sbi und cbi)
haben nur Platz für 5 Bits Register-Adresse, also 0x00...0x1F (0...31d)
und können deshalb nur auf die Register mit den Adressen bis 0x1F
zugreifen (0x1F ist bei den AVRs [zumindest bei denen mit EEPROM, was
mittlerweile auf die meisten zutrifft] das EEARH, kann man sich als
'Landmarke' merken).
Gruß
Johnny
Na, ganz perfekt wars nicht. Hab eine Zeile vergessen. So isses besser:
wait: in r16, TIFR
sbrs r16, 0
rjmp wait
ldi r16, 0x01
out TIFR, r16
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.