#include #include #include #include "../lib/apps.h" #include "../lib/bughal.h" #include "../lib/util.h" #include "../lib/music.h" #include "../lib/usart.h" static void led_sound(void) { static bool discharge; static timer_t mytimer; uint16_t led1; uint16_t led2; if (mode_uninitialized) { mode_uninitialized = false; set_motor(MOTOR_OFF); ADMUX = (1 << REFS0); // use VCC reference ADCSRA = (1 << ADPS1) | (1 << ADPS0); // prescaler F_CPU/8 ADCSRA |= (1 << ADEN); // ADC enable - turn it on /*do one conversion*/ ADCSRA |= (1 << ADSC); while (ADCSRA & (1 << ADSC)) { /*wait for conversion to end */ } uint16_t __attribute__ ((unused)) dummy = ADCW; //read once timer_set(&mytimer, 10); discharge = true; } if (timer_expired(&mytimer)) { if (discharge) { DDRC |= (1 << PORTC0) | (1 << PORTC1) | //set LED Ports to output: (1 << PORTC2) | (1 << PORTC3); /*discharge*/ PORTC = (PORTC & 0b11110000); /*set C0 and C2 to input (disable pullups)*/ DDRC &= ~((1 << PORTC0) | (1 << PORTC2)); //set Led Ports to input /*pull ups off*/ PORTC &= ~((1 << PORTC0) | (1 << PORTC2)); discharge = false; } else { /*single measurement*/ ADMUX = (ADMUX & ~(0x1F)) | 0; // select channel 0 ADCSRA |= (1 << ADSC); // start single conversion while (ADCSRA & (1 << ADSC)) ; // wait for conversion to end led1 = ADCW; // read result ADMUX = (ADMUX & ~(0x1F)) | 2; // select channel 2 ADCSRA |= (1 << ADSC); // start single conversion while (ADCSRA & (1 << ADSC)) ; // wait for conversion to end led2 = ADCW; // read result #if 0 USART0_putc('1'); USART0_putc(':'); USART0_put_uint16(led1); USART0_crlf(); USART0_putc('2'); USART0_putc(':'); USART0_put_uint16(led2); USART0_crlf(); #endif music_setNote(400 + ((0x1ff - led1) + (0x1ff - led2)) * 5, 0); discharge = true; } timer_set(&mytimer, 2); //relaunch timer } //end if timer_expired } //end mode5 REGISTER(led_sound)