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.