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.
Ausgabe eines Tabellen Kopfes
Warten auf Tasten druck
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
}
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?
ok, vergessen, da ich es nicht verstanden hatte ist das nicht gerade schwer wider zu vergessen
habe meinen Code nun umgeschrieben. Jetzt habe ich jedoch ein Ergebnis das für mich überhaupt nicht mehr logisch ausschaut
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
}