mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sehr lange Zeit mit Timer?


Autor: Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kann man mit dem Timer eines AVR´s Zeiten von ca 10 bis 20 Minuten
zuverlässig herstellen? Es muss ja nicht auf die Sekunde genau sein.
Also ich würde dies für eine Beleuchtung realisieren. Mit Jumper an den
Eingängen möchte ich verschiedene Zeiten einstellen können.

Autor: Jens123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ueber timer und dann zaehlen lassen
wenn du zB. jede minute ein / ausschalten willst wuerde ich jede
sekunde einen TIMOverflow ausloesen lasse nudn darin ein register
hochzaehlen

im main mit 59 vergleichen und schon ist die minute rum

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"kann man mit dem Timer eines AVR´s Zeiten von ca 10 bis 20 Minuten
zuverlässig herstellen?"

Ich verstehe die Frage nicht.

Nach oben hin besteht keinerlei Grenze, der AVR hat genügend
Register+RAM, um bequem Tera-Jahre zählen zu können.
In praktischen Anwendungen werden aber meist nur 100 Jahre gezählt
(0..99).

Die Genauigkeit wird ganz allein durch die Genauigkeit des Quarzes
bestimmt, 100ppm sollten kein Problem sein.

Im Web findest Du genügend Beispiele dazu.
Praktisch wird die Zeitmessung in folgende 4 Schritte unterteilt:
1. Sekundentakterzeugung
2. Uhrzeitzählung
3. Datumszählung
4. Sommerzeit-, Schaltjahrkorretur


Peter

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte letztens das hier:

SIGNAL(SIG_OVERFLOW0)
{
  static char counter;

  if (++counter == 244)
  {
    counter = 0;
    clock++;
  }
}

Bei einem Mega8 @ 4MHz, Teiler clk_io/64. Das gibt 4e6/2^8/2^6/244 =
4e6/3997696 Hz fuer clock++, geht in einer Stunde um 2 Sekunden vor.
clock ist ein globaler 'volatile unsigned int'. In der main-Funktion
kannst Du dann einfach clock Sekundenzaehler verwenden, klappt aber
irgendwann um, am besten nach jeder Triggerung auf 0 setzen:

unsigned int limit = 20 * 60;
...
if (clock >= limit)
{
    clock = 0;
    mach_was();
}

sowas in der Art. Laesst sich natuerlich auch problemlos in Assembler
machen.

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.