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

[C] Atmega8 i PCF8574 TWI - błędy w komunikacji, ustawienie stanu wysokiego

brzydal91 15 Kwi 2011 00:17 5518 28
REKLAMA
  • #1 9402338
    brzydal91
    Poziom 12  
    Posty: 116
    Ocena: 3
    Witam. Próbuję podłączyć układ PCF8574 do Atmeg'i8. Korzystam z opublikowanej na tym forum biblioteki TWI. Prosiłbym aby ktoś wytknął mi błędy w komunikacji z tym układem. Próbuję ustawić na wszystkich wyjściach stan wysoki. Z noty katalogowej wyczytałem że ma to wyglądać tak:

    Start -> wysłać bajt zawierający adres tj. ( 0100 A2 A1 A0 0/1 ) 0 lub 1 na końcu zależy czy wysyłamy czy czytamy -> Bajt danych -> STOP

    Zwarłem nóżkę A0 układu do Vcc a pozostałe dwie wiszą. Czy to znaczy że adres urządzenia to 0100001 0/1 ?

    Mój kod wygląda następująco:

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


    gdzie funkcje mają następujący kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czy ktoś mnie poprawi? Połączyłem mikrokontroler z układem tak jak na schemacie, zwarłem obie linie rezystorami 3,3K do Vcc. Pozdrawiam
  • REKLAMA
  • #2 9402512
    krru
    Poziom 33  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    Jednak lepiej podłącz te wiszące adresy do GND.

    Dość prosto można przeprowadzić skanowanie I2C w celu wykrycia podłączonych urządzeń.
    Dodaj taką funkcję na początku programu, zobaczysz pod jakim adresem widać ten ekspander.
  • #3 9403186
    brzydal91
    Poziom 12  
    Posty: 116
    Ocena: 3
    Czy mógłbyś mi pomóc w stworzeniu takiej funkcji? Nie bardzo jeszcze łapie to TWI i próbuję zrobić na razie jakiś prosty schemat, na którym nauczę się tego wszystkiego. Ekspander będzie dla mnie akurat dobrym urządzeniem do testowanie bo wystarczy że podłącze switche i diody. Teraz testuję jeszcze inną działającą bibliotekę do TWI z tego forum i też nie mogę ustawić stanu wysokiego na pinach.
  • #4 9403203
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Zacznij od funkcji którą są w datashecie i powinno być lepiej. Po zakończeniu zapisu wystaw flagę na jakiś pin procka. Będziesz wiedział czy adres jest poprawny.
  • #5 9403889
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    nie wiem czy doczytaliście, ale te układy działają jako quasi-bidirectional, czyli zachowują się jak następuje:
    1. ustawienie 0 w rejestrze = ustawienie stanu niskiego na pinie, pin działa jako wyjście
    2. ustawienie 1 w rejestrze = stan wysoki, ale jako pull-up, pin działa jako wejście z podciąganiem do vcc
    czyli reasumując - nie da się wystawić stanu wysokiego na wyjściu w taki sposób, aby bezpośrednio zapalić np. diodę led.
  • #6 9403896
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    piotrva napisał:

    czyli reasumując - nie da się wystawić stanu wysokiego na wyjściu w taki sposób, aby bezpośrednio zapalić np. diodę led.


    Ależ da się
  • REKLAMA
  • #7 9404415
    krru
    Poziom 33  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    brzydal91 napisał:
    Czy mógłbyś mi pomóc w stworzeniu takiej funkcji? Nie bardzo jeszcze łapie to TWI i próbuję zrobić na razie jakiś prosty schemat, na którym nauczę się tego wszystkiego. Ekspander będzie dla mnie akurat dobrym urządzeniem do testowanie bo wystarczy że podłącze switche i diody. Teraz testuję jeszcze inną działającą bibliotekę do TWI z tego forum i też nie mogę ustawić stanu wysokiego na pinach.



    Jakoś tak (taki pseudokod):

    
    for (address = 0; address < 255; address+=2)   // adres musi być większe niż 8bit
    {
    	TWI_Start();
    	if (TWI_Write(address | TWI_READ) == TW_MR_SLA_ACK)
            {
                   // zglosil sie uklad pod adresem address
            }
    	TWI_Stop();
    }
    
    
  • #8 9404484
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    asembler napisał:
    piotrva napisał:

    czyli reasumując - nie da się wystawić stanu wysokiego na wyjściu w taki sposób, aby bezpośrednio zapalić np. diodę led.

    Ależ da się


    Niestety chyba jednak piotrva ma rację - nie da się stanem wysokim bo ma za mały prąd.
    Można oczywiście odwrócić diodę i podłączając ją do VCC, a pin ustawiając na 0 i zapewne o tym napisał kol. asembler.

    [C] Atmega8 i PCF8574 TWI - błędy w komunikacji, ustawienie stanu wysokiego
  • #9 9404503
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    A słyszeli koledzy o diodach LED niskoprądowych? Ja ma diody które już zaczynają swiecic przy 1 uA a przy 1mA to już oślepiają.
  • #10 9404504
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    ja o tym właśnie mówiłem, przecież napisałem:
    piotrva napisał:

    czyli reasumując - nie da się wystawić stanu wysokiego na wyjściu w taki sposób, aby bezpośrednio zapalić np. diodę led.

    i to chyba wynika też z mojego opisu, w którym piszę, że stan niski działa jako normalne wyjście, ale żeby nie było niedomówień:
    1. diodę da się zapalić podpinając ją do VCC, a "drugim końcem" przez rezystor do naszego układu (stan niski zapala diodę)
    2. NIE DA SIĘ zapalić diody (zwykłej, nie niskoprądowej) stanem wysokim w konfiguracji wyjście->rezystor->dioda->GND. Oczywiście można by się pobawić w tranzystor i odpowiednio go wysterować, ale moim zdaniem lepiej odwracać impulsy programowo :D

    Dodano po 5 [minuty]:

    asembler napisał:
    A słyszeli koledzy o dioda LED niskoprądowych? Ja ma diosy które już zaczynają swiecic przy 1 uA a przy 1mA to już oślepiają.

    owszem są, ale większość z nas korzysta z normalnych diod świecących przy wyższych prądach
  • #11 9404527
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Normalne diody tez swiecą przy 1mA a nawet przy 0.1mA
  • REKLAMA
  • #12 9404626
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    no chyba, żeby pominąć rezystor, lub znacząco zmniejszyć jego wartość...
    muszę to sprawdzić jak znajdę chwilę czasu
  • #13 9404647
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Podłączając diodę LED miedzy masę i wejście ADC procesora i można ją zaświecac pull-up'em i zrobić pomiar oświetlania. To też możesz sprawdzic:-)
    Niestety podłączając inaczej nie uda mierzyć rónież jasnosci.
  • #14 9404692
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    asembler napisał:
    A słyszeli koledzy o diodach LED niskoprądowych? Ja ma diody które już zaczynają swiecic przy 1 uA a przy 1mA to już oślepiają.

    Nie słyszałem, ale z chęcią poznam jakiś link, bo bardzo by mi się przydała do mojego projektu :)
    Autorowi tego tamatu pewnie także.
  • #15 9404758
    brzydal91
    Poziom 12  
    Posty: 116
    Ocena: 3
    No to by się zgadzało. Bo mam diodę podłączoną do jednego z wyjść układu i ona się świeci od uruchomienia ale tak słabo tzn. że płynie za mały prąd. Tzn. że jeśli wyślę do układu bajt 0xFF to wszystkie piny będą wejściami podciągniętymi do Vcc tzn. że dioda podłączona + do pinu układu będzie się świecić czy prąd w ogóle nie popłynie? Jaki polecacie układ do sterowania typu ULN2803 tyle żeby działało to jak paczka tranzystorów ze wspólną bazą a ośmioma emiterami i ośmioma kolektorami? Chodzi mi o taki układ którym mógłbym wzmacniać sygnał z tego PCF. Będę testował dalej komunikację TWI i dam znać czy już mi działa czy nie. Dzięki za wszystko, pozdrawiam
  • #16 9404778
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Wiem że temat jest PCF8574 ale... skoro tak kombinujesz i chcesz dokładać dodatkowe układy to może zatanów się czy dobrze wybrałeś ten układ - nie dość ze drogi to jak widze nie spelnia twoich wymagan. Moze jakis rejestr przesuwny?
  • REKLAMA
  • #17 9404788
    krru
    Poziom 33  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    PCF8574 nie ma rezystora pull-up a źródło prądowe 100uA. Taki prąd ledwo zaświeci diodę, coś będzie widać. Najlepiej podłączyć do wyjścia i Vcc. ULN nic nie pomoże, bo on też potrafi tylko do zwierać do masy, nie daje aktywnego stanu wysokiego. A prąd z 8574 w stanie L wystarczy do sensownego zaświecenia diody. Tylko trzeba pamiętać o jakimś rezystorze.
  • #18 9404885
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    brzydal91 napisał:
    Chodzi mi o taki układ którym mógłbym wzmacniać sygnał z tego PCF. Będę testował dalej komunikację TWI....


    Zastanów się dobrze nad tym co już tutaj padło. Jesteś o krok od szczęśliwego dla siebie rozwiązania ;) Zamiast więc zastanawiać się nad jakimiś diodami niskoprądowymi, albo jak tu piszesz nad jakimś WZMACNIANIEM SYGNAŁU .... (po cóż ci wzmacnianie sygnału? - chcesz zrobić wzmacniacz czy jakiś prosty układ cyfrowy?)

    Tak jak pisałeś wyżej - ten PCF... bardzo dobrze nadaje się do testowania zarówno I2C (TWI) a jednocześnie możesz nim zapalać i gasić zwykłe diody - tyle że podłączone katodą do pinów i przez rezystor do VCC. Nie muszą być żadne tam niskoprądowe. Przecież programowo wystawiasz ZERO i dioda świeci , wystawiasz JEDEN i dioda GAŚNIE.

    A przy okazji najspokojniej w świecie testujesz sobie także podłączone switche .... przecież??? w czym problem - będzie to pięknie działać. Ja tam nieraz wykorzystuję takie scalaczki właśnie w ten sposób jeśli i tak już mam magistralę I2C wykorzystywaną w układzie (np jakiś RTC)

    po co sobie w głowie mieszać ;) .... jak wszystkie te 3 rzeczy o których pisałeś tu własnie spokojnie zrealizujesz.

    Powiem więcej! masz z tego układu wyjście INT, które pięknie może zgłaszać przerwanie gdy wciskasz jakiś klawisz (słicz) - dzięki temu zorganizowanie byle klawiaturki z jego udziałem a jednocześnie podłączenie kilku diod LED czy nawet buzzera to proste jak drut i sama poezja ;) ... zobacz np w tym projekcie:


    https://www.elektroda.pl/rtvforum/topic678948.html

    a dokładniej na tej stronie - bo tu masz schemat z takim expanderem PCF

    https://www.elektroda.pl/rtvforum/topic678948-30.html#3500008

    Dodam że expanderki PCF8575 - te 16-bitowe też bardzo fanie się sprawdzają w niektórych zastosowaniach.
  • #19 9405563
    brzydal91
    Poziom 12  
    Posty: 116
    Ocena: 3
    Nie wiem, albo coś ze mną nie tak albo z tym TWI. Czytam notę katalogową, napisane jest że jest rejestr TWAR i w tym rejestrze przechowywany jest adres kiedy jednak patrzę na przykładowy kod z noty w języku C to ani razu nie wykorzystują tego rejestru.
    Mam teraz taki oto kod:

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


    Program się nie kompiluje bo nie mam zdefiniowanych START, MT_SLA_ACK oraz MT_DATA_ACK. Nie mam pojęcia jak to zrobić.
    Mój obwód wygląda tak że mam PCF podłączony do atmegi do tego zasilanie z ATX, piny adresu wszystkie podłączone do GND, jedna dioda podłączona katodą do pinu P0 i anodą do Vcc.
    Coś nie mogę tego ogarnąć. Pomożecie mi jeszcze?
  • #20 9405577
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    TWAR w twoim przypadku nie jest ci potrzebne
  • #21 9405624
    krru
    Poziom 33  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    TWAR jest pewnie do trybu slave (też jeszcze nie używałem).
    Natomiast stałe, o których wspominasz są w pliku dołaczanym poleceniem
    #include <util/twi.h>

    z tym, że mają jeszcze prefix TW_
  • #22 9405702
    brzydal91
    Poziom 12  
    Posty: 116
    Ocena: 3
    Ok niby nie ma żadnych error'ów bo nic mi nie wypisuje z uartu, ale dalej nie chce się ta dioda zapalić. Czy jak dałem te dwa bajty danych równe 0b00000000 to powinno działać? Przeczytałem że adres równy 0x00 to tak jakby wysyłanie polecenia do wszystkich urządzeń podpiętych. Co o tym sądzicie?

    Ok jest jeszcze gorzej ;/ Nawet jak w warunkach zmienię cokolwiek to i tak się komunikat nie wyświetli. Nie mam pojęcia już co jest nie tak. ;/
  • #23 9405812
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    I znowu prośba o schemat

    "Zwarłem nóżkę A0 układu do Vcc a pozostałe dwie wiszą. Czy to znaczy że adres urządzenia to 0100001 0/1 ?"

    Adres masz być może $4e.
    Jak to mówią jeden obraz powie wiecej niż tysiąc słów.
    Co to za maniera wiesz co może wisieć?
  • #24 9405828
    brzydal91
    Poziom 12  
    Posty: 116
    Ocena: 3
    Napisałem że teraz mam wszystkie piny adresu podłączone do GND. Wyrażenie na końcu adres " 0/1 " oznacza że na końcu może być albo 1 albo 0 w zależności czy chcemy do urządzenia zapisywać dane czy z niego czytać. Postaram się jeszcze dzisiaj jakiś schemat narysować
  • #25 9405841
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Może masz serię "A".
    Czy sprawdziłeś czy dostajesz ACK od układu?
    A zmieniłes w programie adres?
  • #26 9405883
    brzydal91
    Poziom 12  
    Posty: 116
    Ocena: 3
    Ok znalazłem powiedzmy przyczynę błędu. Udało mi się zdebugować układ. Po odpaleniu kodu który wkleiłem kilka postów wyżej dostaję komunikaty:
    Error: TWSR & 0xF8 != MT_SLA_ACK
    oraz
    Error: TWSR & 0xF8 != MT_DATA_ACK
    Co o tym sądzicie?

    Uwaga Uwaga!! Udało mi się osiągnąć cel :)
    Oto działający kod dla urządzenia o adresie 0b0100100 + 0 <- zapis do urządzenia
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Bardzo dziękuję Wam za pomoc. Pozdrawiam
  • #27 9406463
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    a do czego będziesz wykorzystywał ten ekspander?
    bo jeśli tylko do zapalania i gaszenia diodek, to polecam przesiadkę na 74hc595 lub podobny - cena i ilość układów połączonych jednocześnie przemawiają na ich korzyść.
    No chyba, ze układ ma też odbierać jakieś dane (analizować stany) to wtedy nic z tego
  • #28 9406528
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Też to proponowałem, ale tu chyba nie chodzi o jakies konkretne wykorzystanie ale o samo wycwiczenie połaczenia po dwóch drutach.
    A tak swoją drogą czy stosowanie TWI sprzetowego jest korzystniejsze bez wykorzystywania przerwań? Na dodatek przywiązany jest konkretnych pinów co może na pająku jest bez znaczenia ale już przy projektowaniu płytki stanowi dodatkową trudność.
  • #29 9406836
    brzydal91
    Poziom 12  
    Posty: 116
    Ocena: 3
    Chodzi o konkretne wykorzystanie ekspanderów portów. Buduję coś w rodzaju karty rozszerzającej do PC na USB. Do takiej karty będzie można doczepiać inne karty z urządzeniami na TWI. Do tego odpowiednie oprogramowanie i użytkownik będzie mógł np. badać stany na wejściach do karty, sterować wyjściami na karcie. Myślę też jakie urządzenia jeszcze podpiąć, na pewno dołączę kartę z ADC i kartę z wyświetlaczem na której by widział np obciążenie procesora, używaną pamięc RAM przez system. Może macie pomysły co jeszcze można by było na TWI podpiąć by stworzyć rozszerzenie do PC?


    Pojawiły się nowe problemy z układem. Tym razem chcę odczytywać stany na pinach PCF. Podłączyłem do PCF osiem diod. Diody się zapalają jeśli na pin wystawię "0". Z Waszych postów wynika, że jeśli na pin wystawię "0" to działa on jako wyjście. Teraz moje pytanie brzmi. W jaki sposób podłączyć diodę do pinu, aby po ustawieniu na nim "1" można było odczytać z PCF że na tym pinie pojawił się stan wysoki?
    Trochę to dla mnie nielogiczne jeśli pin jest wyjściem a po podłączeniu do niego diody podłączonej do Vcc spowoduje zapaleniem się diody ;/

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik próbuje podłączyć układ PCF8574 do Atmega8 za pomocą biblioteki TWI, napotykając problemy z komunikacją i ustawieniem stanu wysokiego na pinach. Wskazówki dotyczące podłączenia pinów adresowych do GND oraz skanowania I2C w celu wykrycia urządzeń zostały zaproponowane. Użytkownik dowiaduje się, że PCF8574 działa jako quasi-bidirectional, co oznacza, że stan wysoki na pinie działa jako pull-up, a nie jako aktywne wyjście. Wskazówki dotyczące podłączenia diod LED oraz użycia rezystorów są również omawiane. Użytkownik ostatecznie osiąga sukces w komunikacji, ale nadal ma pytania dotyczące odczytu stanów na pinach.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA