No i wracam. Skończyłem dziś systematyzowanie kodu Teraz plik main wygląda tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
natomiast wyczyszczony plik do obsługi LCD wygląda tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Trochę jednak rozjechało formatowanie. Niestety nic - dosłownie nic nie zmieniło się w działaniu programu Nadal wyświetla godzinę na tle słabiej żarzących się zer.
Zauważam nadal jeszcze takie zjawisko:
Jeżeli w pętli głównej do funkcji wyświetlającej wpiszę na przykład takie wyrażenie:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
wszystko wyświetla się pięknie.
Tak samo wszystko działa, jeśli wyświetlę zmienną jako argument, której nadam wcześniej jakąś wartość.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Kiedy poszedłem o krok dalej i przy pomocy takiego kodu w pętli głównej :
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Chciałem tym osiągnąć to, żeby względnie wolno, tak aby dało się zauważyć jak zmienia się wartość licznika, widoczne były kolejne cyfry na wyświetlaczu.
Niestety to co zobaczyłem to tylko cyfrę 0001 Tak jakby utknęło na delayu. Ale nic. Usunąłem delaya Pomyślałem, że najwyżej będę widział tylko najwolniej zmieniającą się pierwszą cyfrę na wyświetlaczu.
Zobaczyłem jednak liczbę 0088 ze słabiej świecącym się segmentem "E" Tak więc wyciągam wniosek, że liczenie odbywa się. Jednak wiem, że uint_16_t potrafi zliczyć więcej niż do 99 (co sugeruje wynik) wiec ponownie wprowadziłem opóźnienie tym razem _delay_ms (10); Tym razem wyświetliły mi się trzy zera od lewej i na miejscu jedności cyfra 2 nałożona z cyfrą 1 Taka litera d z segmentem a. Wrodzona dociekliwość zmusiła mnie do zwiększenia opóźnienia, jednak większej wartości _delay_ms_ (50 dał mi stały nie zmieniający się wynik 0001.
Choć funkcja delay_ms() jest raczej niezawodna, postanowiłem za radą kolegów powołać przerwanie od przepełnienia licznika. Korzystając z mkAVRCalculator, i z zakładki AVR Timer Calculator postanowiłem skorzystać z przerwania od timera 1 w trybie normal jak wynika z tablicy z Wówczas będę miał przerwanie co 10 ms co przy ciągłym dodawaniu będzie dało mi możliwość zaobserwowania zmian nawet tej najszybciej zmieniającej się cyfry.

Więc w main'ie zrobiłem to tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wynikiem jest, zmieniająca się z częstotliwością 100 hz cyfra "0" na przemian z "1"
Nie wiem co jest powodem takiego zachowania
Wyświetla mi prawidłowo zmienne stałe więc program do LCD (musi być) raczej jest OK.
Nie zwiększa mi prawidłowo zmiennych w pętli ani przerwaniem ani delay'em
Jakie wnioski z tego wyciągać. Co mi radzicie jeszcze sprawdzić
Jeśli to obsługa wyświetlacza LED, to o czym zapomniałem. Nie mam zupełnie pomysłów
i brakuje już mi nerwów. Programy nie są obszerne, napisałem je wydaje mi się że przejrzyście więc
bardzo proszę rzućcie na nie okiem.