Forum: Mikrocontroller und Digitale Elektronik Arduino: Frage zu TimerOne


von Tom V. (dertomfun)


Lesenswert?

Hi,

ich versuche mich grade an der Timer1-Bibliothek für Arduino ( 
http://playground.arduino.cc/Code/Timer1 ) und versteh einfach nicht, 
wie das funktionieren soll. Gegeben sei folgendes Testprogrämmchen:
1
#include "TimerOne.h"
2
3
#define LED 8
4
#define SECOND 1000000
5
6
volatile int exited = 0;
7
8
void setup(){
9
  pinMode(LED, OUTPUT);
10
}
11
12
void loop(){
13
  if (!exited) {
14
    unsigned long timeSinceStart = millis();
15
    unsigned long fiveSeconds = 5000UL;
16
    if (timeSinceStart >= fiveSeconds) {
17
      Timer1.initialize(8*SECOND);
18
      Timer1.attachInterrupt(toggle);  
19
      exited = 1;
20
    }
21
  }
22
}
23
24
void toggle(){
25
  digitalWrite(LED, digitalRead(LED) ^ 1);
26
}

Ich würde mir erwarten, dass folgendes passiert: Nach 5 Sekunden wird 
der Timer1-Zähler gestartet und nach 13 (=5+8) Sekunden wird die LED zum 
1. Mal getogglet; danach wird alle weiteren 8 Sekunden getogglet.

Es passiert aber: Nach 5 Sekunden wird sofort getogglet und danach 
alle weiteren 8 Sekunden.

Wieso wird der Interrupt offenbar gleich ausgelöst, anstatt die ersten 8 
Sekunden abzuwarten? Ist das so gewollt? Wenn nicht, was mach ich 
falsch? Wenn schon, wie kann ich ihm abgewöhnen, dass er den 1. 
Interrupt sofort auslöst?

Danke für jeden Hinweis
Tom

von innerand i. (innerand)


Lesenswert?

Tom V. schrieb:

Tja, wer weiß schon was diese Lib da macht, müsste man nachsehen...
Aber versuch es mal so:
1
       Timer1.initialize();
2
       Timer1.attachInterrupt(toggle,8*SECOND);

von Tom V. (dertomfun)


Lesenswert?

Hallo, muss mich ehrlich Entschuldigen, für das späte zurückschreiben

Das hat nicht funktioniert.

Was jedoch (Warum-Auch-Immer) funktioniert hat:
1
      Timer1.initialize(0);
2
      Timer1.attachInterrupt(stopgap);  
3
      
4
    }
5
  }
6
}
7
8
void stopgap(){
9
  Timer1.initialize(8*SECOND);
10
  Timer1.attachInterrupt(after8Seconds);

Das heißt, ich lasse (Stopgap = Notlösung auf Eng.) einen Interrupt 
ausführen (ohne einer zeitlichen Vorgabe), dieser Springt in diese 
Not-Fkt. rein und danach läuft alles wie geschmiert.
ich wünschte ich könnte diesen unnötigen Schritt entfernen, aber ich 
komme zu keiner Lösung.

mfG
Tom

PS: Danke für den Tipp vorhin :)

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.