Pages: [1]   Go Down
Author Topic: Timer / Counter  (Read 8432 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Neuss
Offline Offline
Full Member
***
Karma: 1
Posts: 200
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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%C3%A4hler_des_AVR
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer
http://www.rn-wissen.de/index.php/Timer/Counter_%28Avr%29
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!  smiley-wink

Gruß
Wolfgang
« Last Edit: July 30, 2012, 10:56:51 am by voithian » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3033
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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 smiley-wink
Logged

Offline Offline
Jr. Member
**
Karma: 2
Posts: 99
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 1
Posts: 149
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Faraday Member
**
Karma: 118
Posts: 3945
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 149
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


Logged

Pages: [1]   Go Up
Jump to: