Forum: Mikrocontroller und Digitale Elektronik Timer/Counter 1 Sekunde


von Studiologe (Gast)


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 :)

von Alex Trusk (Gast)


Lesenswert?


von Studiologe (Gast)


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

von Studiologe (Gast)


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

von Neuling (Gast)


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 ?

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.