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.

[C] PIC18F + DS1307 błąd odczytanych danych

cziepkins 05 Cze 2012 00:18 2270 21
  • #1 05 Cze 2012 00:18
    cziepkins
    Poziom 8  

    Witam,

    Mam kolejny problem z moim projektem. Wiem, że temat ds1307 jest bardzo popularny. Przeczytałem już chyba 10 razy dokumentacje DS1307, kilka przykładowych kodów do obsługi oraz wszystkie możliwe posty na elektrodzie dotyczące tego układu i nadal nie rozwiązałem mojego problemu.

    Od razu powiem, że mam odpowiednie napięcia na układzie - zasilanie i bateria podłączone. Między 5V a GND mam kondensator. Linie SDA i SCL podpięte do 5V przez rezystory 4k7.

    Problem polega na tym, że po inicjacji układu i ustawieniu daty oraz czasu pobieram dane i próbuje je wyświetlić na LCD. Cały czas mam wyświetlone wartości 00.

    Poniżej zamieszczam mój kod w języku C. Proszę o zerknięcie, może ktoś zauważy co robię źle... bo ja już nic nie widzę...

    i2c_hard.c

    Kod: c
    Zaloguj się, aby zobaczyć kod


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


    main.c

    Kod: c
    Zaloguj się, aby zobaczyć kod


    EDIT:
    Jeszcze mi się nie udało znaleźć błędu. Nie wiem czemu ale podejrzewam, że problemem jest konwertowanie danych na BCD i w drugą stronę...

    0 21
  • #2 05 Cze 2012 10:20
    94075
    Użytkownik usunął konto  
  • #3 05 Cze 2012 12:22
    cziepkins
    Poziom 8  

    Dzięki za podpowiedź. Poczytam jeszcze o i2c i pomyślę jak to zrobić. Nie wiem czemu myślałem, że warunek:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    załatwia sprawę bo RW jest zerowane po przesłaniu danych i bitu potwierdzenia. Ale w sumie nigdzie w kodzie nie sprawdzam czy tak zakończyła się funkcja.

    Dzięki raz jeszcze. Dodam jeszcze, że funkcję obsługi hardware'owego I2C pochodzą w dużej części książki T. Jabłońskiego - PIC16F przykłady dla początkujących i zostały przerobione dla PIC18F46K22.

    Poniżej jeszcze kod i2c_hard.h - aby pokazać, że nazwy bitów zostały zmienione

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czy takie sprawdzanie starcza żeby mieć pewność, że zapis się powiódł i dostałem dobre ACK? (Funkcja skończyła się return ACKSTAT a nie -1)

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeśli tak to za każdym razem dostaje WR OK...

    0
  • #4 07 Cze 2012 15:36
    cziepkins
    Poziom 8  

    Czy ktoś ma jeszcze jakiś pomysł (widzi jakiś błąd w kodzie)?

    0
  • #5 07 Cze 2012 16:15
    zumek
    Poziom 39  

    cziepkins napisał:
    Czy ktoś ma jeszcze jakiś pomysł (widzi jakiś błąd w kodzie)?

    Ja mam pomysł :D
    Sprawdź dobrze funkcję ds1307_init()

    0
  • #6 07 Cze 2012 16:48
    11zywiec11
    Poziom 10  

    wg mnie możesz mieć zakłócenia na linii i2c.
    Bawiłem sie już wieloma peryferiami na opartymi na tym interfejsie (ekspandery, ADC/DAC, itp.) i w prawie żadnym nie występowały zakłucenia na linii danych ... za to ds1307 był wyjątkowo wrażliwy. Wystarczyło przyłożyć ręke do kabla linii danych i już siał błędami. Jeżli masz długie kable od linii danych to spróbuj je możliwie jak najbardziej skrócić.

    0
  • #7 07 Cze 2012 20:44
    cziepkins
    Poziom 8  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zumek czy to miałeś na myśli? Powinienem uruchomić i2c podać adres rejestru do którego chcę coś wpisać, potem wartość i następnie zatrzymać i2c? (chyba, że uzupełniam wszystkie rejestry po kolei - wtedy adres się inkrementuje) no i ustawić CH na 0...

    Jeśli tak to powinno wyglądać, to obawiam się że i tak nie pomogło...

    Co do zakłóceń przy długich przewodach - przewody mam krótkie.

    Dzięki za podpowiedzi.
    Szukam dalej... jeśli jeszcze ktoś coś zauważył to z niecierpliwością czekam na kolejne posty.

    0
  • #8 13 Cze 2012 00:28
    cziepkins
    Poziom 8  

    Nadal nie znalazłem błędu... Dodam do wątku, że EEPROM działa dobrze na tym samym I2C oraz z ciekawości sprawdziłem nóżkę OUT - gdy ustawię SQWE i OUT na 0 na nóżce jest 0V, gdy ustawię SQWE=0, a OUT = 1 mam na nóżce 0,2 V.
    Wydaje mi się, że powinno być koło 5V...

    Proszę o pomoc.

    0
  • #9 13 Cze 2012 16:25
    Jado_one
    Poziom 22  

    Sprawdź, czy nie masz za małego/wysokiego napięcia na baterii podtrzymującej w stosunku do napięcia zasilania. W przypadku wyjścia poza ten zakres przestaje działać normalnie i odłącza komunikację z szyną danych.
    Prawidłowy zakres napięć baterii vs napięcie zasilania jest opisany w datasheet'cie.
    Niedawno miałem własnie taki problem, że przypadkowo przestawiłem napięcie zasilania w zasilaczu na 4V (zamiast 5) i układ przestał reagować.

    0
  • #10 13 Cze 2012 17:19
    cziepkins
    Poziom 8  

    Niestety to nie to...
    - Vcc = 4,94V (datasheet: min=4,5; max=5,5)
    - Vbat = 3,24V (datasheet: min=2; max=3,5)

    0
  • #11 16 Cze 2012 13:18
    cziepkins
    Poziom 8  

    Czy ktoś ma jeszcze jakiś pomysł? Dobija mnie ten zegarek... przecież to nie może być aż tak trudne. Jeśli nikt nie widzi błędu w programie, to chyba jutro zamontuje nowy kwarc - może on jest walnięty. Jak to nic nie da, to umieszczę sam układ jeszcze bliżej procka - może to pomoże.

    0
  • #12 17 Cze 2012 19:15
    cziepkins
    Poziom 8  

    Kwarc wymieniłem nic się nie zmieniło.

    Znalazłem błąd ale i tak, to nie pomogło.

    OSCCON = 0b01110010;

    w PIC18F nie jest równe 8MHz (tak jak w PIC16) tylko 16MHz więc I2C było ustawione (SSP1ADD=19) na 200kHz, zmieniłem SSP1ADD=39 więc teraz jest 100kHz ale to nie pomogło. Dalej mam na wyświetlaczu zera.

    Poszukam jeszcze czy wartość OSCCON miała wpływ na coś innego odpowiedzialnego za DS1307

    albo po prostu zmienię na 8MHz (OSCCON = 0b01100010;)

    0
  • #13 20 Cze 2012 17:44
    cziepkins
    Poziom 8  

    Umieściłem układ bliżej procesora i nic się nie zmieniło.

    Czy ktoś ma jeszcze jakiś pomysł?

    Jeśli nie to chyba czas zamknąć temat może kiedyś znajdę błąd.

    Jeszcze dodam: Otrzymuję ACK od układu za każdym razem oraz gdy odłączę kabelek od SDA lub SCLw trakcie działania układu dostaje błąd kolizji I2C. Jeśli uruchomię układ bez podpiętego DS'a program zatrzyma się przy i2c_open_hard();

    Więc wydaje mi się, że procek komunikuje się z RTC.

    0
  • #15 20 Cze 2012 18:12
    cziepkins
    Poziom 8  

    dondu napisał:
    Owszem, pokaż schemat.

    Oto on:
    [C] PIC18F + DS1307 błąd odczytanych danych

    0
  • #17 20 Cze 2012 22:30
    cziepkins
    Poziom 8  

    Jak pisałem w postach wyżej wszystko inne działa, dlatego nie pokazałem całego schematu. 2xRS232 - działa, EEPROM - działa.

    Ale proszę, oto cały schemat:
    [C] PIC18F + DS1307 błąd odczytanych danych

    0
  • #18 22 Cze 2012 16:39
    cziepkins
    Poziom 8  

    Czy teraz ktoś ma jakiś pomysł?

    0
  • #19 22 Cze 2012 16:50
    Loker
    Poziom 38  

    OUT jest typu open-drain - sprawdź z opornikiem pull-up - przynajmniej będzie wiadomo czy DS żyje i komunikuje się z procesorem.

    0
  • #20 22 Cze 2012 17:53
    cziepkins
    Poziom 8  

    podłączyłem pull-up przy wpisaniu do control 0x00 dostałem 0V na oporniku, i przy wpisaniu 0x80 też 0V, czyli OUT w oby dwóch przypadkach był = 1

    0
  • #21 05 Lip 2012 08:02
    mckee
    Poziom 2  

    Witam , po co
    i2c_write_hard(0x80); // wylaczenie pinu output
    w specyfikacji pisze ze ten pin jest domyślnie wyłączony
    ,po mojemu to 0x80 to binarnie 1000 0000
    a rejestr kontrolny potrzebuje ustawienia bit4 na 1, i bit7 na 0, aby wlaczyć pin na niski czyli 0001 0000 ,hex 0x10 , lub na wysoki i 1Hz , bit4 i bit7 oba 1 ,
    1001 0000 , 0x90 ,

    0
  • #22 23 Sie 2012 02:23
    cziepkins
    Poziom 8  

    spróbowałem raz jeszcze po przerwie i błąd się znalazł

    ok, głupi błąd - funkcja ds1307_get(...) nie zwracała danych.

    Zmieniono na:

    void ds1307_get(char *day, char *month, char *year, char *dow, char *hour, char *min, char *sec)

    Wszystko działa...

    0