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.

PIC18F46K22 - Komunikacja I2C - PCF8583

Leeoonek 09 Gru 2014 19:48 1500 4
  • #1 09 Gru 2014 19:48
    Leeoonek
    Poziom 9  

    Z góry przepraszam, że zakładam trzeci temat w tak krótkim odstępie czasu, niemniej po raz kolejny mam problem którego nie potrafię przeskoczyć, a niestety mała popularność stosowanego kontrolera nie pomaga. Do tej pory problemy z którymi się stykałem były raczej proste do rozwiązania, liczę, że podobnie będzie również w tym przypadku.

    Moim celem jest zrealizowanie komunikacji poprzez interfejs I2C między zegarem czasu rzeczywistego PCF8583 a mikrokontrolerem PIC18F46K22. Na samym początku chciałbym, aby po prostu doszło do komunikacji i aby na wyświetlaczu pojawiła mi się aktualna sekunda, ponieważ uzyskanie innych danych oraz ustawienie czasu w zegarze jest szeroko opisane w literaturze i powinienem sobie z tym poradzić. Problemem jest sama inicjacja komunikacji, które wedle obecnej wiedzy powinna działać-a niestety tak nie jest.

    Schemat jest banalnie prosty, podłączenie również, kod również nie jest jakoś szalenie skomplikowany. Prawdopodobnie chodzi o jakiś drobny detal, którego na ten moment nie jestem w stanie zauważyć

    Kod prezentuje się następująco

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z góry dziękuję za każdą udzieloną mi pomoc.

    Pozdrawiam
    Karol

    0 4
  • #2 10 Gru 2014 00:05
    szymonjg
    Poziom 15  

    Jedyna literatura która była by mi w tym przypadku potrzebna to Dokumentacja PCF8583 i Dokumentacja PIC18F46K22
    To tak nawiasem.

    Popularność tego kontrolera nie jest duża, chodź na pocieszenie powiem, że wszystkie PIC18 z którymi się spotkałem mały ten sam moduł MSSP. W twoim przypadku masz o tyle trudniej, że tych modułów masz aż 2 i na któryś musisz się zdecydować. Także jeśli szperając w necie natrafisz na opis I2C w PIC1846k80 lub PIC184620 lub PIC18F4550 lub PIC18F2550 to śmiało możesz czerpać stamtąd informacje. Poza tym większość procesorów z końcówką "K22" różni się tylko ilością pamięci i pinout'em, a w środku to to samo.
    Zresztą magistrala I2C jest w jakiś tam sposób znormalizowana i panują na niej te same zasady bez względu na procesor.
    To też tak nawiasem.

    W kodzie w trzeciej instrukcji funkcji void Read_Time(void) chyba brakuje "2" po "I2C".

    I jeszcze gdzieś mi się o uszy obiło, że rezystory do I2C to daje się około 4k ohm. 10k to tak jakby trochę za dużo, ale to niech lepiej mądrzejsi się wypowiedzą.

    I jeszcze zbędny wydaje się być rezystor R3 pomiędzy linią RS wyświetlacza, a VDD

    0
  • #3 10 Gru 2014 09:58
    Leeoonek
    Poziom 9  

    Dziękuje za odpowiedź

    Zmieniłem rezystory na 4.7K, zmieniłem ową feralną linijkę kodu niemniej dalej komunikacja się nie odbywa. Nie mam już w zasadzie pomysłów co mogłoby nie działać, być może chodzi o źle zadeklarowane rejestry, niemniej mimo moich licznych prób i to nie przynosi rezultatów...

    0
  • Pomocny post
    #4 10 Gru 2014 13:49
    szymonjg
    Poziom 15  

    Deklaracje rejestrów są w bibliotece. Raczej powinno dać się jej ufać.
    Spróbuj użyć pierwszego I2C bo może rzeczywiście biblioteka z tym drugim nie daje sobie rady.

    Średnika jeszcze brakuje po drugim while'u w tej czytającej funkcji.

    Nie wiem jak w tym nowszym MPLAB'ie się to ustawia, ale jeśli możesz użyć programatora jako debugera, to zrób to i sprawdź czy przypadkiem program nie zawiesza się na jakiejś linijce.

    I jeszcze jak chcesz ustawić transmisję na 100kHz to do rejestru SSP2ADD trzeba wpisać liczbę 39 dziesiętnie, a Ty wpisujesz szesnastkowo i nie do tego rejestru co trzeba. I o ile sama wartość nie powinna stanowić większego problemu, bo transmisja, choć trochę wolniej, to i tak powinna działać, to jednak nazwa rejesrtu jest koniecznie do poprawy, jeśli dalej korzystasz z drugiego I2C

    0
  • #5 10 Gru 2014 14:42
    Leeoonek
    Poziom 9  

    Stał się cud, po przełożeniu kabelków i zmienieniu ustawień wyświetlacz pokazuje sekundy. Myślałem, aby to zrobić wcześniej, ale na owych portach miałem klawiaturę matrycową i nie chciałem tego rozłączać, ponieważ, nie wierzyłem, aby mogło to coś zmienić.
    Nie rozumiem dlaczego nie działało to na I2C2, niemniej szalenie dziękuje, bo siedziałem nad tym 3 dzień będąc pewnym, że przyczyna leży w kodzie

    0