void toggle_led(enum led led) { // Set static mode and toggle LED(s) if (led == LED_ALL) { green_led.mode = LED_STATIC; apply_led(LED_GREEN, !green_led.active); red_led.mode = LED_STATIC; apply_led(LED_RED, !red_led.active); } else { leds[led]->mode = LED_STATIC; apply_led(led, !leds[led]->active); } }
void set_led(enum led led, bool value) { // Set static mode and enable / disable LED(s) if (led == LED_ALL) { green_led.mode = LED_STATIC; apply_led(LED_GREEN, value); red_led.mode = LED_STATIC; apply_led(LED_RED, value); } else { leds[led]->mode = LED_STATIC; apply_led(led, value); } }
void read_button(void){ _delay_ms(200); uint32_t lock_timer=0; start_timer(); if(LEFT_PRESSED){ old_led_selected = led_selected; led_selected = 0; RED_OFF;GREEN_OFF;BLUE_ON; if(power_mode==MODE_OFF){ if(unlock_stage==0 || unlock_stage==2){ unlock_stage+=1; old_led_selected = 1; } }else{ if(power_mode>MODE_LOW){ power_mode-=1; }else{ power_mode=1; } } apply_power(); while(LEFT_PRESSED){lock_timer+=1;if(lock_timer==100000){all_off();}}; apply_led(old_led_selected); _delay_ms(200); return; } if(RIGHT_PRESSED){ old_led_selected = led_selected; led_selected = 0; RED_OFF;GREEN_OFF;BLUE_ON; if(power_mode==MODE_OFF){ if(unlock_stage==1){ unlock_stage+=1; old_led_selected = 1; } }else{ if(power_mode>=MODE_LOW){ // проскакиваем аварийные режимы power_mode+=1; }else{ power_mode=MODE_LOW; } } apply_power(); while(RIGHT_PRESSED){}; apply_led(old_led_selected); _delay_ms(200); } }
void update_leds(void) { // Iterate LEDs uint8_t i; for (i=0; i<LED_COUNT; i++) { switch (leds[i]->mode) { case LED_FLASH: // Enable the LED in the first call if (!leds[i]->active) { apply_led(i, true); } // Disable the LED in the second call else { leds[i]->mode = LED_STATIC; apply_led(i, false); } break; case LED_BLINK: // Increment counter ++leds[i]->counter; // When the counter reaches the prescaler value if (leds[i]->counter >= leds[i]->prescaler) { // Reset the counter leds[i]->counter = 0; // Toggle LED apply_led(i, !leds[i]->active); } break; default: break; } } }
void all_off(){ stop_timer(); unlock_stage = 0; seconds = 0; d_seconds = 0; apply_led(0); power_mode = MODE_OFF; apply_power(); DRIVER_OFF; OCR0B=0; led_selected = 0; old_led_selected = 0; disable_adc(); clean_times_occured(); }
int main(void){ // PA0 - ADC IN // PA2 - RED // PA3 - GREEN // PA4 - BLUE // PA7(OC0B) - PWM output. // PB0 - out (EN) // PB1 - hall1, PB2 - hall2 DDRA = 0b11111110; PORTA = 0b00000000; DDRB = 0b0001; PORTB = 0b0110; TCCR0A = (1 << COM0B1) | (1 << WGM00);// | (1 << WGM01); // PWM mode TCCR0B = (1 << CS01); // clock source = CLK/8, start PWM PCMSK1 = (1<<PCINT9) | (1<<PCINT10); GIMSK = (1<<PCIE1);//interrupt on pin change0 ADMUX = 0b10000000; // ADC0 - int apply_led(1); DRIVER_ON; OCR0B = 8; _delay_ms(500); all_off(); eeprom_read_block(&seconds_on, &nv_seconds_on, sizeof(seconds_on)); eeprom_read_block(×_on, &nv_times_on, sizeof(times_on) ); eeprom_read_block(&max_on, &nv_max_on, sizeof(max_on) ); prev_power_mode = MODE_OFF; sei(); while(1){ // ADC8 = 330 - ~70 degrees Celcium // 9V = 714 // 10V = 793 // 11V = 872 // 12V = 951 // 12.6V = 999 if(power_mode==MODE_OFF && unlock_stage==0){ seconds = 0; d_seconds = 0; stop_timer(); disable_adc(); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_bod_disable(); sleep_cpu(); sleep_disable(); } if(seconds>1 && power_mode==MODE_OFF){ all_off(); } if(unlock_stage==0 && power_mode!=MODE_OFF){ if(d_seconds==0){ adc_channel = 0; ADMUX = 0b10000000; // ADC0 - int } if(d_seconds==5){ adc_channel = 1; ADMUX = 0b10100010; // int reference and temp sensor } if(seconds%2==0){ if(power_mode==MODE_LOW_VOLTAGE){ RED_ON;GREEN_OFF;BLUE_OFF; } if(power_mode==MODE_OVERTEMP){ RED_ON;GREEN_ON;BLUE_OFF; } }else{ if(power_mode==MODE_OVERTEMP||power_mode==MODE_LOW_VOLTAGE){ apply_led(0); } } // if((seconds%5==0) && ADMUX == 0b10000000){ //measure voltage in active mode if(adc_channel ==0 && d_seconds == 4){ //measure voltage in active mode if(val<LIMIT_9V){ if(check_and_set_times(0)){ all_off();//completely discharged. turning off } } else if(power_mode!=MODE_OVERTEMP && power_mode!=MODE_LOW_VOLTAGE && power_mode>=MODE_IDLE){ //show voltage always, except overtemp if(val<((LIMIT_9V+LIMIT_10V)/2)){ if(power_mode>=MODE_LOW && check_and_set_times(1)){ // усвловие нужно, чтобы не задалбывать функцию - в ней будут логи apply_led(0); power_mode = MODE_LOW_VOLTAGE;//low voltage apply_power(); } }else if(val<LIMIT_10V){ if(led_selected==0 || check_and_set_times(2) ){ apply_led(1); } led_selected = 1; }else if(val<LIMIT_11V){ if(led_selected==0 || check_and_set_times(3)){ apply_led(2); } led_selected = 2; }else{ if(led_selected==0 || check_and_set_times(4)){ apply_led(3); } led_selected = 3; } } } while(d_seconds==4){} if(adc_channel ==1 && d_seconds == 8){ //measure temp in active mode if(val>330 && power_mode>=MODE_LOW && check_and_set_times(5)){// усвловие нужно, чтобы не задалбывать функцию - в ней будут логи power_mode = MODE_OVERTEMP; apply_power(); //overtemp. reduce current cunsumption } } while(d_seconds==8){} if(power_mode==MODE_IDLE && seconds>=7200){ //выключение через два часа из режима простоя all_off(); } // if(seconds==0 && d_seconds<5 && power_mode>=MODE_LOW){ // GIMSK = 0;//вырубим прерывания на первые 500мс, чтобы не кнопать кнопкой сильно часто // }else{ // GIMSK = (1<<PCIE1);//interrupt on pin change0 // } } } }