Forum: Mikrocontroller und Digitale Elektronik Arduino: Frage zu TimerOne


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Tom V. (dertomfun)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.