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

[C] Atmega8 -> PCF8574 TWI

brzydal91 15 Kwi 2011 00:17 5359 28
  • #1 9402338
    brzydal91
    Poziom 12  
    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
  • #2 9402512
    krru
    Poziom 33  
    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  
    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  
    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
    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  
    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ę
  • #7 9404415
    krru
    Poziom 33  
    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
    Moderator na urlopie...
    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 -> PCF8574 TWI
  • #9 9404503
    asembler
    Poziom 32  
    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
    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  
    Normalne diody tez swiecą przy 1mA a nawet przy 0.1mA
  • #12 9404626
    piotrva
    VIP Zasłużony dla elektroda
    no chyba, żeby pominąć rezystor, lub znacząco zmniejszyć jego wartość...
    muszę to sprawdzić jak znajdę chwilę czasu
  • #13 9404647
    asembler
    Poziom 32  
    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
    Moderator na urlopie...
    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  
    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  
    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?
  • #17 9404788
    krru
    Poziom 33  
    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  
    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  
    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  
    TWAR w twoim przypadku nie jest ci potrzebne
  • #21 9405624
    krru
    Poziom 33  
    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  
    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  
    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  
    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  
    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  
    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
    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  
    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  
    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 ;/
REKLAMA