www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik timer auf bestimmten wert zählen


Autor: Kolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo wie kann ich einen Timer auf eine bestimmte Zeit raufzählen 
lassen? um einen Ausgang zu schalten , sozusagen als 
Einschaltverzögerung!

mfg kolle

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer setzen und auf den Ueberlauf warten. Der Ueberlauf gibt einen 
Interrupt.
Oder im Timertick eine Variable dekrementieren und vergleichen.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, bei den wenigen Details muss man leider antworten:

1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+ 
1+1+1...

Welcher Prozessor? -> Interrupts? -> Compare match oder Overflow?

Autor: Kolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Atmega32 der Timer/ Counter 1 ist aber schon belegt!

sollte eine einfache Lösung sein!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kolle schrieb:
> Atmega32 der Timer/ Counter 1 ist aber schon belegt!

Womit?

Es ist nicht verboten in einem Timer Interrupt auch mehrere Dinge zu 
machen, solange man mit der Interrupt Frequenz hinkommt.

Und wenn nicht, dann nimmt man halt den Timer 0 oder Timer 2

Aus genau solchen Gründen haben die meisten Programme sowas wie eine 
Basisclock in Form einer ISR, die zb alle 10 Millisekunden aufgerufen 
wird und in der man dann mit Softwarezählern die weiter benötigten 
Zeiten oder Verzögerungen erzeugt.

So nach dem Muster: Wenn man 60 mal 1 Sekunde abzählt, hat man in Summe 
auch 1 Minute abgezählt.

Autor: hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ein Interrupt der alle 10 ms aufgerufen wird? diese müsste ich um 5 
min zu warten 500 mal abwarten?

mal sehn ob ich ne beschreibung im tut finde .. danke soweit ich schau 
mal nach.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hannes schrieb:
> also ein Interrupt der alle 10 ms aufgerufen wird? diese müsste ich um 5
> min zu warten 500 mal abwarten?

Nö.
Da ist schon wieder dieses böse Wort "warten"

Du hast einen Zähler
volatile int16_t turnOnDelay;

in der ISR siehst du nach, ob dieser Zähler größer 0 ist. Wenn ja, dann 
verringerst du den um 1 um wenn er dann 0 ist, dann schaltest du ein.
Ist der Zähler schon 0, dann machst du gar nichts
ISR( ... )
{
  if( turnOnDelay > 0 ) {
    turnOnDelay--;
    if( turnOnDelay == 0 ) {
       .. Gerät einschalten
    }
  }

  ...
}

Willst du nun das Gerät zeitverzögert einschalten, dann setzt du den 
Zähler auf 500.
    cli();
    turnOnDelay = 500;
    sei();

Den Rest macht die ISR. Alle 10ms erniedrigt sie den Zähler um 1, und 
wenn die Zeit (500 = 5 Sekunden) um ist, schaltet die ISR das Gerät ein.

Fertig.

Ist das, was zeitverzögert passieren soll von der aufwändigeren Natur, 
dann macht das nicht mehr die ISR selber, sondern sie setzt eine andere 
globale Variable auf TRUE, welches anzeigt, dass die Aktion auszuführen 
ist. Das wiederrum wird von der Hauptschleife ausgewertet und 
abgearbeitet.

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.