Hallo zusammen. Ich bin momentan dabei ein Programm zuschreiben, welches mir in einer gewissen Zeitspanne ausgibt, wie oft ein Taster betätigt wurde. Ich hatte mir das so gedacht, dass nach der ersten Betätigung des Tasters, die Zeit startet und z.B. nach einer Minute ausgegeben wird, wie oft dieser Taster betätigt wurde. Im Internet hatte ich gelesen, dass sich so etwas mit Hilfe von Overflows der Timer realisieren lässt. Leider hatte ich damit noch keinen Erfolg. Ich bis jetzt auch noch keine Idee, wie ich das Starten der Zeit erst nach der ersten Betätigung des Tasters starten kann. Ich hoffe mir kann jemand ein paar Tipps geben oder kennt ein vorhandene Code, der ähnliches erfüllt. Das ganze würde ich gerne für meinen Arduino mit der Arduino-IDE programmieren. Viele Grüße.
Peter L. schrieb: > Leider hatte ich damit noch > keinen Erfolg. Na, dann lasse doch mal das Programm sehen, soweit du momentan gekommen bist.
Peter L. schrieb: > Ich bis jetzt auch noch keine Idee, wie ich das Starten der Zeit erst > nach der ersten Betätigung des Tasters starten kann. Eine Möglichkeit wäre, erstmal zu warten bis der Taster gedrückt wird und dann den Timer zu starten. Dann guckst du immer fleißig, ob die Taste gedrückt wurde (mitzählen) oder ob die Zeit abgelaufen ist (Timer stoppen).
#define F_CPU 16000000UL //16Mhz
...
if(prev == 1)
{
TCCR1A = 0x00;
TCCR1B = (1 << WGM12); // CTC
TCCR1B = (1 << CS10) | (1 << CS11); //Prescaler /64
OCR1A = 24999;
TIMSK1 |= (1 << OCIE1A);//enable Compare Interrupts
sei();
}
if (overflow_counter >= 50) //10 sek
{
PORTB ^= (1 << LED1);
overflow_counter = 0;
}
}
ISR(TIMER1_COMPA_vect)
{
overflow_counter++;
}
So das ist mein Code. Wenn der Taster gedrückt wird, startet der Timer
und erreicht 5 overflows pro sekunde (5Hz). Nach 10 sekunden müsste der
overflow_counter dann ja eigentlich auf 50 gesetzt sein, leider sind es
keine 10 sekunden. Sieht jemand vielleicht meinen Fehler?
Peter L. schrieb: > TCCR1B = (1 << WGM12); // CTC > TCCR1B = (1 << CS10) | (1 << CS11); //Prescaler /64 Was denkst du steht nach den beiden Zeilen genau in TCCR1B? Die Definition von dem overflow_counter ist übrigens noch interessant. Da kann ebenfalls ein Fehler dabei sein (volatile).
Ich möchte den Prescaler und den CTC Modus benutzen... Aber wahrscheinlich überschreibe ich das dann wieder... TCCR1B = (1 << CS10) | (1 << CS11) | (1 << WGM12); So richtig? ;) An volatile hab ich gedacht
Wenn man unter der Arduino IDE programmiert braucht man keinen Timer explizit einstellen, denn man bekommt den bereits frei Haus geliefert. https://www.arduino.cc/en/Reference/Millis
Arduinoquäler schrieb: > Wenn man unter der Arduino IDE programmiert braucht man keinen > Timer explizit einstellen, denn man bekommt den bereits frei > Haus geliefert. > > https://www.arduino.cc/en/Reference/Millis Ich weiß. Ich würde aber trotzdem gerne mit dem Timer arbeiten.
Peter L. schrieb: > TCCR1B = (1 << CS10) | (1 << CS11) | (1 << WGM12); > So richtig? ;) Ja. Siehe auch Bitmanipulation, falls du dir da unsicher bist. Man kann das auch durchaus in zwei Zeilen schreiben, ohne die vorherige zu überschreiben. Wenn du die richtigen Bits gesetzt hast, müsste das jetzt eigentlich funktionieren. Wenn nicht, was passiert denn überhaupt? Toggelt die Led irgendwann?
Peter L. schrieb: > leider sind es > keine 10 sekunden. Sieht jemand vielleicht meinen Fehler? Wieviele Sekunden sind es denn? 5?
So jetzt funktionierts. Genau die LED soll im Rhythmus von 10 sekunden toggeln. Wenn ich jetzt noch die 24999 durch 49999 ersetze klappt das auch mit den 10 Sekunden. Besten Dank
Joe F. schrieb: > Warum nicht 50000? > > 16000000 : 64 : 5 = 50000 Der Timer startet bei 0 und zählt bis 49999 (50k Schritte)
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.