Hallo,
ich versuche vom Messschieber die 2x 24 Bit einzulesen. Als Vorlage diente ein Artikel aus der c't Hardware Hacks 4-2013. Dort reichte aber 1x24Bit mit anderen Takt/Data Zyklen.
Jetzt habe ich mir die Logiklevel anzeigen lassen und versucht die Timings auszulesen. Hier bin ich bestimmt auf dem Holzweg bin. :~
// Messschieber mittels OPV LM393 angeschlossen, nicht invertierend
// Arduino Mega 2560
int i;
int LED = 7;
long value;
unsigned long FirstData;
unsigned long SecondData;
int clockpin = 24;
int datapin = 25;
unsigned long Start_LOW;
unsigned long Ende_LOW;
unsigned long Dauer_LOW;
unsigned long Start_HIGH;
unsigned long Ende_HIGH;
unsigned long Dauer_HIGH;
void setup() {
Serial.begin(9600);
pinMode(clockpin, INPUT);
pinMode(datapin, INPUT);
pinMode(LED, OUTPUT);
}
void loop () {
while (digitalRead(clockpin)==LOW) {} // wenn Clock HIGH warte bis er LOW ist
Start_LOW = micros(); // aktuellen Zeitpunkt einlesen
while (digitalRead(clockpin)==HIGH) {} // warten bis Clock wieder HIGH ist
Ende_LOW = micros();
while (digitalRead(clockpin)==LOW) {} // warten bis Clock wieder LOW ist
Ende_HIGH = micros();
Dauer_LOW = Ende_LOW - Start_LOW; // Länge LOW Pegel
Dauer_HIGH = Ende_HIGH - Ende_LOW; // Länge HIGH Pegel
if ((Dauer_LOW > 30) && (Dauer_HIGH < 50)) // der Start 46µs HIGH-Pegel soll eingefangen werden
{
decode(); //decode the bit sequence
}
} // Ende loop
void decode() {
digitalWrite(LED, HIGH);
FirstData=0;
SecondData = 0;
for (i=0;i<23;i++) // die ersten 24 Bit einlesen
{
while (digitalRead(clockpin)==LOW) {} // warten bis Clock wieder auf LOW ist
while (digitalRead(clockpin)==HIGH) {} // warten bis Clock wieder auf HIGH ist, dann Data einlesen
if (digitalRead(datapin)==HIGH)
{
if (i<20)
{
FirstData = FirstData | (1<<i); // Bit einlesen mit ODER verknüpfen und eine Stelle nach links
} // Kurzform: value|=1<<i;
}
} // Ende 24 Bit einlesen
for (i=0;i<23;i++) // die zweiten 24 Bit einlesen
{
while (digitalRead(clockpin)==LOW) {} // warten bis Clock wieder auf LOW ist
while (digitalRead(clockpin)==HIGH) {} // warten bis Clock wieder auf HIGH ist, dann Data einlesen
if (digitalRead(datapin)==HIGH)
{
if (i<20)
{
SecondData = SecondData | (1<<i); // Bit einlesen mit ODER verknüpfen und eine Stelle nach links
}
}
} // Ende 24 Bit einlesen
Serial.print("First ");
Serial.println(FirstData,BIN); // die ersten 24 Bit
Serial.print("Second ");
Serial.println(SecondData,BIN); // die zweiten 24 Bit
digitalWrite(LED, LOW);
//delay(1000);
}
Im Serialmonitor bekomme ich solchen Müll angezeigt, wenn ich oben versuche den 46µs High Pegel einzufangen. Bekomme also keine stabilen 32Bit Binärwerte.
Die Kontroll LED blinkt gut sichtbar im Takt. Wäre für mich aber eher ein Zeichen das etwas schief läuft. Denn der die müßte ca. im 2ms Takt leuchten, womit ich die LED nicht locker blinken sehen dürfte.
Am Anfang dachte ich, ich muß nur warten bis der Lowpegel länger als 900µs dauert. Dann passiert aber gar nichts. Möglicherweise täusche ich mich hier und der steht keine 964µs an.
Wie fängt man den Anfang richtig ein?
First 11111111111111111010000000000100
Second 10100000000000
First 11111111111111111111000000010011
Second 10011010111
First 11111111111111111101000000010011
Second 10011100111
First 11111111111111111010000000000011
Second 1001101011111
First 11111111111111111011000000010011
Second 100110001111
First 10000000000100
Second 10010000000000
First 11111111111111111000000000100100
Second 10110000000000
First 10000000000010
Second 101000000000000
First 11111111111111111100000000010011
Second 1010001111
First 11111111111111111010000000000101
Second 110001111
First 10010
Second 100110101111
First 1000000010011
Second 100101111
First 11111111111111111110000000000011
Second 100111001111
First 11111111111111111010000000000011
Second 10001001111
First 1000000010011
Second 1011000000000
First 100000000010010
Second 1110000000000
First 11
Second 100000000000000
First 110000000000010
Second 10000000000000
First 110000000000100
Second 10100000000000
First 110000000000010
Second 11111111111111111001010000000000
First 110000000100100
Second 1010000000000
First 10000000100100
Second 10010000000000
First 11111111111111111010000000000010
Second 10010000000000
First 110000000000010
Second 101010000000000
First 10010
Second 10010000000000
First 110000000000010
Second 11111111111111111001011000000000