Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATMega32][C] - PCF8563 - problem przy pierwszym uruchamianiu.

Kużdo 01 Lut 2015 17:07 768 5
  • #1 01 Lut 2015 17:07
    Kużdo
    Poziom 20  

    Witam,

    Mam problem z PCF8563, tzn. nie wiem do końca, czy to na pewno wina PCF8563, nie wiem jak sprawdzić czy jest sprawny, bo czas i datę zwraca poprawne.
    Problem polega na tym, że przy pierwszym załączaniu zasilania na płytce stykowej PCF8563 zachowuje się jakby zawiesił się. Wystarczy teraz tylko wyłączyć i włączyć zasilanie ponownie (od razu, bez przerwy) i układ działa poprawnie. Wyłączenie układu na chwilę dłużej powoduje, że PCF8563 nadal jest zawieszony, czyli tak jakby któryś kondensator go utrzymywał przy życiu podczas krótkiego wyłączenia zasilania... Co też jest dziwne, bo na zasilaniu PCF8563 nie mam żadnego kondensatora, mam tylko dwa na zasilaniu uC i to podłączone do masy jako filtrowanie.
    Kolejna sprawa to to, że przy zresetowaniu uC (przyciskiem) PCF zaczyna działać poprawnie, więc nie jestem do końca pewien czy to jego wina czy uC...

    Poniżej zamieszczam schemat płytki prototypowej, kod uC i krótki film przedstawiający problem.

    main.c

    Kod: c
    Zaloguj się, aby zobaczyć kod


    TWI.c
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Link

    0 5
  • #2 02 Lut 2015 18:21
    Kużdo
    Poziom 20  

    Sprawdzał może ktoś mój przypadek, ma ktoś może jakiś pomysł co mógłbym sprawdzić czy nikt nie spotkał się z takim problemem? Sprawa jest pilna :/

    0
  • #3 03 Lut 2015 15:44
    dondu
    Moderator Mikrokontrolery Projektowanie

    Ale coś "nie gra" w Twoim schemacie vs pierwsze zdanie z pierwszego postu.
    Vss to masa, a Vdd to zasilanie, a na schemacie jest odwrotnie.

    0
  • #4 03 Lut 2015 16:30
    Kużdo
    Poziom 20  

    Faktycznie, mój błąd, ale to tylko błąd na schemacie. Podłączenie jest poprawne na płytce :) Dodam, że po dodaniu CR2032 z dwoma diodami 1N4148 do PCFa problem ustąpił, dlatego że sam zegar jest non-stop zasilany, więc nie ma co się "zaciąć". Stawiam na jakiś błąd w kodzie programu, bo jak na filmie widać, po wciśnięciu przycisku reset (który resetuje tylko i wyłącznie uC) wszystko zaczyna działać. Wpadłem więc na pomysł, że jak wrócę to dodam jakieś opóźnienie przed pierwszym TWI, może po prostu za szybko chcę coś wysyłać, a zegar jeszcze "nie wystartował"...

    0
  • #5 04 Lut 2015 07:55
    zumek
    Poziom 39  

    Kuzdo napisał:
    ... Wpadłem więc na pomysł, że jak wrócę to dodam jakieś opóźnienie przed pierwszym TWI, może po prostu za szybko chcę coś wysyłać, a zegar jeszcze "nie wystartował"...

    Ja mam lepszy pomysł :D
    Sprawdź do czego służy rejestr TWSR.
    Poza tym, funkcje do obsługi magistrali TWI są non-reentrant, więc nie możesz ich używać tak, jak to zrobiłeś w swoim programie.

    0
  • #6 04 Lut 2015 09:51
    Kużdo
    Poziom 20  

    Wiem do czego służy ten rejestr i nie rozumiem co masz przez to na myśli. Jeśli sugerujesz, że powinienem za każdym razem sprawdzać status po poleceniu, to to robiłem, kod tutaj wklejony jest już trochę późniejszą wersją prób rozwiązania problemu i nie zawiera tych IFów, bo tylko zaciemniał mi kod, a nie wpływał w ogóle na działanie programu. Nawet ze sprawdzaniem statusów kod się wieszał na pętli while. Jednak dla pewności sprawdzę to jeszcze raz.

    Funkcje sam napisałem i nie rozumiem, czemu nie mogę robić tego tak jak jest, przecież nie wywołuję ich po kilka razy w tym samym czasie. Skończy się jedna funkcja, to rozpocznie się kolejna. Przerwania są włączane dopiero przed samą pętlą while(1), więc nie ma mowy, że coś poleci dwa razy, a ten jeden IF z flagą, to tylko dla testów do ustawienia konkretnej godziny. Tak czy siak nie ma to znaczenia, bo kod zatrzymuje się dużo wcześniej, jeszcze przed pętlą while.

    Zapomniałem w pierwszym poście napisać, ale po kodzie można domyślić się, gdzie kod się wiesza. A wiesza się dokładnie w tym momencie:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Czyli na pętli wewnątrz funkcji TWI_readNACK (tak, w kodzie jest błąd, sprawdzałem czy na ACK też będzie się wieszał, ale ma być NACK)

    0