In some compilers like codevisonAVR you can access individual bits using PINA.0 or PORTA.2, to do a similar thing with avrgcc you can use
A better way and faster is to use these macro
And the third way are these two macros defined in sfr_defs.h
Alex
Code C - [expand] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // structure to allow bit field operations, name conversions: PORTA.0 -> PORT_A.b0 PORTB.7 -> PORT_B.b7 typedef struct{ uint8_t b0:1; uint8_t b1:1; uint8_t b2:1; uint8_t b3:1; uint8_t b4:1; uint8_t b5:1; uint8_t b6:1; uint8_t b7:1; } bits; // define all the ports of your microcontroller, add more ports depending on the available mcu ports #define PORT_A (* (volatile bits *) &PORTA) #define PIN_A (* (volatile bits *) &PINA) #define DDR_A (* (volatile bits *) &DDRA) #define PORT_B (* (volatile bits *) &PORTB) #define PIN_B (* (volatile bits *) &PINB) #define DDR_B (* (volatile bits *) &DDRB) // then you can use specific bits like this to write or read specific bits PORT_A.b0=1; // write value to PORTA bit 0 PIN_B.b4=0; // write value to PINB bit 4
A better way and faster is to use these macro
Code C - [expand] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // add this defines #define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT)) #define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT)) #define FLIPBIT(ADDRESS,BIT) (ADDRESS ^= (1<<BIT)) #define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT)) #define WRITEBIT(RADDRESS,RBIT,WADDRESS,WBIT) (CHECKBIT(RADDRESS,RBIT) ? SETBIT(WADDRESS,WBIT) : CLEARBIT(WADDRESS,WBIT)) // and then you can use SETBIT(PORTX,2); // set bit2 of portx (set to 1) SETBIT(PORTY,0); // set bit0 of porty CLEARBIT(PORTX,5); // clear bit5 of portx (set to 0) FLIPBIT(PORTX,2); // invert bit2 of portX, if it was 1 it becomes 0, and if 0 becomes 1 // example for portx 0x10101010 the result is 0x10101110 if (CHECKBIT(PORTX,4)) {} else {} // result is true if bit4 of portx is 1, false if it is 0 if (!CHECKBIT(PORTX,4)) {} else {} // result is true if bit4 of portx is 0, false if it is 1 WRITEBIT(PORTX,0,PORTY,2); // copy the bit0 of portx to bit2 of porty
And the third way are these two macros defined in sfr_defs.h
Code C - [expand] 1 2 if(bit_is_set(PINC,0)) //this can check if a bit is 1 if(bit_is_clear(PINC,0)) // this can check if a bit is 0
Alex