För microkontrollers han man ofta behov av att manipulera enstaka bitar i ett register utan att påverka de andra bitarna.
Har tidigare jobbat med en C-kompilator (Cc5x) för PIC som tillåter detta med punktnotation, men nu vill jag göra samma sak i AVR/GCC som inte verkar ha ett direkt stöd för detta. Hittade tips enligt länk (http://www.moodle.tfe.umu.se/file.php/2 ... TipsTrix.c), men det kräver olika rutiner för att 1-ställa respektive 0-ställa en bit => för dåligt!
Pillade ihop ett par rutiner, som jag inte har testat på målsystemet ännu, bara i GCC. Vill kunna lägga dessa funktioner för att få en snyggare kod.
Kod: Markera allt
//Manipulerar en enstaka bit i ett register.
void writeBit(unsigned char *byte, unsigned char byteBit, unsigned char bitVal){
bitVal &= 0x01;
if(bitVal == 1){
*byte |= (0x01<<byteBit);
}else{
*byte &= ~(0x01<<byteBit);
}
}
//Returnerar värdet i en enstaka bit ur ett register
unsigned char readBit(unsigned char byte, unsigned char byteBit){
return (byte>>byteBit) & 0x01;
}
//Skriv i PORTA bit 2 till 0
writeBit(&PORTA,2,0);
//Läs ur PORTA bit 3
svar = readBit(PORTA, 3);
Kanske för klumpigt? Har någon ett bättre förslag? Eller berätta för mig om det finns något färdigt jag missat.