Timer Starten und Stoppen

Guten Morgen,
ich würde gerne wissen ob der Arduino die Möglichkeit bietet, einen Timer zu starten, dann irgendwas zu machen und mit einem Interrupt ihn wieder zu stoppen?
Wie viele Timer hat der Arduino?

Wenn das möglich ist, hab ihr einen Beispiel Code?
Oder gibt es leichte Befehle wie man das von dem tollen System bewohnt ist in der Form von:
start_timer1;
.
.
.
.
stop_timer1;

Viele Grüße

Hallo,

die Timer-Funktionen sind tatsächlich abhängig vom verwendeten Microcontroller. Ich hätte hier mal einen Beispielcode, läuft auf dem ATMega328 - also vielleicht ein Duemilanove, für einen Interrupt, der 1000 mal pro Sekunde aufgerufen wird. Dadurch wird auf einem Display die Uhrzeit angezeigt.

#include <LiquidCrystal.h>

unsigned int tcnt; 
unsigned int zaehler = 0;
unsigned int sekunden = 0;
unsigned int minuten = 24;
unsigned int stunden = 12;
int led = 1;

LiquidCrystal lcd(12, 11, 5, 4, 6, 7);


void setup(){
  lcd.begin(16,2);  
  
  noInterrupts();

  TIMSK1 &= ~(1<<TOIE0);  

  TCCR1A = (0<<COM1A1) | (0<<COM1A0) | (0<<WGM11) | (0<<WGM10);  
  TCCR1B = (0<<CS12) | (1<<CS11) | (1<<CS10);
  
  TIMSK1 |= (1<<TOIE1);  
  
  TCNT1H = 0xFF;
  TCNT1L = 0x06;

  interrupts();
}//setup


ISR(TIMER1_OVF_vect)  {

  TCNT1H = 0xFF;
  TCNT1L = 0x06;

  zaehler++;
}

void loop(){
  if(zaehler == 500)  digitalWrite(13, LOW);
  if(zaehler == 1000)  {
    zaehler = 0;
    sekunden++;
    if(sekunden == 60)  {
      sekunden = 0;
      minuten++;
    }
    if(minuten == 60)  {
      minuten = 0;
      stunden++;
    }
    digitalWrite(13, HIGH);
    led *= -1;
    lcd.setCursor(0,0);
    lcd.print(stunden);
    lcd.print(":");
    if(minuten < 10)  lcd.print("0");
    lcd.print(minuten);
    lcd.print(":");
    if(sekunden < 10) lcd.print("0");
    lcd.print(sekunden);
    lcd.print(" ");
  }
}

Die Dinge, die Du jetzt an dem Sketch nicht verstehst, sind einfach zu googeln. Gib z.B. bei Google ein "Arduino TIMSK1" und Du bekommst als ersten Treffer ein komplettes Timer-Tutorial. Das sind teilweise seitenlange Erklärungen, deshalb möchte ich die hier nicht wiederholen. Aber wenn Du dich so durch den Sketch oben arbeitest, denke ich, Du hast die Timer verstanden und bist für alle Timer-Anwendungen auf dem Arduino gerüstet.

Gruß,
Ralf

Hallo und vielen Dank für die Antwort,
Aber habe ich das jetzt richtig verstanden, dass der Timer 1000 Interrups in der Sekunde erzeugt?
Wenn ja, ist das leider nicht das was ich möchte. Ich möchte das ich den Timer starte, er im Hintergrund hochzählt und ich ihn nach einer gewissen zeit welche variert stoppen kann.
Dann lese ich den Timer Status aus und verwende Ihn weiter.

Kann man die Timer Frequenz zb. auf 1Khz Stellen.
ihn starten und nach einer Sekunde stoppen und hat dann einen Timer wert von 1000?

Viele Grüße

Das hat der Arduino bereits eingebaut.

Du kannst den internen Timer des Arduio mit millis() abfragen.

Der Code könnte dann so aussehen:

unsigned long Startzeit = 0;
unsigned long Dauer = 0;
void setup() { }

void loop() {
  // Timer starten
  if (Timerstartbedingung){
    Startzeit = millis();
  }
   if (Timerstopbedingung){
    Dauer =  millis() - Startzeit;
  }  
}

Hallo,
das sieht ja super aus :smiley: Vielen Dank!
Ich dachte mir schon das es beim Arduino nicht viel schwerer sein kann. :smiley:

Aber was ist die maximale Zeit bis der Timer überläuft? Ich bräuchte schon ca. eine Sekunde

Viele Grüße

Masterboy:
Aber was ist die maximale Zeit bis der Timer überläuft? Ich bräuchte schon ca. eine Sekunde

unsigned long geht bis 2^32 ms.
Das sind knapp 50 Tage....

edit: und selbst dann gehts nahtlos weiter, wenn alle beteiligten Variablen als unsigned long deklariert sind.
Dann wird der Überlauf einfach weitergegeben.

Klasse! Vielen Vielen Dank!

Besste Grüße

Du kannst sogar micros() benutzen; der läuft nach 70 Minuten über.
http://arduino.cc/en/Reference/Micros
Grüße Uwe