www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Grundlagen AVT Rimer


Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leuts,

ich habe hier mal eine grundsaetzliche Frage zu den AVR-Timern, genauer
dem Timer 0.
Vielleicht bin ich ja zu doof den Taschenrechner zu bedienen, aber ich
versuche einfach nur alle 0.5 ms einen Overflow Interrupt zu erzeugen.
Als hardware setze ich das STK 500 mit einer eingestellten Taktfrequenz
von 3.69 MHz ein.
Ich moechte einen Vorteiler von 8 und dabei 231 Counts zaehlen, das
muesste doch dann alle 0.500 ms einen Overflow erzeugen

Beim Initialisieren mache ich folgendes:
  ldi TIME, 256-231
  out TCNT0, TIME

  ldi TEMP, (1<<TOIE0)
  out TIMSK, TEMP

  ldi TEMP, 2
  out TCCR0, TEMP


In der Interruptroutine zaehle ich dann nochmals bis 2000 und toggle
dann eine LED.

  ; Counter neu laden
  out TCNT0, TIME

  dec Count
  cp Count, zero
  brne n1

  ldi Count, 2000
        ; Toggle LED

n1:     reti


2000 * 0.5 ms = 1 S
Aber die LED flackert so schnell, dass dies kaum sichtbar ist...

Vielleicht kann mir mal einer sagen wo ich da einen Denkfehler habe.
Danke


Greetings
Karlheinz

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste doch bitte mal dein komplettes Programm, dann kann ich dir
vielleicht auch helfen

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
im einzelnen habe ich es mir angeschaut, aber so wie es aussiehtist
"Count" eine 8bit-Variable, die kann man nicht mit 2000 laden,
sondern max. 255. Der Assembler lädt wahrscheinlich mit 0xd0 (2000 dez=
7d0hex), so dass du ca. auf 100ms kommst.

Autor: Karlheinz Druschel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

anbei mal das kleine Testprogramm.
Da Count = r20 ist sollte es doch eine 16 bit-Variable sein, oder ?



Greetings
Karlheinz

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kommst du darauf, dass das ein 16bit-Register sein könnte? Ist es
jedenfalls nicht.
Und noch was (ist nicht der Fehler, aber unnötig):
cli/sei brauchst du in der ISR nicht (wird automatisch ausgeführt)

Autor: Thany (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie oben, r20 ist 8Bit Register wie andere Register.
Deine Sprungmarke funktioniert nicht aufgrund des fehlenden
Stackpointers, das muss hinter dem Reset so heissen:

        Reset:
  ldi r21, low(RAMEND)
  out SPL, r21
  ldi r21,high(RAMEND)
  out SPH, r21
        ......

Autor: Armin Kniesel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann für Timerberechnungen sehr den AVR-calc empfehlen:
http://www.avrfreaks.net/Tools/showtools.php?ToolID=292

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

erstmal danke für die Antworten, ihr habt natürlich recht.
Irgendwo glaubte ich dummerweise gelesen zu haben, die AVR´s hätten 32
16 bit-Register



Thanks for your help


Greetings
Karlheinz

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.