> hättest du da einen vorschlag?
Ich misch mir mal wieder ein: Nimm ein Startsymbol (dazu), z.B. eine '1'
[*] vorne dran. Dann heisst das für den Empfänger: Solange am Eingang
eine '0' ankommt, sendet das Gegenüber nix - Zeit zum Nasebohr^Wnixtun:
1 | while (!SIGNAL_IS_SET()) ;
|
Irgendwann kommt dann mal was an (dann wird obige Schleife beendet),
sicherheitshalber überprüfst Du das Startbit nach einer halben
Signaldauer nochmals (könnte ja auch eine Störung auf der Leitung
gewesen sein):
1 | _delay_us(500);
|
2 | if (!SIGNAL_IS_SET()) {
|
3 | // Sonnenwinde..
|
4 | $zurück_auf_los/return/break/panic/..
|
5 | }
|
Ab jetzt kannst Du (behelfsmäßig.. für die paar Bits sollte die
Genauigkeit langen) die Bits Busy-wartend auslesen - noch immer
(absichtlich) eine halbe Signallänge 'phasenverschoben' damit man nicht
auf der Signalflanke landet:
1 | uint8_t result = 0;
|
2 | for (int i = 0; i < 8; i++) {
|
3 | result <<= 1;
|
4 | result |= SIGNAL_IS_SET() ? 1 : 0;
|
5 | _delay_ms(1);
|
6 | }
|
Abschließend noch die defines:
1 | #define SIGNAL 1
|
2 | #define SIGNAL_PIN PINB
|
3 | #define SIGNAL_IS_SET() ( SIGNAL_PIN & _BV(SIGNAL) )
|
Noch ein bisschen umsortieren und verpacken dann feddisch.
HTH
[*] Oder eine '0', ggf. mit Pullup oder -down an der Leitung, oder wie
im Ursprungsposting angedeutet mit einem Push-Pull-Ausgang.