Zeit erfassen in µs Bereich

hallo miteinander,

ich habe mal wider eine verrückte Idee :slight_smile:

meine Schieblehren gehen nun und meine Zug wage auch.

Jedoch geht es mir nicht aus dem Kopf bei der Schieblehre die Zeiten des HIGH bzw. LOW zu erfassen und auszugeben.

laut der Beschreibung vom DOC_Arduino bewegen wir uns hier im Bereich von 6,3µs langen des LOW pegels.

Also dachte ich mir, das müsste ich doch hin bekommen das auch ausgeben zu können.

doch das ist irgend wie nicht ganz so einfach glaube ich, daher habe ich mir ein Test Programm geschrieben.

  1. Ausgabe eines Tabellen Kopfes
  2. Warten auf Tasten druck
  3. Schleife 60 mal durchführen
    3.1 Aktuelle Zeit nehmen
    3.2 Warten solange ein LOW Pegel anliegt -> weiter bei HIGH Pegel
    3.3 ID, "LOW" und Zeitdauer ausgeben
    3.4 Aktuelle Zeit nehmen
    3.5 Warten solange ein HIGH Pegel anliegt -> weiter bei LOW Pegel
    3.6 ID, "HIGH" und Zeitdauer ausgeben
    dann wider bei 3.0 weiter machen

ach ja die ID wird auch immer mit hoch gezählt.

das Ergebnis war dann auch fast so wie ich es mir dachte, nämlich 0
ich glaube das die Ausgabe über den Seriellen Monitor zu lange dauert.
und ich auch den Falschen Befehl für die Zeitmessung verwende, bzw.
die Variable falsch deklariere.

Könnte mir da jemand etwas unter die Ahme keifen, ... und mir sagen
ob das überhaupt so machbar ist,
oder ob alle Ergebnisse zu erst in ein Array Speichern sollte und dann am Schluss erst ausgeben
damit cih weniger Zeitverlust zwischen drin habe?

und ob ich die Zeit so richtig nehme, oder ob ich auf dem Totalen Holzweg bin mit dem was ich mache.

/*
    µC Arduino Mega 2560 (Getestet)
    November 2014
    
    Beide Signale vom Messschieber werden mittels OPV LM393 nicht invertierend auf 5V Pegel angehoben
    
    Test ist es die Pegel Länge (Zeit) von HIGH und LOW auszugeben, um ein Musster zu erkennen. 
    die zeiten bewegen sich im µs.
    
    Ports etc: http://greentechhobby.com/images/Arduino/ArduinoMega.pdf   
*/

  unsigned long temp_millis;                     // Variable für Zeitstempel 
  int Taster = 13;                               // Taster PIN  
  int ID = 0;                                    // Vortlaufende ID 
  int Clock = 24;                                // Clock Signal der Schieblehre
  
  
  
void setup()
  {
    Serial.begin(9600);                         // initialisiert die serielle Kommunikation mit 9600 Bits pro Sekunde:
    pinMode(Taster, INPUT);                     // Taster als Eingang festlegen
    pinMode(Clock, INPUT);                      // Clock Signal als Eingang festlegen
  }


// PIN 24 am Arduino Mega ist PORT = A    bit =  PA2

void loop()
  {
    Serial.println("ID \tTyp \tDauer");        // Tabelen Kopf ausgabe 

    while(digitalRead(Taster)== HIGH) { }              // warten bis Taster betätigt wurde
    while(digitalRead(Taster)== LOW)  { }              // warten bis Taster betätigt wurde

while(ID < 60)
  {
    ID++; Serial.print(ID); Serial.print("\t");        // ID ausgabe
    temp_millis = millis();                            // aktuelle Zeitnahme
    while ( !(PINA & (1 << PA2)) ) {}                  // wenn CLOCK auf LOW, dann warten bis wieder HIGH
    Serial.print("LOW \t"); Serial.println(millis() - temp_millis);     // TYP LOW und Zeitdauer asugeben 

    ID++; Serial.print(ID); Serial.print("\t");        // ID ausgabe
    temp_millis = millis();                            // aktuelle Zeitnahme
    while ( (PINA & (1 << PA2)) ) {}                   // wenn CLOCK auf HIGH, dann warten bis wieder LOW
    Serial.print("HIGH \t"); Serial.println(millis() - temp_millis);     // TYP HIG und Zeitdauer asugeben 
  } 
 
  
  while(digitalRead(Taster)== HIGH) { }                                     // warten bis Taster betätigt wurde
  while(digitalRead(Taster)== LOW) { }                                      // warten bis Taster betätigt wurde
  }

es gibt nicht nur millis() sondern auch micros()
Grüeß Uwe

OK danke für den hinwies.

Das habe ich jetzt umgesetzt jetzt komme ich schon näher in dir Regionen dir ich erwartet habe.
Danke.

zu der Frage ob es zeitlich was ausmacht das ich die Sachen alle direkt ausgebe oder in ein Array packen.

Gehe ich mal davon aus das es schneller ist vom Ablauf her das direkt in ein Array zu packen und das dann auszugeben.

darüber hinaus hätte ich da noch eine Verständnis frage zu den micros()

