Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Atmega8, Problem z zapisem do EEPROM

adminek
-
-
Posty:1
Rejestracja:20 kwie 2007, o 15:28
Lokalizacja:Brodnica
Atmega8, Problem z zapisem do EEPROM

Postautor: adminek » 20 kwie 2007, o 15:31

Witam.

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 obsługi z zapisem do EEPROM:

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 przerwania zegarowego:

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--; }
Układ oparty jest na ATmega 8.
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?)

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości