ATtiny25: веломигалка, вопрос по режиму сна и оптимизации
Добавлено: Пт авг 19, 2011 09:49:29
Из магазинной мигалки выбросил внутренности и вставил свои, см. приложенную схему.
Причина переделки - к родной схеме нет подключения тормозов и аж семь ненужных режимов мигания светодиодов - для выключения мигалки надо тыцнуть её кнопку семь раз.
Программа (комментарии на анг. потому как АВРСтудио не сохраняет русские:
Питание - от двух батареек АА, алгоритм таков:
схема постоянно включена, находимся в режиме ожидания с работающим таймером0, при вызове его прерывания проверяем включен-ли ночной режим (медленное мигание) выключателем SWITCH и нажат-ли концевой выключатель тормоза BRAKES (частое мигание). В зависимости от этого переключаем светодиоды и уходим из прерывания.
Светодиоды разнесены на разные порты для уменьшения тока на них.
Вопрос такой, не много-ли в режиме IDLE потребляет схема (400 мкА - это нормально)?
Он после выхода из прерывания восстанавливается?
Есть идеи по оптимизации схемы или кода?
Шо мыслите, пацаны, я буду крут на раёне?
Причина переделки - к родной схеме нет подключения тормозов и аж семь ненужных режимов мигания светодиодов - для выключения мигалки надо тыцнуть её кнопку семь раз.
Программа (комментарии на анг. потому как АВРСтудио не сохраняет русские:
Код: Выделить всё
/*
Bike brake and night backlight with attiny25, 5 leds, brakes button and on/off sliding switch
*/
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\sleep.h>
#include <avr\power.h>
#define F_CPU 1000000UL // Int. RC Osc. 8 MHz / CKDIV 8 = 1 000 000 MHz
#define R_LEDS PB4 //right leds (PIN # 3 on tiny25) from PB4 to right leds, then via R 56 Ohm to GND
#define L_LEDS PB1 //left leds (PIN # 6 on tiny25) from PB1 to left leds, then via R 56 Ohm to GND
#define M_LEDS PB0 //middle led (PIN # 5 on tiny25) from PB0 to middle led, then via R 56 Ohm to GND
#define BRAKES PB3 //brakes pin (PIN # 2 on tiny25) from PB3 to brakes button, then to GND
#define SWITCH PB2 //on switch (PIN # 7 on tiny25) from PB2 to to GND via switch
#define LEDS_ON PORTB |= _BV( R_LEDS ); PORTB |= _BV( L_LEDS ); PORTB |= _BV( M_LEDS );
#define LEDS_OFF PORTB &=~ _BV( R_LEDS ); PORTB &=~ _BV( L_LEDS ); PORTB &=~ _BV( M_LEDS );
uint8_t flag;
uint8_t counter;
uint8_t limit = 0;
// signal handler for timer interrupt TOV0
ISR(TIMER0_OVF_vect) {
//blinking routine
if ((PINB & (1 << BRAKES))) { //if brakes switch is off
limit = 10; //blinking pause is longer
} else {
limit = 1; //set pause shorter
}
if ((PINB & (1 << SWITCH))) { //if switch is off
flag = 0; //long blinking
} else {
flag = 1; //shorter
}
counter++;
if ((limit == 10 ) && (flag == 0)) {
LEDS_OFF
return; //if switch is off and brakes is not on - do nothing
}
if (counter > limit) { //switch leds on
LEDS_ON
counter = 0; //and reset counter
} else {
LEDS_OFF
}
}
int main(void) {
//PortB settings:
DDRB |= _BV( R_LEDS ); //output
DDRB |= _BV( L_LEDS );
DDRB |= _BV( M_LEDS );
DDRB &=~ _BV( BRAKES ); //input
DDRB &=~ _BV( SWITCH );
PORTB |= _BV( BRAKES ); //pull-up resistor is on
PORTB |= _BV( SWITCH );
TIMSK |= (1<<TOV0); //enable timer overflow interrupt
TCNT0=0x00; //set timer counter initial value
//prescaler for timer0
//TCCR0B |= (1 <<CS00)|(1<<CS02); //1024
TCCR0B |= (1<<CS02); //256
//TCCR0B |= (1 <<CS00)|(1<<CS01); //64
sei(); //enable interrupts
flag = 0; //initial flags
counter = 0;
power_all_disable(); //disable all power consumpting modules
power_timer0_enable(); //except timer0
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_enable();
for (;;) {
sleep_cpu();
}
}
схема постоянно включена, находимся в режиме ожидания с работающим таймером0, при вызове его прерывания проверяем включен-ли ночной режим (медленное мигание) выключателем SWITCH и нажат-ли концевой выключатель тормоза BRAKES (частое мигание). В зависимости от этого переключаем светодиоды и уходим из прерывания.
Светодиоды разнесены на разные порты для уменьшения тока на них.
Вопрос такой, не много-ли в режиме IDLE потребляет схема (400 мкА - это нормально)?
Он после выхода из прерывания восстанавливается?
Есть идеи по оптимизации схемы или кода?
Шо мыслите, пацаны, я буду крут на раёне?