Forum: Mikrocontroller und Digitale Elektronik Arduino Timer


von Peter L. (dcp12)


Lesenswert?

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.

von Joe F. (easylife)


Lesenswert?

Peter L. schrieb:
> Leider hatte ich damit noch
> keinen Erfolg.

Na, dann lasse doch mal das Programm sehen, soweit du momentan gekommen 
bist.

von Wolfgang (Gast)


Lesenswert?

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).

von Peter L. (dcp12)


Lesenswert?

#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?

von Sam .. (sam1994)


Lesenswert?

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).

von Peter L. (dcp12)


Lesenswert?

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

von Arduinoquäler (Gast)


Lesenswert?

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

von Peter L. (dcp12)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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?

von Joe F. (easylife)


Lesenswert?

Peter L. schrieb:
> leider sind es
> keine 10 sekunden. Sieht jemand vielleicht meinen Fehler?

Wieviele Sekunden sind es denn?
5?

von Peter L. (dcp12)


Lesenswert?

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

von Joe F. (easylife)


Lesenswert?

Warum nicht 50000?

16000000 : 64 : 5 = 50000

von Peter L. (dcp12)


Lesenswert?

Joe F. schrieb:
> Warum nicht 50000?
>
> 16000000 : 64 : 5 = 50000

Der Timer startet bei 0 und zählt bis 49999 (50k Schritte)

von Joe F. (easylife)


Lesenswert?

Peter L. schrieb:
> Der Timer startet bei 0 und zählt bis 49999 (50k Schritte)

Stimmt.

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.