hallo wie kann ich einen Timer auf eine bestimmte Zeit raufzählen lassen? um einen Ausgang zu schalten , sozusagen als Einschaltverzögerung! mfg kolle
Timer setzen und auf den Ueberlauf warten. Der Ueberlauf gibt einen Interrupt. Oder im Timertick eine Variable dekrementieren und vergleichen.
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?
Atmega32 der Timer/ Counter 1 ist aber schon belegt! sollte eine einfache Lösung sein!
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.