Witam, zbudowałem klasyczny zegar, tak jak w temacie napisałem na ATmega32, Chińskim module z układem DS1307 i z jakąś pamięcią na I2C której nie używam, czas pokazywany jest na wyświetlaczu LED. Wcześniej testowałem sobie to wszystko z wyświetlaczem LCD 2x16 HD44780 wszystko śmigało mi super. Po dodaniu LCD i multipleksowania zegar po kilku, kilkunastu sekundach, czasami po kilku minutach się zatrzymuje, wyświetlacz pokazuje ten sam czas. Szukałem przyczyny tej wady na wiele sposobów i znalazłem ale nie rozumiem dlaczego tak się dzieje. Powodem zatrzymywania zegara jest częstotliwość multipleksowania wyświetlacza. Jeżeli przykładowo skonfiguruję TIMER2 który generuje przerwanie dla multipleksowania w ten sposób
To zegar dział przez 24h i wszystko było ok. ale jeżeli do rejestru OCR wpiszę choćby 19 to zegar się zatrzymuje. Jeżeli ktoś by znalazł błąd w kodzie i byłby uprzejmy wyjaśnić mi przyczynę tego problemu to był bym wdzięczny. Dodaję kody pliku main.c i plików do obsługi multipleksowania. Kodów do I2C załączyć nie mogę bo nie są mojego autorstwa, pochodzą one z bluebooka pana Mirosława Kardasia.
main.c
multipleks.c
multipleks.h
Dodam jeszcze że wcześniej bibliotekę do multipleksowania używałem z różnymi wartościami OCR ale bez zegara i wszystko zawsze działało. Czyżby od TIMERA2 i INT0 nie chciały ze sobą współpracować? Z TIMEREM2 miałem to samo, TIMERA1 nie używałem.
TCCR2 |= (1<<WGM21); //Tryb CTC
TCCR2 |= (1<<CS20)|(1<<CS21)|(1<<CS22); //preskaler 1024
OCR2 = 0; //wartość przepełnienia
TIMSK |= (1<<OCIE2); //zezwolenie na przerwanie ComtareeMatchTo zegar dział przez 24h i wszystko było ok. ale jeżeli do rejestru OCR wpiszę choćby 19 to zegar się zatrzymuje. Jeżeli ktoś by znalazł błąd w kodzie i byłby uprzejmy wyjaśnić mi przyczynę tego problemu to był bym wdzięczny. Dodaję kody pliku main.c i plików do obsługi multipleksowania. Kodów do I2C załączyć nie mogę bo nie są mojego autorstwa, pochodzą one z bluebooka pana Mirosława Kardasia.
main.c
Kod: C / C++
multipleks.c
Kod: C / C++
multipleks.h
Kod: C / C++
Dodam jeszcze że wcześniej bibliotekę do multipleksowania używałem z różnymi wartościami OCR ale bez zegara i wszystko zawsze działało. Czyżby od TIMERA2 i INT0 nie chciały ze sobą współpracować? Z TIMEREM2 miałem to samo, TIMERA1 nie używałem.
