logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

DS1307 z ATmega328P wyświetla 00:00:80 i zatrzymuje się - brak odmierzania czasu

mepytator 17 Cze 2019 10:02 750 5
  • #1 18015467
    mepytator
    Poziom 2  
    Witam
    Od jakiegoś czasu próbuję uruchomić pierwszy projekt na mikrokontrolerze ATmega328P. Ma to być zegarek oparty o moduł RTC DS1307. W Internecie znalazłem dość dobrze opisany kod autorstwa Bruce E. Hall, na stronie internetowej W8BH (nie mogę wklejać linków, ale bardzo łatwo go znaleźć w Google), który postanowiłem wykorzystać. Przypisałem wszystkie piny i porty, podłączyłem wszystko według schematu, program kompiluje się bezproblemowo, jednakże po podłączeniu do zasilania przez około minutę wyświetlacz pokazuje:
    Ready.
    Found a0 d0


    po czym wyskakuje wartość
    00:00:80
    01/01/00


    i na tym działanie programu się kończy, zegarek po prostu nie odmierza czasu. Odpowiedzi szukałem zarówno tutaj jak i na wielu innych forach, ale niestety nie znalazłem rozwiązania mojego problemu :( z góry dziękuję za pomoc

    Lekko zmodyfikowany przeze mnie kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 18015764
    bart-projects
    Poziom 29  
    Mogę się mylić bo dawno nie używałem DS1307, zamiast niego używam kompatybilny DS2331, niemniej zmierzam do puenty.
    Ten drugi nie rusza dopóki nie ustawisz w nim jakiegoś czasu. Spróbuj, po prostu, użyć tej funkcji SetTimeDate()
    Jeśli nadal nie będzie chciał ruszyć to przyjrzyj się temu rezonatorowi kwarcowemu. W przypadku jego uszkodzenia można się z układem komunikować, ale zegar właśnie stoi. Rezonatorek może mieć zwarte nóżki bądź którąś zwartą np. do masy.
  • #3 18015799
    mepytator
    Poziom 2  
    Rzeczywiście, wrzucenie funkcji SetTimeDate() do głównej części programu pomogło, dzięki za pomoc :D
  • #5 18023708
    prawicowiec
    Poziom 9  
    Witam

    Dołączę się do tematu

    Pobrałem przykładowe kody stąd Link

    Wywołuję funkcję RTC_Clock_Write() i po jednym wysłaniu blokuje się procek (wysyłane są wszystkie dane). Dla testu zakomentowałem wszystkie I2C_Write() i wtedy nie blokuje się. Nie wiem gdzie jest problem

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ATmega32A-AU
    8MHz internal
    SCL PC0
    SCA PC1

    Dodano po 1 [godziny] 13 [minuty]:

    Podobnie jest z kodem, który podał szanowny kolega

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dobrze odczytuje czas (sprawdziłem analizatorem stanów logicznych) ale tylko raz potem blokuje się
  • #6 18025510
    prawicowiec
    Poziom 9  
    Dobra teraz za głośno się nie śmiejcie ale brakowało rezystorów pullup na liniach I2C. Dawno lutowałem i byłem przekonany, że przylutowałem, a jednak ich nie było :D

    Sekundy zlicza 2-3x szybciej czy to wina rezonatora ?
REKLAMA