Zrobiłem sobie prosty układzik który reaguje na sygnał z modelarskiego odbiornika RC i w zależności od długości impulsu zapala diodę lub ją gasi. Układ jest programowany przyciskiem podłączonym między PD2 a masę. Wywołuje przerwanie które zapisuje czas trwania stanu wysokiego. Bez zapisu tego czasu do EEPROM można go wielokrotnie programować i działa od razu. Po dodaniu zapisu do EEPROM żeby układ zadział muszę wyłączyć i włączyć go ponownie, co nie jest zbyt wygodne.
Kod obsługi przerwania bez zapisu do EEPROM:
Kod: Zaznacz cały
SIGNAL ( SIG_INTERRUPT0 )
{
programmed = time;
}
Kod: Zaznacz cały
void save_pos( uint16_t pos )
{
eeprom_busy_wait();
eeprom_write_byte( (void *)0x0, 0xAA );
eeprom_busy_wait();
eeprom_write_word( (void *)0x1, pos );
}
SIGNAL ( SIG_INTERRUPT0 )
{
save_pos( time ); //Zapisz
programmed = time;
}
Kod: Zaznacz cały
#define T0_INIT 256-1
#define PRESCALER_1 _BV( CS00 )
void timer0_init( void )
{
TIMSK = _BV( TOIE0 );
TCNT0 = T0_INIT;
TCCR0 = PRESCALER_1;
}
SIGNAL ( SIG_OVERFLOW0 )
{
TCNT0 = T0_INIT;
counter++;
if ( overflow > 0 ) overflow--;
}
Gdzie robię błąd? Po ponownym włączeniu układ działa prawidłowo. I robię chyba jeszcze jakiś błąd w inicjacji zegara, bo wydaje mi się, że przerwanie jest wywoływane co 15us (a z taktowaniem 8MHz powinno być chyba wywoływane co 0,125us?)