www.mikrocontroller.net

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


Autor: Johannes Permoser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johannes Permoser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, vertippt

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes Permoser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hättest du dann auch einen lösungsvorschlag?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi r16, 0x01
out TIFR, r16

Autor: Johannes Permoser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und für das pollen? da bringt er mir auch eine fehlermeldung

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes Permoser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.