Arduino Forum

Forum 2005-2010 (read only) => International => Deutsch => Topic started by: Schwarzfuss on Jul 12, 2009, 06:41 pm

Title: MsTimer2 und delay: nicht gemeinsam benutzbar?
Post by: Schwarzfuss on Jul 12, 2009, 06:41 pm
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?
Title: Re: MsTimer2 und delay: nicht gemeinsam benutzbar?
Post by: madworm on Jul 12, 2009, 08:15 pm
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.
Title: Re: MsTimer2 und delay: nicht gemeinsam benutzbar?
Post by: Schwarzfuss on Jul 12, 2009, 09:14 pm
Schon mal vielen Dank für die Antwort madworm,
nur warum funktioniert es dann mit delayMicroseconds(100000)?
Title: Re: MsTimer2 und delay: nicht gemeinsam benutzbar?
Post by: madworm on Jul 12, 2009, 10:09 pm
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.
Title: Re: MsTimer2 und delay: nicht gemeinsam benutzbar?
Post by: Schwarzfuss on Jul 13, 2009, 07:17 pm
Ahja, langsam kommt Licht ins Dunkle.
Das die beiden Befehle so unterschiedlich ausgeführt werden,
war für mich nicht nachvollziehbar, vielen Dank!