http://arduino.cc/de/pmwiki.php?n=Reference/Micros:
... Auf 16 MHz Arduino Boards (z.B. Duemilanove und Nano), hat diese Funktion eine Auflösung von 4 Mikrosekunden (d. h. der Rückgabewert ist immer ein Vielfaches von Vier). Auf 8 MHz Arduino Boards (z.B. dem LilyPad), hat die Funktion eine Auflösung von acht Mikrosekunden. ....

äh was?
ich kann auf meinem Maga also nicht 1µs ausgeben sondern immer nur in 4 Schritten?
also alles zwischen 1 und 4 ist immer gleich? oder wie muss ich das verstehen?

Ja. Das liegt daran, dass ein Funktionsaufruf Zeit dauert und ein paar Befehle am Anfang immer ausgeführt werden müssen.

EDIT:
Sehe gerade dass ich delayMicroseconds() mit micros() verwechselt habe :frowning: :frowning:

Aber der Grund ist ziemlich der gleiche. Die hast durch etwas Code außen herum einen gewissen Overhead. Der Code zum Messen kostet nun mal Zeit.

OK, ich habe verstanden das was ich mache braucht zu lange um die Zeiten richtig zu ermitteln.

doch der Rest ist für mich wie Chinesisch, ...

ich möchte doch keine pause von 1µs machen, sondern die Zeiten wie lange der Pegel auf LOW bzw. HIGH ist ausmessen.

Ich kann dir nicht folgen was du mir sagen möchtest :`(

Sorry, hatte gerade auch gemerkt dass ich einen Fehler gemacht hat. Das war für eine Delay Funkion. Vergiss es.

Aber der Grund weshalb micros() eine beschränkte Auflösung hat ist der gleiche.

ok, vergessen, da ich es nicht verstanden hatte ist das nicht gerade schwer wider zu vergessen :wink:

habe meinen Code nun umgeschrieben. Jetzt habe ich jedoch ein Ergebnis das für mich überhaupt nicht mehr logisch ausschaut :frowning:
bei dem vorher hat man zumindest ein paar Lücken drin gesehen gehabt.

irgend was mache ich Falsch dabei.
kann es sein das ich mit der Falschen den weise an die Sache heran gehe?

/*
    µC Arduino Mega 2560 (Getestet)
    November 2014
    
    Beide Signale vom Messschieber werden mittels OPV LM393 nicht invertierend auf 5V Pegel angehoben
    
    Test ist es die Pegel Länge (Zeit) von HIGH und LOW auszugeben, um ein Musster zu erkennen. 
    die zeiten bewegen sich im µs.
    
    Ports etc: http://greentechhobby.com/images/Arduino/ArduinoMega.pdf   
*/

  unsigned long temp_micros;                     // Variable für Zeitstempel 
  int Taster = 13;                               // Taster PIN  
  int ID = 0;                                    // Vortlaufende ID 
  int Clock = 24;                                // Clock Signal der Schieblehre
  unsigned long myData[60][2];                   // Hier ist HIGH = 1 LOW = 0, Zeitdauer 
  
  
void setup()
  {
    Serial.begin(9600);                         // initialisiert die serielle Kommunikation mit 9600 Bits pro Sekunde:
    pinMode(Taster, INPUT);                     // Taster als Eingang festlegen
    pinMode(Clock, INPUT);                      // Clock Signal als Eingang festlegen
  }


// PIN 24 am Arduino Mega ist PORT = A    bit =  PA2

void loop()
  {
    Serial.println("ID \tTyp \tDauer");                // Tabelen Kopf ausgabe 

    while(digitalRead(Taster)== HIGH) { }              // warten bis Taster betätigt wurde
    while(digitalRead(Taster)== LOW)  { }              // warten bis Taster betätigt wurde

while(ID < 60)
  {
    ID++;                                              // ID Hochzählen
    temp_micros = micros();                            // aktuelle Zeitnahme
    while ( !(PINA & (1 << PA2)) ) {}                  // wenn CLOCK auf LOW, dann warten bis wieder HIGH
      myData[ID][1] = 0;                               // Pegel Type Speichern 
      myData[ID][2] = micros() - temp_micros;          // Pegel Dauer Speichern

    ID++;                                              // ID Hochzählen
    temp_micros = micros();                            // aktuelle Zeitnahme
    while ( !(PINA & (1 << PA2)) ) {}                  // wenn CLOCK auf LOW, dann warten bis wieder HIGH
      myData[ID][1] = 1;                               // Pegel Type Speichern 
      myData[ID][2] = micros() - temp_micros;          // Pegel Dauer Speichern
  } 

  Serial.println("Fertig");
    for (ID = 0; ID < 60; ID++)
      {
         Serial.print(ID);
         Serial.print("\t");  
         if (myData[ID][1] == 0){ Serial.print("LOW"); } else { Serial.print("HIGH"); }
         Serial.print("\t"); 
         Serial.println(myData[ID][2]);         
      }
  
  while(digitalRead(Taster)== HIGH) { }                                     // warten bis Taster betätigt wurde
  while(digitalRead(Taster)== LOW) { }                                      // warten bis Taster betätigt wurde
  }