Witam ponownie...
Kolejny dzień walki z tym.. i nadal bez większych rezultatów.
Udało mi się wprawdzie nie zawieszać już klocka przy próbie odczytania.. tylko, że wtedy nic się nie odczytuje.
W załącznikach przedstawiam kody 1, 2, 3, jakie próbowałem. Kod 3 jest na podstawie tego co kolega Andrzej mi podesłał. Liczę, że mnie wesprze w dostostowaniu go tak, by to zadziałało. Ale to zaraz.
Schemat
Poczytałem trochę o DS1307, komunikacji I2C i problemie zakłóceń w układzie, masie, itd. Udało mi się też wcisnąć LED'a, którego zalecał mi kolega wypowiadający się wcześniej. Mam dzięki temu dodatkową sygnalizację stanu pracy mikrokontrolera.
W kodzie pierwszym, w funkcji odczytywania czasu widać, gdzie się załącza. I tak też się zawiesza.
Ponadto dodałem dwa duże kondensatory przy przetwornicy, żeby odfiltrować to co się może dziać przy jej pracy. Dodałem też kondensator 470 nF przy uC (był już tam wcześniej 100 n, tak jak przy RTC). Ponadto podłączyłem zasilanie strony analogowej, a także w programie wszystkie nieużywane piny są ustawione jako wyjścia z pull'up'em. Na wyjściu zasilacza 5 V także dodałem większy kondensator. Uporządkowałem też nieco przewody zasilające i te z masą. Zlutowałem obudowę kwarcu RTC z masą.
Efekty widać na zrobionym dziś schemacie.
Nieco uprościłem, bo nie chciało mi się wszystkie dublować, przez to na wyjściu 4028 jest narysowany jeden tranzystor (w układzie jest 10, po jednym na każdą katodę lampy), a część anodowa lamp, powinna być x4. Poza tym wszystko chyba zostało ujęte. Poza jednym szczegółem.. jest jeszcze LED wpięty za regulatorem 5 V, sygnalizujący obecność napięcia 5 V.
Przetwornica HV jest taka jak na schemacie Mirley'a (
Link). Działa dobrze. Dodałem tam tylko teraz kondensatory filtrujące na wejściu, jak widać na schemacie i o czym wspomniałem wcześniej.
Ogólnie jak widać schemat mocno wzorowany na konstrukcji Mirley'a.
Kod 1.
W miejscu odczytywania dodałem załączanie się LED'a.
W momencie zawieszenia się.. obecnie niemalże od razu, diodka się zapala i nie gaśnie.
Eksperymentowałem i wydaje mi się, że zawiesza się już na pierwszej linijce.. "start_wait". Gdy zmieniłem na zwykły "start", program działał, ale nic się nie zaczytywało.
Innym winnym jest I2C_Stop. Dlaczego?
Ciekawostka: Program się zwiesza. Ale... gdy odłączam zasilanie, w momencie wygaszania się lamp, pokazuje się prawidłowy czas! Niby więc dane są odczytane. Ale nie są przekazane na wyświetlacz, bo program wisi.. W momencie wyłączenia, znika chyba najpierw zasilanie na DS1307, co odblokowuje linię I2C i program Atmegi mimo wszystko kontynuuje pracę... pokazując prawidłowy czas.
Ciekawostka 2: Podłączając zwykły miernik pod nóżki atmegi widać, że na SDA jest jakieś napięcie, a na SCL jest masa, tj 0 V. Niemal w ogóle nie skacze. Jakby linia ta zablokowała się na masie. To może być wina za małych/dużych rezystorów podciągających?
Kod 2.
Idąc tropem zmniejszenie skomplikowania kodu, popełniłem takie coś. Program się nie zawiesza, ale też zupełnie nic nie odczytuje. Kod zaczerpnięty z jakiejś strony z neta, gdzie była Atmega8 + DS1307 + LCD.
Kod 3.
Na podstawie linka wrzuconego przez kolegę Andrzeja.
Nie jestem pewny funkcji odbierania danych czasu.
Owszem, tutaj również się program nie zawiesza. Ale też nic nie odczytuje.
Na wyświetlacz dostaję 02 i 01. Odpowiednio dla godzin i dla minut. Czyli to co wpisuję w buff[1]. Wydawało mi się, że to kod dla rejestru, który chcemy odczytać, ale chyba się myliłem.. Nie wiem więc jak to wykorzystać lepiej
Mam nadzieję, że otrzymam wsparcie w tej materii. Procedura odczytu widoczna jest na pozostałych kodach, chociaż i tu się różni. Jednak najwłaściwsza jest chyba w kodzie 1.