Timer/Counter 1 Sekunde

Gast #408213
Lesenswert?
• ▲
▼
Hallo zusammen,
wie ihr der Überschrift schon entnehmen konntet, versuche ich mit
meinem ATMega16 eine LED im Sekundentakt blinken zu lassen. Also 1sec.
LED aus und 1sec. LED an.


Soweit ich das richtig verstanden habe, müsste mein Programm
folgendermaßen aufgebaut werden:

Hauptschleife:
1  Timerfunktion läuft genau 1 Sekunde
2  dann wird ein Interrupt ausgelöst
3  In der Interrupt-Routine wird ein Flag gesetzt
4  Zurück im Hauptprogramm wird geprüft ob das Flag gesetzt ist:
    Ja:   Um eine Sekunde Inkrementieren
      LED entweder an oder ausschalten, je nachdem was grad ist
      Flag wieder löschen
    Nein: Programm wieder von vorne los


Als erstes muss ich das mit dem Timer hinbekommen, habe heute den
ganzen morgen schon im Datenblatt rumgelesen….
Mein ATMega16 ist auf 8MHz getrimmt und ich habe bereits folgendes
herausgefunden:

Timer / Counter0  8-bit
von bottom -> top also von 0x00 -> 255

Ich muss also TCCR0 auf folgenden Wert setzen: 01111xxx

Bit 7 ist FOC0 und wird nur auf 1 gesetzt im Non-PWM Mode, also hier
eine 0

Bit 6 ist WGM00 auf 1 für Mode 3 (Fast PWM, Top 0xFF, Update of OCR0 at
Top,
    TOV0 Flagset at MAX)

Bit 5 ist COM01 auf 1 (Set OC0 on compare match, clear OC0 at top)

Bit 4 ist COM00 auf 1 (Set OC0 on compare match, clear OC0 at top)

Bit 3 ist WGM01 auf 1 für Mode 3 (Fast PWM, Top 0xFF, Update of OCR0 at
Top,
    TOV0 Flagset at MAX)

Bit 2 ist vom Prescaler, keine Ahnung !

Bit 1 ist vom Prescaler, keine Ahnung !

Bit 0 ist vom Prescaler, keine Ahnung !


So zu den Bits 0 bis 2 habe ich keine Ahnung, auf welchen Prescaler ich
diese setzen muss, um ganz genau später auf eine Sekunde zu kommen…..
da müsst ihr mir ein wenig mit der Berechnung helfen :)
Gast #408215
Lesenswert?
• ▲
▼
Hi,
danke für die rasche Antwort. Derweilen habe ich in einem anderen
Beitrag folgendes gefunden:

1/fosz*1024 (Vorteiler)*256 (TCNT0)

wenn ich das jetzt mit meinen werten mache kommt folgendes raus:
1) No-Prescaling:
= 0,000032 sec also 31250 durchläufe für 1sec

2) /8
= 0,000256 sec also 3906,25 durchläufe für 1sec

3) /64
= 0,002048 sec also 488,28125 durchläufe für 1sec

4) /256
= 0,008192 sec also 122,0703 durchläufe für 1sec

5) /1024
= 0,032768 sec also 30,5175 durchläufe für 1sec

richtig oder hab ich da was falsch verstanden
Gast #408216
Lesenswert?
• ▲
▼
Also mein Programm sieht bisher folgendermaßen aus:
=================================================================
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/pgmspace.h>


void main(void)
{
  TCCR0     =  0x7c;    //
  DDRA     =  0xff;    //Port A als Ausgang definieren

  while(1)
  {

  }
}
=================================================================
ich habe mich also für einen prescaler von 256 entschieden,
was bedeutet, das ich 122,0703 mal von Bottom nach Max, also von 0 bis
255 zählen muss, bis eine Sekunde vorbei ist, richtig?

Nehmen wir also 122 mal, so genau brauch ich die Sekunde auch nicht.


Was mach ich mit den folgenden ?
TIMSK
TCNT0
OCR0
Gast #408217
Lesenswert?
• ▲
▼
Wie läuft das mit den Interrupts?
Kann ich das besser mit der Overflow oder mit dem Compare-Match
machen.

für Compare-Match setz ich:
TIMSK = 0x02;
TIFR  = 0x02;

für Overflow setz ich:
TIMSK = 0x01;
TIFR  = 0x01;


soweit schon richtig ?

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.