www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer/Counter 1 Sekunde


Autor: Studiologe (Gast)
Datum:

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

Autor: Alex Trusk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Studiologe (Gast)
Datum:

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

Autor: Studiologe (Gast)
Datum:

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

Autor: Neuling (Gast)
Datum:

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

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.