//====================== Simple RGB sensor : main.c ======================== // MELEARD Etienne // Year 2012 // ATMega8L @ 8MHz (internal RC oscillator) //========================================================================== //============================== WARNING ==================================// //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// // // // Fuses must be like -U lfuse:w:0xc4:m -U hfuse:w:0xd1:m // // // //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// //=========================================================================// // ========================================= // // == INCLUDES & MACROS == // // ========================================= // #include #include #include #include #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif // ========================================= // // == DEFINITIONS == // // ========================================= // // ================= FUSES ================= // // Run avrdude -c usbasp -p m8 -U lfuse:w:0xc4:m -U hfuse:w:0xd1:m at first (-F may be needed) // ================ PINOUTS ================ // #define LED_R Bit(PORTD).bitX #define LED_G Bit(PORTD).bitY #define LED_B Bit(PORTD).bitZ #define OUT_R Bit(PORTD).bit2 // MUST be continous #define OUT_G Bit(PORTD).bit1 #define OUT_B Bit(PORTD).bit0 #define LDR_CH ADCX // =============== CONSTANTS =============== // #define false 0 #define true 1 #define OFF 0 #define ON 1 #define LDR_SETTIME 100 // ms #define COLOR_NONE 0 #define COLOR_BLUE 1 #define COLOR_GREEN 2 #define COLOR_CYAN 3 #define COLOR_RED 4 #define COLOR_PURPLE 5 #define COLOR_YELLOW 6 #define COLOR_WHITE 7 // ================= INITS ================= // void init(void) { cli(); // Outputs // ADC ADCSRA = 0x80; // Manual mode, 64 prescaler (0.1ms/conv) ADMUX = LDR_CH; // Right adjust, external ref, XX channel sei(); } // =============== FUNCTIONS =============== // uint16_t getLevel(void) { ADCSRA |= 1< b) return a; return b; } // ============= MAIN FUNCTION ============= // int16_t main(void) { uint8_t color; uint16_t red, green, blue, base, trig; // Set up init(); // Startup dance setColor(COLOR_RED); _delay_ms(250); setColor(COLOR_GREEN); _delay_ms(250); setColor(COLOR_BLUE); _delay_ms(250); setColor(COLOR_NONE); _delay_ms(250); while(1) { // Get no-component legel for compensation base = getLevelForColor(COLOR_NONE); // Get compensated components levels red = getLevelForColor(COLOR_RED) - base; green = getLevelForColor(COLOR_GREEN) - base; blue = getLevelForColor(COLOR_BLUE) - base; // Level above which component is considered as present trig = max(max(red, green), blue) / 2; // Compute color color = COLOR_NONE; if(red > trig) color += COLOR_RED; if(green > trig) color += COLOR_GREEN; if(blue > trig) color += COLOR_BLUE; // Send value PORTN &= 0xMASK; PORTN |= color; } return 0; }