Morgen, da sind wir wieder !
ist klar, das ist der Unterschied "&" und "==". EgalZitat von schamp
Ein neues Spiel, ein neues Glück:
Wir machen die Counterei zu Fuß, vergleichen dann mit dem Timer-ISR Ergebnis und erhoffen Weisheiten.
Dazu senden wir immer nur das Zeichen 0x55, das ergibt mit start und stop genau das Muster 0 10101010 1, dadurch kriegen wir die Bitwechsel auch ohne Time genau mit. die erste Flanke zum Startbit kriegt ja der INT0, der setzt RX_M_RECEIVE, und dann geht's los
(dabei läuft die Timer0-ISR ganz normal, nur
RX_M_DATA setzt er NICHT und
RX_M_RECEIVE löscht er NICHT, das machen wir jetzt extra)
send_one_byte(bRxCount + 0x30);Code:unsigned char bOld = 0; // wegen den Flanken unsigned char bCnt = 0; // vergleichszähler // in der INT0 ISR zusätzlich bOld = 0; bCnt = 0; // in der while(1) -schleife if (bRXFlag & RX_M_RECEIVE) { if ( ( PIND & (1<<PD2)) ^ bOld & (1<<PD2)) // any Flanke ? { if (bCnt & 0x08) { bRXFlag &= ~RX_M_RECEIVE; bRXFlag |= RX_M_DATA; } else { bOld = PIND; bCnt++; bRxByte >>= 1; } } if ( PIND & (1<<PD2)) { PORTD |=(1<<PD4); bRxByte |=0x80; } else { PORTD &= ~(1<<PD4); } } if (bRXFlag & RX_M_DATA) { bRxFlag &= ~RX_M_DATA; send_one_byte(bRxCount + 0x30); }
Wir senden den Byte-Zähler, den die Timer0-ISR zu diesem Zeitpunkt gerade hat. Der sollte ja eigentlich auch ca 8 oder 9 sein. Ist er weiter weg, können wir abschätzen, wo die Differenz liegt
( + 0x30) --> damit das ein druckbares zeichen wird und wir es lesen können.
0x30 ---> "0"
wie gesagt, kann nur funzen, wenn 0x55 = "U" geschickt wird, wegen des Bit musters
Verständlich ?
Lesezeichen