-
Nein, ich mein
while(forever)
if (pinx.Rx) portx.Tx = 1; else portx.Tx = 0;
ganz brutal.
Und dann
while(forever)
if (bTxFlag & RX_M_REVEICE)
if (pinx.Rx) portx.Tx = 1; else portx.Tx = 0;
( RX_M_Receive wird ja vom int0 gesetzt und im Timer nach 9 Bit gelöscht, also theoretisch genau ein Byte lang )
--M_DATA is mal wurst
-
Echo mag jetzt, wenn ma's echt so brutal macht :D
while(1)
{
// if (PD2.Rx) PORTD4.Tx = 1; else PORTD4.Tx = 0;
if(PIND&(1<<PD2))
{
PORTD |=(1<<PD4);
}
else
{
PORTD &= ~(1<<PD4);
}
}
Jetzt probier ich gleich mit RX_M_RECEIVE
(muss das nich if(bRxFlag & RX_M_RECEIVE) sein ??)
if(bRxFlag & RX_M_RECEIVE)
{
if(PIND&(1<<PD2))
{
PORTD |=(1<<PD4);
}
else
{
PORTD &= ~(1<<PD4);
}
}
}
Geht auch... also wird sozusagen Frame eingehalten...
Irgendwo wird zuviel Zeit verbraten ?? :-s
Also in der INT0 - ISR hab ich Timer0 auch weggelassen
-
Ah ja.
Jetzt machen wir INT0 wieder scharf wie vorgesehen
d.h (fast) alles wir vorher, nur das eigentliche Pind.2 -> Byte lesen in der Timer-ISR lassen wir mal weg, das Echo bleibt in der while-schleife
sollt ja gehen
Next: In der echo-kopie im while setzen wir nicht nur das tx-Pin, sondern auch das bRxByte.7 (das MSB). rotieren lassen wir aber die Timer-iSR
Und dann schicken wir in der while schleife das nun entstandene Byte auch mit der sende-routine weg
haben wir jetzt ein echo o.k und wieder ein türk y ?
(war das verständlich ? )
-
Hm Step 1 ok. Einfach inner Timer-ISR auskommentieren. Funkioniert auch.
Aber das mit 7. Bit setzen (bRxByte |=0x80;) inner while-Schleife, versteh ich grad net so ganz.. also was es bringt...
Jetzt ists ja so, das alles was an Bits bei PD2 ankommt gleich wieder an PORTD4 rausgschickt wird.
EDIT: Meinst du den ganzen Receive-Block von der Timer-ISR in die while-Schleife ziehen ?
-
der Gedanke ist:
Wir können die Bits in der while schleife offenbar richtig erkennen
wir brauchen diese Bits aber im rxbyte an der RICHTIGEN Stelle.
in der while schleife setzten wir das 7 Bit, und der Timer rotiert das Bit nach rechts, wenn baudratenmäßig das nächste dran ist.
Das wird zwar nicht stimmen, sonst hätten wir ja kein Problem, aber vielleicht können wir durch Vergleich Bit-Kopie-Echo und timermäßiges Byte-Echo das Problem einkreisen.
-
Receive-Block inner Timer-ISR:
Code:
if (bRxFlag & RX_M_RECEIVE) // receive ?
{
if (bRxCount == 9) // is this the stop-Bit (9th)
{
bRxFlag &= ~RX_M_RECEIVE; // receiving sequence done
bRxFlag |= RX_M_DATA; // signal data
GICR |= 1<<INT0; // re-enable int0 for next
}
else
{
bRxByte >>= 1; // Shift right data
/* if(PIND&(1<<PD2)) set bit or leave it
{
bRxByte |=0x80;
bRxCount++;
} */
while-Schleife:
Code:
while(1)
{
if(bRxFlag & RX_M_RECEIVE)
{
if(PIND&(1<<PD2))
{
PORTD |=(1<<PD4);
bRxByte |=0x80;
bRxCount++;
}
else
{
PORTD &= ~(1<<PD4);
}
}
}
-
Alles perfekt, aber das rxCount++ bleibt in der ISR
-
Ok, Echo funktioniert immer noch einwandfrei.
Probier jetzt die send_one_byte() aus
-
Gut, aber was steht jetzt im bRxByte ?
(zusätzlich in der while)
if (bRxFlag & RX_M_DATA)
{
bRxFlag &= ~RX_M_DATA;
_send (bRxByte);
}
-
Wie fast erwartet...
Bit-Kopie Echo passt mit send_byte wieder y