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

[Atmega8][PCF8583P] - I2C(TWI) nie działa gdy podłącze rezystory pull-up

liquee 19 Sty 2013 07:25 5529 14
  • #1 11809321
    liquee
    Poziom 10  
    Witam,

    Wczoraj podłączyłem na płytce stykowej mikrokontroler ATmega8 wraz z układem zegara rzeczywistego PCF8583P. Problem polega na tym, że komunikacja przez I2C (TWI) działa, gdy odłączę rezystory podciągające linii SCL i SDA.
    Standardowo linie SCL i SDA podciągnąłem rezystorami 4,7k do +5V. Układ nie chciał działać, walczyłem z brakiem komunikacji pół dnia, wyłysiałem;), sprawdzałem kilkukrotnie połączenia, użyłem 3 różnych algorytmów obsługi TWI dla Atmegi8. Ale dopiero po wywaleniu rezystorów Atmega8 nawiązała komunikację odczytując czas. Dla testów wstawiłem inne wartości, 2k2, 7k5, 10k, ale komunikacja ustaje (sam układ Atmega8 działa, bo steruje sobie LEDami) Zauważyłem również, że wystarczy jedną, którą kolwiek linię TWI podpiąć rezystorem do Vcc i już przestaje działać. Gdy rezystorów nie ma układ działa.

    Czy ktoś spotkał się już z takim problemem? Dla mnie sytuacja jest conajmniej dziwna. Proszę o konstruktywne, rzeczowe odpowiedzi osób z doświadczeniem.

    Dzięki,
    Pozdrawiam - Liquee
  • #2 11809608
    hotdog
    Poziom 26  
    wróżki na urlopie - wstaw schemat i kod.

    Odłączenie rezystorów to pewnie "zbieg okoliczności" powód jest gdzie indziej.
  • #3 11809703
    mirekk36
    Poziom 42  
    liquee napisał:

    Czy ktoś spotkał się już z takim problemem? Dla mnie sytuacja jest conajmniej dziwna.


    Po pierwsze kolega wyżej ma rację a ja dodam, że nikt się nie spotkał z takim problemem :( .... a to co opisujesz może świadczyć TYLKO o jednym - popełniasz jakiś MEGA CZESKI błąd w połączeniach i tylko to jest powodem. Bo akurat rezystory podciągające na I2C są wymagane i opisane w każdej nocie PDF związanej z I2C. Więc wziąłbym to na twoim miejscu pod uwagę i szukał błędu u siebie - jak nie możesz go znaleźć to - jw. pokaż schemat a najlepiej jeszcze fotkę płytki i żeby było widać jak masz wpięte te rezystory ale może też jakieś istotne fragmenty programu do twojej obsługi I2C
  • #4 11810313
    liquee
    Poziom 10  
    HotDog jest to płytka stykowa, na której dowolnie podpinam i wypinam rezystory i TWI przestaje działać.
    Kod jest poza podejrzanymi, bo jest sprawdzony i działa w innych moich aplikacjach, nie mówie, że jest jakiś idealne, dlatego też skompilowałem gotowy kod z obcego projektu, ba mało tego dodałem kod z przykładów Atmela i wszystkie te kody zachowują się identycznie.

    W załączniku przesyłam jak mam to wszystko podpięte. Bez oporników działa, czyli komunikacja OK, a po podpięciu nie działa. A co ma jedno do drugieo?

    Co do Twoich złośliwości i "wróżek", nie chodziło mi o wrzucenie schematu i postu szukajcie mi ludzie błędu. Tylko grzecznie zapytałem, czy komuś się przy podpinaniu coś się takiego zdarzało. Myślałem, że może źle dobieram oporniki dla tego przykładu. Jeśli 2 osoby mówią, że to dziwne to szukamy dalej:)

    Mirku, jestem skłonny się do Twojej wersji przychylić i muszę gdzieś znaleść CZESKI BŁĄD. Dziś po pracy zacznę szukać jeszcze raz, mimo, że to już zrobiłem..:/
  • #5 11810379
    piotrva
    VIP Zasłużony dla elektroda
    1. Podłącz poprawnie zasilanie Atemga8 - czyli piny AVCC i GND po drugiej stronie także MUSZĄ BYĆ PODPIĘTE. Szczególnie w tym przypadku piny SDA i SCL są zasilane (ich driver) z zasilania AVCC, które TYLKO W NIEKTÓRYCH PARTIACH ATMega8 BYŁO BŁĘDNIE ZWARTE Z VCC, a z tego co mi wiadomo wersji ATMega8A błąd ten został usunięty.
    2. Co do wróżenia z fusów - mogłem Ci powiedzieć tak, zdarzyło mi się błędne działanie PCF8583 przy podpięciu rezystorów, bo mi się herbata wylała na układ ;) Na prawdę nie warto tracić czasu na dywagacje jakie są możliwe przyczyny, tylko od razu dać komuś do analizy schemat + program (czasem okazuje się że nie ma jakiegoś połączenia, gdzieś brakuje jednego <), więc nie wiem dlaczego dalej nie pokazałeś programu, choć IMHO problem leży w niepodpiętym AVCC i drugim GND.
    3. Swoją drogą jak masz omomierz to zmierz rezystancję między VCC i AVCC (oczywiście przy procesorze wyjętym z płytki i odłączonym od zasilania.
  • #6 11810426
    mirekk36
    Poziom 42  
    liquee napisał:

    Mirku, jestem skłonny się do Twojej wersji przychylić i muszę gdzieś znaleść CZESKI BŁĄD. Dziś po pracy zacznę szukać jeszcze raz, mimo, że to już zrobiłem..:/


    No niestety jednak to nie czeski błąd tylko popełniasz na razie OGROMNE błędy - tak jak kolega pisał - m.in nie podłączyłeś zasilania do AVCC i AGND - to jest niestety MASAKRA .... nie ma też filtrowania zasilania - wiesz co zacznij proszę od DOKŁADNEGO przeczytania tego poradnika

    http://mirekk36.blogspot.com/2012/04/mikrokontroler-prawidowe-zasilanie.html

    na prawdę DUŻO ci się wyjaśni - ale zwróć szczególną uwagę tam na to co piszę o AVCC i cytaty z not PDF ... a także na wszystkie inne pozostałe rzeczy...

    w skrócie brak napięcia na AVCC to brak zasilania cyfrowej części portu na którym jest ADC a przy okazji I2C ....

    jak więc widzisz trzeba jednak OD PODSTAW wszystko dobrze łączyć ... a jeśli chodzi o rysowanie schematów to gorąco polecam ci ten mały cykl poradników VIDEO:

    http://atnel.pl/kurs-cadsoft-eagle.html
  • #7 11812752
    liquee
    Poziom 10  
    Mirku nie przesadzaj z tym napięciem, na poprzednim schemacie narysowałem przecież kondensatory na zasilaniu, a do tego napięcie jest stabilizowane. Starczy aż nadto. Moja Atmega8 ma połączenie między Vcc a AVcc, dlatego nie podłączałem. Ale, żebyście już tak na mnie nie naskakiwali, to zmodyfikowałem zasilanie i narysowałem schemat w Eaglu stan faktyczny układu! (Znam się na Eaglu Mirku, tamto rysowałem na prędce w pracy mając pod ręką Visual Studi, więc nie potrzebuję kursów) Oprócz tego dołączam kody źródłowe. Znów dziś walczyłem z tematem. Ciągłość połączeń na płytce zachowana, schemat na 100% jak narysowałem.
    [Atmega8][PCF8583P] - I2C(TWI) nie działa gdy podłącze rezystory pull-up
    Układ uproszczony podczas dzisiejszej walki - działa tak: Wykorzystuję przerwanie RTC na wejściu INT0, po jego wystąpieniu odczytuję z RTC dane po szynie TWI. A w pętli głównej zapalam i gaszę diodę co 3 sekundy. Na podstawie pobranej sekundy z zegara. Dlatego wiem, że układ działa. Gdy zrobię przerwę na linii TWI, to sekundy nie zostaną pobrane i dioda wtedy nie mruga. Po podłączeniu linii wszystko śmiga. Ale gdy tylko podłączę diody podciągające linie SCL i SDA do Vcc transmisja ustaje (albo jak uruchomie układ z już podpiętymi opornikami), dioda "zamiera" w niezmienionym stanie, albo zapalona, albo zgaszona. Sama Atmega działa, bo dołączyłem teraz jeszcze jedną diode led, która mrugnie przy wystąpieniu przerwania INT0. I tak oto mruga sobie co sekundę cały czas, więc Atmega pracuje. (Nie chce mi się tego już rysować na schemacie). Gdybym dysponował oscyloskopem to bym się podpiął i zobaczył co się dzieje na linii po podpięciu tych rezystorów. Dziwne to wszystko.
    PS
    Nie jestem początkującym. Dziwi mnie taka sytuacji, dlatego dziele się tym problemem z wami..
  • #10 11813446
    JarekC
    Poziom 32  
    Jeżeli ATMEGA pracuje z F=8MHz to źle jest ustawiona częstotliwość szyny I2C.
    8MHz/(16+2*2)=400kHz a PCF8583 pracuje do 100kHz.

    Kolega korzysta z procedur I2C i RTC mojego autorstwa, lecz w oryginalnym kodzie
    prędkość szyny była ustawiona na 95kHz (TWBR=0x22 dla FCPU =8 MHz).

    JarekC
  • #11 11813875
    liquee
    Poziom 10  
    Używam wewntrznego oscylatora ustawionego na 1MHz.

    Cytat:
    Kolega korzysta z procedur I2C i RTC mojego autorstwa, lecz w oryginalnym kodzie
    prędkość szyny była ustawiona na 95kHz (TWBR=0x22 dla FCPU =8 MHz).

    Korzysałem z różnych bibliotek znalezionych w internecie, dla każdej ta sama sytuacja. Gratuluje w takim razie JarekC kodu, wrzuciłem ten kod, bo jest najbardziej przejrzysty i najprostszy do przeanalizowania.

    Faktycznie wcześniej TWBR był 0x22, ale zmieniłem go na 0x02 dla ustawień mojego F_CPU=1Mhz, częstotliowść szyny TWI mam w tym przypadku 50kHz.
    Dodałem jeszcze słowo kluczowe volatile dla zmiennej Time, żeby poprawnie działało w moim przypadku. Jarku ustawiłeś w bibliotece adres RTC wraz z bitem R/W na sztywno 0xA0 i 0xA1, czyli tak jak ja ustawiłem RTC. Ale w razie czego zmieniłem nawet ten ades na A2 i A3 i urządzenie nie działało, więc potwierdza mi to tylko fakt, że przy oryginalnym ustawieniu komunikacja przebiega poprawnie (oczywiście bez rezystorów pull-up). Mało tego, jeśli zmienię w pętli głównej na sprawdzanie minut, to dioda zapala/gaśnie w cyklu 3minutowym. Czyli bez rezystorów mam poprawną komunikację, bo otrzymuję poprawne dane. Komunikacja natomiast nie działa przy podpiętych rezystorach (sprawdzałem już różne wartości) do linii SDA, SCL. I naprawdę 10x się zastanawiałem i analizowałem zanim coś podpiąłem, więc powinno być ok, a nie jest.
  • #12 11815201
    hotdog
    Poziom 26  
    wbudowane pull-upy w atmegę są bardzo słabe (47kOhm z tego co pamiętam), więc jeżeli chodzi tylko na wbudowanych to:
    - masz za dużą częstotliwość szyny (fusebity źle, złe define'y), zamrugaj diodą co 1s z wykorzystaniem _delay_ms dla sprawdzenia czy aby na pewno avr pracuje z zakładaną częstotliwością;
    - wartość rezystorów jest mniejsza niż myślisz, odczytaj wg kodu paskowego (sprawdź też wyższe wartości 10k - 100k) na którychś musi ruszyć;
    - podłączasz źle rezystory (może do GND nie do VCC)
    - uszkodzony jest PCF lub AVR
    - kiepskie styki na płytce stykowej

    To jedyne możliwości w których może wystąpić problem o którym piszesz.

    Pozdrawiama
  • #13 11817960
    liquee
    Poziom 10  
    -Fuse bity ok, (Internal Clock 1MHz),
    -F_CPU jako paramter przy kompilacji ustawiony na 1000000UL,
    -_delay_ms(1000) opóźnia dokładnie o sekundę,
    -oporniki opisane, dodatkowo zawsze sprawdzam paski, podłączałem różnych wartości do 10k włącznie i to samo,
    -oporniki podłączam na pewno do Vcc,
    -układ na płytce stykowej przepiąłem w inne miejsce płytki używając innego zestawu przewodów łączących podłączając z nadludzką starannością i dbałością - efekt ten sam.

    Na pewno się upewniłem, że taka sytuacja nie jest spotykana i jest anormalna. Przy wszelakich moich wysiłkach zostaje już chyba tylko podejżenie uszkodzenia któregoś z układów. W tygodniu ma mi przyjść przesyłka zawierająca inne AVRki, więc podłącze inną Atmege i zobaczę jaki efekt. Jeśli nie pomoże zakupie zegar w lokalnym sklepie elektronicznym i dam znać co z tego wyszło.
  • #14 11818015
    piotrva
    VIP Zasłużony dla elektroda
    Hmm, jak teraz to czytam to przypomina mi się podobna sytuacja z dawnych czasów - ATMega2560 + PCF8583 + Bascom. Też było tak, że na programowym I2C musiały być rezystory (bez nich nie działało), a na sprzętowym TWI jak tylko podpiąłem rezystory to zero komunikacji... Szczerze powiedziawszy potem przesiadłem się na C i problem się nigdy nie powtórzył, nie wiem też co było jego przyczyną...

    Dodano po 1 [minuty]:

    Dodam, że na pewno nie było to uszkodzenie układów, bo obecnie korzystam z tego zestawu i nie ma żadnego problemu.
  • #15 11826677
    liquee
    Poziom 10  
    Po wymianie układu RTC na nowy działa jak powinno. Zamykam temat.
REKLAMA