Forum: Mikrocontroller und Digitale Elektronik 8bit-Timer-Overflow pollen?


von Johannes Permoser (Gast)


Lesenswert?

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?

von Johannes Permoser (Gast)


Lesenswert?

sorry, vertippt

wait:  sbis TIFR, 0
  rjmp wait
  cbi TIFR, 0

von johnny.m (Gast)


Lesenswert?

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.

von Johannes Permoser (Gast)


Lesenswert?

hättest du dann auch einen lösungsvorschlag?

von johnny.m (Gast)


Lesenswert?

ldi r16, 0x01
out TIFR, r16

von Johannes Permoser (Gast)


Lesenswert?

und für das pollen? da bringt er mir auch eine fehlermeldung

von johnny.m (Gast)


Lesenswert?

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

von Johannes Permoser (Gast)


Lesenswert?

DANKE

von johnny.m (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.