2016-04-24 8 views
1

im zu stoppen und wieder aufnimmt wieder meinen Interrupt-Timer auf Arduino versucht, nachdem er 500 zählt also die Interrupt-Timer-Zähler auf 500, dann für einige Sekunden verzögern, und dann wieder den Interrupt-Timer wiederQ: wie zu starten und zu stoppen Interrupt-Timer auf Arduino?

dies ist mein Code ich kann, halten Sie das Interrupt aber weiß nicht, wie Sie den Timer wieder

#define ledPin 13 
int count=0; 
void setup() 
{ 
pinMode(ledPin, OUTPUT); 
Serial.begin(9600); 
cli();//stop interrupts 
//set timer0 interrupt at 2kHz 
    TCCR1A = 0;// set entire TCCR0A register to 0 
    TCCR1B = 0;// same for TCCR0B 
    TCNT1 = 0;//initialize counter value to 0 
    // set compare match register for 2khz increments 
    OCR1A = 124;// = (16*10^6)/(2000*64) - 1 (must be <256) 
    // turn on CTC mode 
    TCCR1A |= (1 << WGM01); 
    // Set CS01 and CS00 bits for 64 prescaler 
    TCCR1B |= (1 << CS01) | (1 << CS00); 
    // enable timer compare interrupt 
    TIMSK1 |= (1 << OCIE1A); 
sei(); 
} 

ISR(TIMER1_COMPA_vect) // timer compare interrupt service routine 
{ 
count++; 
if(count%2==0)digitalWrite(ledPin,HIGH); 
if(count%2==1)digitalWrite(ledPin,LOW); 
if(count>=500) 
{ 
    count=0; 
    TCCR1B=0; 
    digitalWrite(ledPin,LOW); 
    //TCCR1B |= (1 << CS01) | (1 << CS00); 
} 

} 

void loop() 
{ 
// your program here... 

Serial.println(count); 
delay(1000); 

} 

void berhenti() 
{ 
cli();//stop interrupts 
digitalWrite(ledPin,LOW); 
count=0; 
delay(3000); 
sei(); 
} 
+0

Was ist der Zweck der Routine namens "berhenti()"? Nennen Sie diese Routine jemals? – mhopeng

Antwort

0

Sie können verzögern und wieder verwenden, um die millis() Funktion, um die Zeit, die Sie zählen müssen.

#define ledPin 13 
int count=0; 

// A boolean to know if the timer is stopped or not. 
// You can use the TIMSK1 bit, but I prefer a seperate variable. 
boolean timerStopped = false; 

// Time when the timer stopped. 
long timerStoppedTime = 0; 

// Your delay in milliseconds. 
// You can use a macro here as well. 
long timerStoppedDelay = 1000; 

// I'll explain this variable in the answer. 
boolean takeTimeTimerStopped = true; 

void setup() 
{ 
    // I haven't change this function. 
} 

ISR(TIMER1_COMPA_vect) // timer compare interrupt service routine 
{ 
    count++; 
    if(count%2==0)digitalWrite(ledPin,HIGH); 
    if(count%2==1)digitalWrite(ledPin,LOW); 
    if(count>=500) 
    { 
     count=0; 
     TCCR1B=0; 
     digitalWrite(ledPin,LOW); 
     TIMSK1 |= (0 << OCIE1A); // deactivate timer's interrupt. 
     timerStopped = true; 
    } 

} 

void loop() 
{ 
    // your program here... 

    Serial.println(count); 
    delay(1000); 

    if(timerStopped) 
    { 
     if(takeTimeTimerStopped) 
     { 
      timerStoppedTime = millis(); 
      takeTimeTimerStopped = false; 
     } 
     if((millis() - timerStoppedTime) >= timerStoppedDelay) 
     { 
      TIMSK1 |= (1 << OCIE1A); // reactivate the timer. 
      timerStopped = false; 
      takeTimeTimerStopped = true; 
     } 
    } 

} 

Sie benötigen die takeTimeTimerStopped boolean nicht timerStoppedTime jedes Mal, wenn die if(timerStopped) Anweisung eingeben zu ändern. Eine logische Möglichkeit, dieses hässliche Zeug zu vermeiden, ist es, sich die Zeit in der ISR zu nehmen. Aber millis() es selbst verwendet Timer0 unterbricht nicht innerhalb eines ISR zu zählen und soll als in http://www.arduino.cc/en/Reference/AttachInterrupt

Hinweisen beschrieben aufgerufen wird, dass jeder Aufruf dealy() in Ihrer loop Funktion wird weiter die Zeit verzögern Ihre Timer zu reaktivieren. Sie müssen dies auch berücksichtigen.