Forum: Mikrocontroller und Digitale Elektronik Grundlagen AVT Rimer


von Karlheinz Druschel (Gast)


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

von Christian (Gast)


Lesenswert?

Poste doch bitte mal dein komplettes Programm, dann kann ich dir
vielleicht auch helfen

von crazy horse (Gast)


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.

von Karlheinz Druschel (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

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



Greetings
Karlheinz

von crazy horse (Gast)


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)

von Thany (Gast)


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
        ......

von Armin Kniesel (Gast)


Lesenswert?

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

von Karlheinz Druschel (Gast)


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

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.