Timer / Counter

Hallo, ich habe vor eine Stoppuhr mithilfe des Arduinos zu bauen.

Jedoch habe ich noch nicht sehr viel Erfahrung in Sachen Programmierung und suche daher
ein gutes Tutorial oder Skript bzgl. Timern / Countern etc. was ich hierfür benötige.

Meine Suche nach dem obigen war bisher nicht sehr erfolgreich.

Danke

Liebe Grüße Madvision

Schau Dir am besten mal die Beispiele für die Funktion "millis()" und "micros()" and und auch gleich noch http://arduino.cc/en/Tutorial/BlinkWithoutDelay.
Der Arduino hat leider keine eingebaute Uhr, aber Du hast in Deinem Programm trotzdem einfache Funktionen zur Zeitmessung zur Verfügung, die für eine Stoppuhr reichen sollten.

Die Funktion millis() liefert die z.B. die seit dem Start des Arduino vergangenen Millisekunden. Wenn Deine Stoppuhr nun das "Start"-Signal bekommt, merkst Du Dir in einer Variable einfach den aktuellen Wert, den millis() liefert. Bekommt Deine Stoppuhr das "Stop"-Signal, nimmst Du den aktuellen Wert den millis() liefert und subtrahierst davon den gemerkten Startwert. Damit hast Du die Zeit in Millisekunden, die zwischen Stopp und Start vergangen ist. Wenn Du keine Zeiten von mehr als 49 Tagen messen willst, dann sollte das bereits reichen.

Mit eintsprechenden Signalen für Deine Stoppuhr, kannst Du dann auch beliebige Zwischen- oder Rundenzeiten messen. Das Prinzip ist immer das Gleiche. Startwert merken, Endwert bestimmen und die Differenz bilden.

Ich denke damit solltest Du erstmal anfangen können. Wenn es mit dem Sketch nicht so recht klappt, dann kannst Du hier ja jederzeit wieder fragen.
Mario.

Hallo Madvision,
schau mal hier, wenn du genaueres über Timer und Counter wissen willst:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer
http://www.rn-wissen.de/index.php/Timer/Counter_(Avr)
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Uhr

Natürlich geht es auch ohne das ganze Wissen über Timer und Counter, wenn du den Vorschlag von mkl0815 befolgst.
Aber willst du nicht mehr wissen? mkl0815 weiß bestimmt auch mehr, als er dir hier verrät! :wink:

Gruß
Wolfgang

ich habe vor eine Stoppuhr mithilfe des Arduinos zu bauen

Als "Timer / Counter" ist millis() völlig ausreichend ( wenns nicht mehr als anderthalb Monate Messdauer sein müssen ).

Die Probleme ( Aufgabe, Lernziel, Challenge ... ) sind nicht timer/counter, sondern die Anzeige und Bedienung der Stoppuhr.
Aber mehr verrate ich hier auch nicht :wink:

kleiner tipp im voraus von mir: falls du einen arduino uno Rev3 benutzt (oder andere arduinoboards, die nicht mit einem quartz sondern mit einem oszi getaktet sind) wirst du eine sehr ungenaue zeitbasis haben (abweichungen im bereich 1 sekunde pro 10 minuten, nach eigener erfahrung). dies kannst du umgehen indem du dir einen Atmega328 mit aufgespieltem programm selbst zusammen mit nem quartz auf eine platine lötest oder den fehler per software "rausrechnest" (wo ich aber das gefühl hatte das es irgendwann wegen der float-genauigkeit wieder zu fehlern kommt). alternativ, wenn du unbedingt das originale board verwenden willst/ musst kannst du noch den arduino leonardo oder ein älteres board, welches noch mit quartz arbeitet nehmen (weiß nur nicht genau welche das tun) oder eine Realtime Clock (RTC) nutzen.

Alternativ dazu habe ich folgendes gedacht:
habe einen Interrupt definiert attachInterrupt (0, count, RISING);

void count ()
{ x++
}
Aber habe da eine Verständnisfrage: Wenn ich die Variable x auch in der void loop verwenden möchte, muss ich die doch global deklarieren. Habe es gemacht mit long x=0;
In der loop schreibe ich dann folgendes:
void loop()
{ x1=x
Timer(500000)
x2=x
Damit will ich die Anzahl der Pulse vergleichen und dann den Motor schneller oder langsamer machen,
aber beim Kompilieren wird gesagt, dass x1 und x2 nicht deklariert sind. Warum?

Weil eine Variable namens "x" nicht das gleiche ist wie "x1" oder "x2"
int x1 = x geht

Denke auch daran, dass Variablen die innerhalb und außerhalb von Interrupts verwendet werden als "volatile" deklariert werden müssen:
http://arduino.cc/de/Reference/Volatile

Super danke.
Also sieht jetzt so aus :
void loop()
{
int x1=x;
Timer(1000);
int x2=x;
....
}
Aber Timer(mikrosekunden) ist korrekt so? Oder muss man das so schreiben:
int x1=x;
Timer.start();
Timer.stop();
int x2=x.
Will unbedingt einen delay vermeiden.