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

ATmega128 - Transmisja I2C, TWI_Start zapętla się

bisz 28 Sty 2013 09:47 2421 14
  • #1 11852244
    bisz
    Poziom 18  
    Witam,
    Usiłuję uruchomić obsługę interfejsu TWI we współpracy z zegarem czasu rzeczywistego PFC8583, na bazie książki kolegi Mirka z tego forum i niestety coś nie wychodzi... Oto szczegóły:

    plik main.c:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    fragment z istotnymi funkcjami z pliku i2c_twi.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Tam gdzie dodałem komentarz program się zapętla, gdyż widzę na wyswietlaczu same kropki i nic poza nimi, program również dalej nie "leci"... Pytanie dlaczego ?
    Wynika z mojej analizy ze flaga TWINT nie jest zerowana...
  • #2 11852516
    mickpr
    Poziom 39  
    Doczepię się to makr:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Nie przyglądałem się w całemu programowi, ale moją uwagę zwróciły błędnie napisane makra, które są z reguły powodem problemów.
    W kodzie ich nie używasz - więc nie masz błędów podczas kompilacji.
    Pierwszy powód - to stosowanie spacji
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ale miejsc w których spacje powinieneś zlikwidować jest więcej.
    Wyrzuć też do odrębnych linii komentarze.
    Makra należy pisać bardzo uważnie, inaczej będą błędnie działały.

    ----------------
    Co do niedziałania TWI - źle inicjujesz TWI.
    Znajdź różnicę np. z tym kodem: http://radzio.dxp.pl/twi/

    P.S. Nie stosuj sztywno ustalonego F_CLK (8000000), tylko używaj zmiennej (zdefiniowaną w Makefile np.).
    Potem zmienisz kwarc - i całe pisanie kodu na nic.

    P.S. 2
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Ten sposób "debugowania" woła o pomstę do nieba.
  • #3 11852629
    bisz
    Poziom 18  
    Powiem tak, te makra używam od lat (kopiuj wklej) i działają, więc nie szukałbym w nich problemu zracji spacji. Ale OK.
    Przeczytałem twoje funkcje do obsługi TWI i prawdęmówiąc nie widzę różnicy między moim a Twoim...
    Sposób debugowania nie jest może wyrafinowany ale trop tak czy siak pada na tę pętlę.
  • #4 11852705
    mickpr
    Poziom 39  
    bisz napisał:
    Przeczytałem twoje funkcje do obsługi TWI i prawdęmówiąc nie widzę różnicy między moim a Twoim...
    Przepraszam, podałem zły link, więc podam przykład kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 11852827
    bisz
    Poziom 18  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Cały czas na LCD wisi napis "START".
  • #7 11852884
    bisz
    Poziom 18  
    Ten bit nie jest u mnie ustawiony.

    Dodano po 1 [godziny] 15 [minuty]:

    Schematu chwilowo nie mogę wyprodukować... Funkcja czytająca ma procedurę dodania +1 w przypadku czytania. Ale adres tu nie ma znaczenia bo program nawet nie dochodzi do funkcji którą interesuje adres, Zapętla się w funkcji START. Linie są podciągnięte rezystorami 1.5k. Dodam że porty sa w niskim stanie mimo podciągnięcia.
  • #8 11853240
    mickpr
    Poziom 39  
    Prozaiczne pytanie - Czy masz podciągnięte linie SDA i SCL do "H"?

    bisz napisał:
    Linie są podciągnięte rezystorami 1.5k. Dodam że porty sa w niskim stanie mimo podciągnięcia.
    To jest ten problem.
    Podciągnij linie rezystorami 4k7 lub 10k do VCC.
    Jeśli to nic nie da, sprawdź działanie pinów w trybie GPIO (czy da się nimi sterować).
    TWI powinno automatycznie przestawiać piny we właściwy tryb, ale być może "upaliłeś" sobie po prostu je.
  • #9 11854324
    bisz
    Poziom 18  
    Tak właśnie się obawiam, obczaję i dam znać.
  • #10 11857133
    tehaceole

    Poziom 28  
    bisz - tutaj znajdziesz obsługę PCF8583. Do tego możliwość wykorzystania pcfa jako zewnętrzna pamięć (zamiast katowania eeprom).
    PS. Ponieważ niskopoziomowo korzystałem z tego samego źródła:
    while ( !(TWCR&(1<<TWSTO))); tu jest błąd, powinno być:
    while ( (TWCR&(1<<TWSTO)));, wyjaśnienie znajduje się w linku, który podałem.


    PS2. W przykładach z których korzystałeś jest też TWI softwareowe. Możesz zobaczyć na innych pinach, żeby wykluczyć uszkodzenie portów.
  • #11 11862695
    bisz
    Poziom 18  
    Wróciłem z rozważaniami do ATmegi32 i płytki prototypowej. Porty mam sprawne i mam na nich stany wysokie, podciągnięte rezytorami 1.5k, więc sprzętowo wszystko wygląda OK, natomiast przy próbie odczytu wszystko staje.

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


    Procedurę stop poprawiłem lecz nie w niej podejrzewam leży problem.
    Na terminalu odbieram nastepujące komunikaty :

    inicjalizacja poszla
    cos tam wyslalem
    CZYTAM

    I na tym koniec. Dodam że podczas "zwiechy" port SCL jest na stanie niskim, wymuszonym przez Atmegę...

    Zacząłem debugować poprzez zaswiecenie diodą i wynika że problem jest w funkcji read_buffer

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


    A idąc tropem dalej do funkcji TWI_read :

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


    Dodam jeszcze że podczas pętli w której wszystko się 'wiesza' wydrukowałem sobie na terminal stan rejestru TWSR i widzę tam 0x48 czyli przesłano SLA_R, otrzymano NACK.
  • #12 11862899
    mickpr
    Poziom 39  
    bisz napisał:
    Porty mam sprawne i mam na nich stany wysokie, podciągnięte rezytorami 1.5k, więc sprzętowo wszystko wygląda OK
    Kto ci powiedział, że ma być 1,5k?
    Wszyscy stosują i zalecają 4,7k ... 10k.

    W załączniku moje (działajace) procedury TWI i PCF8583 (Atmega 32 dla ścisłości).
  • Pomocny post
    #14 11863044
    mickpr
    Poziom 39  
    Kolega JarekC ma rację, masz zdefiniowane najpierw dobrze (0xA0), a potem redefiniowane na złe (0x50).
    Nie czytasz komunikatów kompilatora? Na pewno o tym "buczy".
  • #15 11863046
    bisz
    Poziom 18  
    Przyznam, że sam się zdziwiłem dlaczego mam wpisane 0x50, ponieważ zdążyłem już wczesniej poprawić ten adres na właściwy. Pewnie przez całe zamieszanie gdzieś mi to umknęło. Po poprawieniu adresu nagle wszystko wydaje się działać ok, sekundy lecą :-) Bardzo dziękuję za pomoc!
REKLAMA