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


von Kolle (Gast)


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

von Purzel H. (hacky)


Lesenswert?

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

von Grrrr (Gast)


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?

von Kolle (Gast)


Lesenswert?

Atmega32 der Timer/ Counter 1 ist aber schon belegt!

sollte eine einfache Lösung sein!

von Karl H. (kbuchegg)


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.

von hannes (Gast)


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.

von Karl H. (kbuchegg)


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
1
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
1
ISR( ... )
2
{
3
  if( turnOnDelay > 0 ) {
4
    turnOnDelay--;
5
    if( turnOnDelay == 0 ) {
6
       .. Gerät einschalten
7
    }
8
  }
9
10
  ...
11
}

Willst du nun das Gerät zeitverzögert einschalten, dann setzt du den 
Zähler auf 500.
1
    cli();
2
    turnOnDelay = 500;
3
    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.

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.