Go Down

Topic: MsTimer2 und delay: nicht gemeinsam benutzbar? (Read 1 time) previous topic - next topic

Schwarzfuss

Spiele grad ein wenig mit der MsTimer2.zip rum,
http://www.arduino.cc/playground/Main/MsTimer2
dabei ist mir aufgefallen, das der Befehl delay(100) das Programm stoppt,
es gibt keine Ausgabe in der konsole, ein kleiner Beispielcode:
Code: [Select]
/*
Temparatur Messung mit Transistor 2N3055 als Sensor
Kollektor und Basis werden kurzgeschlossen und mit Pin 2 verbunden
Emitter liegt an GND, zusätzlich liegt ein Widerstand von ca. 1kOhm
zwischen Pin 2 und +5Volt
erfordert MsTimer2.zip
*/
#include <MsTimer2.h>

int pin_IN = 2;  // Sensor Eingang
int Wert_IN[3];  // Array für 3 Messwerte

void Werte_lesen() {
 for (int i=0; i <= 2; i++) {
   Wert_IN[i] = analogRead(pin_IN);  // Sensor auslesen und ins Array schreiben
   delay(100);                       // 100ms warten
   //delayMicroseconds(100000);      // 100ms warten
   Serial.print(Wert_IN[i]);         // temporäre Ausgabe, unwichtig
   Serial.print("-");                // temporäre Ausgabe, unwichtig
 }
 if (Wert_IN[0] == Wert_IN[1] && Wert_IN[1] == Wert_IN[2]) {
   Serial.print("Hurra erwischt! ");  // 3 gleiche Werte im Array = keine Fehlmessung
   Serial.println(Wert_IN[0]);        // temporäre Ausgabe, unwichtig
 }
}

void setup() {
 Serial.begin(115200);              // Baudrate für USB
 MsTimer2::set(2000, Werte_lesen);  // Aufruf alle 2000ms
 MsTimer2::start();
}

void loop() {
}

Ersetze ich delay(100) durch delayMicroseconds(100000) so läuft das Prg. problemlos,
ein Bug?

madworm

die timer2 bibliothek fuehrt deine funktion innerhalb des timer2 overflow interrupts aus. die delay funktion ruft millis() auf und millis() funktioniert nur, wenn sich der system-ticker erhoeht. dieser ist aber innerhalb von interrupt funktionen ausgeschaltet. daher wartet delay() auf den naechsten tick, der kommt aber nie.

Schwarzfuss

Schon mal vielen Dank für die Antwort madworm,
nur warum funktioniert es dann mit delayMicroseconds(100000)?

madworm

delayMicroseconds() verwendet nur die tatsache, dass gewisse assembler befehle in einem cpu tackt abgearbeitet werden. bei bekannter frequenz kann man so warteschleifen zusammenbasteln, die 1µs verzoegern.

Schwarzfuss

Ahja, langsam kommt Licht ins Dunkle.
Das die beiden Befehle so unterschiedlich ausgeführt werden,
war für mich nicht nachvollziehbar, vielen Dank!

Go Up