AVR C fråga, bit_is_clear/set vimsig?
Postat: 23 juli 2012, 02:22:50
Hej på er,
Sitter med ett AVR projekt, som skrivs i C, där jag har problem med att avläsa ett värde från UARTen.
Jag skickar ett enstaka tecken, exempelvis "0" (noll).
Detta tecken, i binärt, ser ju ut som 0000.
Om jag då med följande kod;
.. tittar ifall bitReply biten är satt, som i mitt fall är bit 0, på inkommande datan från UART (ett tecken) så ska jag få ett "No Reply" värde på displayen. Här är allt korrekt och det fungerar.
Det fungerar så länge jag skickar ett tecken mellan 0-9. Men när jag går upp på hex värdena, A-F så blir det istället inverterat. Det vill säga, jag behöver då alltså använda bit_is_clear för att få samma funktion på tecken A-F.
Det känns lite mysko, eller ska det vara så?
Jag behandlar inte inkommande data på något sätt, jag testar data direkt när det tas emot i en ISR rutin. Det hela är väldigt mycket på debug stadie just nu, så det ska snyggas till och ändras en del. Men jag vill ju att det ska se rätt ut redan på debug stadiet, annars blir det ju jobbigt när man tar bort den enkla vägen för att se vad man får in i processorn
Vidare verkar det som om värdet "f" bara innehåller binära bitarna 1 och 2 men inte 0 och 3.. när jag som ovan kör en kodsnutt som tar fyra lysdioder och visar det binära värdet;
I headern på main.c filen har jag följande;
Detta ska då sätta ett namn på de olika bitarna. Ja.. ni kan ju sånt 
Att notera, det fungerar helt utmärkt med värden 0-9 på samtliga lysdioder, men så fort man går upp på A-F så blir det fel
Hoppas det går att förstå när jag skriver i nattmössan
Tack på förhand för att ni tittar in
Edit...
Ok, nu kom jag på att jag skickar i decimal istället för i hex.. ändrade jag det så fungerar det!
Men jag är nu orolig för om jag "lyckas" skriva exempelvis ett eget terminalprogram på PC som klarar att skicka just i hex.. Samma sak för hur jag ska få exempelvis en annan AVR att kommunicera med min första AVR genom att skicka hex över UART..
Är det något speciellt jag behöver tänka på här?
Sitter med ett AVR projekt, som skrivs i C, där jag har problem med att avläsa ett värde från UARTen.
Jag skickar ett enstaka tecken, exempelvis "0" (noll).
Detta tecken, i binärt, ser ju ut som 0000.
Om jag då med följande kod;
Kod: Markera allt
if (bit_is_set(data, bitReply))
{
LCDGotoXY(0,0);
LCDWriteString("Reply");
PORTB &= ~(1<<bitReply);
}
else
{
LCDGotoXY(0,0);
LCDWriteString("No Reply");
PORTB |= 1<<bitReply;
}
Det fungerar så länge jag skickar ett tecken mellan 0-9. Men när jag går upp på hex värdena, A-F så blir det istället inverterat. Det vill säga, jag behöver då alltså använda bit_is_clear för att få samma funktion på tecken A-F.
Det känns lite mysko, eller ska det vara så?
Jag behandlar inte inkommande data på något sätt, jag testar data direkt när det tas emot i en ISR rutin. Det hela är väldigt mycket på debug stadie just nu, så det ska snyggas till och ändras en del. Men jag vill ju att det ska se rätt ut redan på debug stadiet, annars blir det ju jobbigt när man tar bort den enkla vägen för att se vad man får in i processorn

Vidare verkar det som om värdet "f" bara innehåller binära bitarna 1 och 2 men inte 0 och 3.. när jag som ovan kör en kodsnutt som tar fyra lysdioder och visar det binära värdet;
Kod: Markera allt
if (bit_is_set(data, bitReply))
{
LCDGotoXY(0,0);
LCDWriteString("Reply");
PORTB &= ~(1<<bitReply);
}
else
{
LCDGotoXY(0,0);
LCDWriteString("No Reply");
PORTB |= 1<<bitReply;
}
if (bit_is_set(data, bitChecked))
{
PORTB &= ~(1<<bitChecked);
}
else
{
PORTB |= 1<<bitChecked;
}
if (bit_is_set(data, bitSubType1))
{
PORTB &= ~(1<<bitSubType1);
}
else
{
PORTB |= 1<<bitSubType1;
}
if (bit_is_set(data, bitSubType2))
{
PORTB &= ~(1<<bitSubType2);
}
else
{
PORTB |= 1<<bitSubType2;
}
Kod: Markera allt
#define bitReply 0
#define bitChecked 1
#define bitSubType1 2
#define bitSubType2 3

Att notera, det fungerar helt utmärkt med värden 0-9 på samtliga lysdioder, men så fort man går upp på A-F så blir det fel

Hoppas det går att förstå när jag skriver i nattmössan

Tack på förhand för att ni tittar in

Edit...
Ok, nu kom jag på att jag skickar i decimal istället för i hex.. ändrade jag det så fungerar det!
Men jag är nu orolig för om jag "lyckas" skriva exempelvis ett eget terminalprogram på PC som klarar att skicka just i hex.. Samma sak för hur jag ska få exempelvis en annan AVR att kommunicera med min första AVR genom att skicka hex över UART..
Är det något speciellt jag behöver tänka på här?