pcf8574 problem z PINAMI

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
Zdzisiu
Młodszy majsterkowicz
Posty: 4
Rejestracja: 13 mar 2018, 22:22

pcf8574 problem z PINAMI

Post autor: Zdzisiu » 22 cze 2018, 20:19

Witam. Zakupiłem ostatnio expander pcf8574. Podłączam go do Maliny i każdy pin jest w stanie wysokim i do tego strasznie słabo świecą pod nim diody LED. Ja nie bardzo wiem jak tam się odnieść do poszczególnego pinu tak jak to ma miejsce w Malinie (gpio write 4 1) Tak tutaj są jakieś dziwne oznaczenia np. 0x20 i nie mam pojęcia do jakiego portu się to odnosi. Mógłby mi ktoś łopatologicznie wyjaśnić zasadę działania tego? W internecie jakoś nie bardzo umiałem znaleźć odpowiednich materiałów.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Bob2462
Majsterkowicz
Posty: 79
Rejestracja: 13 mar 2016, 00:11

Re: pcf8574 problem z PINAMI

Post autor: Bob2462 » 22 cze 2018, 22:54

Obsługa PCF8574 jest całkiem prosta.
Jest tam tylko jeden rejestr który może zostać zapisany lub odczytany poprzez magistralę I2C.
Adres układu jest ustawiany za pomoc pinów A0, A1 i A2. (Szczegóły w dokumentacji).

Oto schemat blokowy układu:
Obrazek

Ze względu na istnienie tylko jednego rejestru kontrolnego sterowanie pinami jest dość ciekawe.

Każdy z pinów jest przypisany do jednego z bitów w rejestrze układu. P7 - bit 7 (najbardziej znaczący bit), P6 - bit 6, .... P0 - bit 0 (najmniej znaczący bit).
Odczytywanie stanu pinów jest proste. Wystarczy odczytać rejestr a stan każdego bitu danych w otrzymanym bajcie będzie odpowiadał stanowi pinu.

Jednak ciekawie robi się wtedy kiedy musimy ustawić tryb pracy i stan pinu.
Robimy to poprzez wykonanie operacji zapisu na rejestrze.
Jednak jak ustawić tryb pracy pinu (wejście/wyjście) kiedy do dyspozycji mamy tylko jeden bit dany???

Otóż jak wynika z dokumentacji:

- Aby ustawić stan pinu jako wejście z domyślnym niskim stanem należy:
0. Podłączyć do pinu rezystor podciągający do GND który ustawi na nim stan niski.
1. Ustawić bit odpowiadający pinowi na 1.
2. Pin pozostanie w stanie niskim a w odczytywanym bajcie bit odpowiadający pinowi będzie miał wartość 0 (chyba, że pojawi się sygnał).

- Aby ustawić pin jako wejście z domyślnym stanem wysokim należy w zasadzie to samo.
0. Podłączyć do pinu rezystor podciągający do VCC.
1. Ustawić bit odpowiadający pinowi na 1.
2. Pin pozostanie w stanie wysokim a w odczytywanym bajcie bit odpowiadający pinowi będzie miał wartość 1 (chyba, że pojawi się sygnał).

- Aby ustawić pin jako wyjście w stanie wysokim należy:
0. Po prostu zmienić odpowiadający mu bit na 1.

- Aby ustawić pin w stanie niskim jako wyjście należy:
0. Ustawić bit odpowiadający pinowi na 0.

Jak widać nie ma żadnej różnicy pomiędzy ustawianiem pinu jako wejście w stanie wysokim / niskim oraz ustawianiem pinu jako wyjście w stanie wysokim.
Wynika to z faktu, że pin jest w stanie dostarczyć tylko ok 100uA prądu w stanie wysokim. (Ustawianym poprzez zapisanie 1 do bitu w rejestrze).
Dzięki temu jeśli chcemy ustawić pin jako wejście w stanie niskim to wystarczy dodać do niego odpowiedni rezystor który odprowadzi te 100 uA do GND dając stan niski (napięcie bliskie 0V).
Warto jednak wspomnieć o tym, że układ ma funkcję redukowania długości zbocza rosnącego sygnału a działa ona poprzez podanie impulsu większego natężenia prądu na pin przechodzący ze stanu niskiego w wysoki. Impuls ten jest bardzo krótki (pół cyklu zegara) nie mniej jednak warto mieć świadomość jego istnienia.

Natomiast pin w stanie niskim (ustawianym poprzez ustawienie 0 na bicie odpowiadającym pinowi) jest w stanie przyjąć stosunkowo duże natężenie prądu co może być wykorzystywane do sterowania na przykład diodami LED. ( max 25mA na pin, ale suma obciążenia wszystkich pinów nie może przekroczyć 80mA).

Tutaj jest mały schemat z dokumentacji który powinien dobrze zilustrować jak działają piny w ekspanderze.
Obrazek

Mam nadzieję, że rozjaśniłem trochę temat.

Daję jeszcze link do dokumentacji z TI: http://www.ti.com/lit/ds/symlink/pcf8574.pdf
Oraz z NXP: https://www.nxp.com/docs/en/data-sheet/ ... F8574A.pdf
Zdzisiu
Młodszy majsterkowicz
Posty: 4
Rejestracja: 13 mar 2018, 22:22

Re: pcf8574 problem z PINAMI

Post autor: Zdzisiu » 23 cze 2018, 09:24

No chyba mniej więcej wiem już jak to działa, ale dalej nie wiem czemu on podaje takie małe napięcie i dalej nie wiem jak się bawić w tym rejestrze. chodzi mi o to, że np pisze program migania diody i chce zeby pinem sterującym był P7 czyli bit7 i jak mam się do niego odnieść, bo np. 0x20 to jest chyba P4 i nie wiem skad się to bierze. Jeśli wpisze takie polecenie i2cdetect -y 1 to wyskakuje mi jakaś tabelka ale nie mam pojecia jak z niej korzystac
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: pcf8574 problem z PINAMI

Post autor: ethanak » 23 cze 2018, 09:35

Jak podłączasz LEDy?
a) jeden koniec do PCF, drugi do GND, po drodze rezystor,
b) jeden koniec do PCF, drugi do Vcc, po drodze rezystor.

Ta śliczna tabelka pokazuje wykryte adresy i2c, jeśli nic więcej nie podłączyłeś to jedynym wykrytm będzie Twój PCFi tego adresu będziesz używać w programie.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Bob2462
Majsterkowicz
Posty: 79
Rejestracja: 13 mar 2016, 00:11

Re: pcf8574 problem z PINAMI

Post autor: Bob2462 » 23 cze 2018, 15:32

Aby diody migały trzeba je podłączyć pomiędzy VCC a pinem ekspandera (oczywiście po drodze rezystor). Wtedy zapalasz LED ustawiając pin w stanie niskim.
Tak jak napisałem pin ekspandera nie jest w stanie dostarczyć więcej niż 100 uA prądu (nie chodzi tutaj o napięcie tylko o natężenie prądu) więc diody nie będą ci świeciły jeśli podłączysz je pomiędzy pinem ekspandera a GND.

Jeśli chodzi o podłączenie do RPI:
RPI PCF8574
SDA SDA
SCL SCL
VCC(3.3V) VCC
GND GND

Pamiętaj o włączeniu I2C za pomocą narzędzia raspi-config.

Bardzo ważna rzecz to ustawienie adresu ekspandera za pomocą pinów A0 A1 A2.
Trzeba je odpowiednio podłączyć do VCC lub do GND.
Do tego adresu będziesz się odwoływał wysyłając lub odbierając dane więc jest on istotny.

Tutaj jest tabelka która przedstawia jak adres zależy od ustawiania tych pinów:
Obrazek

Powodem dla którego adres do odbierania i adres do wysyłania danych jest inny jest fakt, że dokumentacja jako adres przyjmuje bajt który wysyłamy na początku transakcji danych. A bit 0 to bit który określa czy chcemy dane odebrać czy wysłać.
Obrazek

Oczywiście w twoim przypadku najprawdopodobniej będziesz chciał użyć jakiejś biblioteki do obsługi I2C.
W takim przypadku najprawdopodobniej adresem który będziesz musiał podać jest adres do wysyłania danych (biblioteka automatycznie zmieni sobie bit R/W jeśli będziemy chcieli dane odebrać).

Teraz odpowiadając na twoje pytanie o to jak bawić się z tym rejestrem:
Aby zapisać rejestr musisz użyć funkcji która wysyła dane przez I2C.
Aby odczytać rejestr musisz użyć funkcji która odbiera dane przez I2C (w zasadzie najpierw wysyła ona żądanie a w odpowiedzi dostaje dane).
Funkcje te są dostarczone przez bibliotekę I2C.

Teraz pytanie o to magiczne 0x20. Otóż jest to najprawdopodobniej stan rejestru zapisany w postaci szesnastkowej. (Nie widzę twojego kodu więc nie jestem pewien). 0x20 to odpowiednik 00100000.
Do manipulowania poszczególnymi bitami w bajcie najłatwiej wykorzystać operatory binarne.

Do ustawienia jakiegoś bitu w bajcie wykorzystujesz operator OR oraz operator przesunięcia w lewo.
O tak:

Kod: Zaznacz cały

uint8_t stanRejestru = 0x00;//ustaw początkowy stan rejestru na 00000000
stanRejestru = stanRejestru | 1<<n;
//opcjonalnie: // stanRejestru |= 1<<n;
Taki kod spowoduje zapisanie 1 do bitu położonego n miejsc licząc od prawej strony (najmniej znaczącego bitu). (Pamiętamy, że liczmy o 0).

Do wyczyszczenia bitu można wykorzystać operację AND i NOT.
O tak:

Kod: Zaznacz cały

uint8_t stanRejestru = 0xFF;//ustaw początkowy stan rejestru na 11111111
stanRejestru = stanRejestru & (~1<<n);
//opcjonalnie: // stanRejestru &= ~1<<n;
Taki kod spowoduje zapisanie 0 do bitu położonego n miejsc licząc od prawej strony (najmniej znaczącego bitu). (Pamiętamy, że liczmy o 0).

Co dokładnie się tu dzieje? Google zna odpowiedź wystarczy poszukać (:
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: pcf8574 problem z PINAMI

Post autor: Slawek » 24 cze 2018, 19:41

Aby zwiększyć wydajność prądową pinów PCF, trzeba dać równolegle do diody rezystor pullup do VCC.
http://www.ti.com/lit/ds/symlink/pcf8574.pdf - figure 19.

Pozdr
Awatar użytkownika
Marhef
Złota rączka
Posty: 1164
Rejestracja: 18 lis 2011, 02:18

Re: pcf8574 problem z PINAMI

Post autor: Marhef » 24 cze 2018, 20:12

Sławek, o tym nie wiedziałem. Dzięki za podpowiedź
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: pcf8574 problem z PINAMI

Post autor: Slawek » 24 cze 2018, 20:33

Nie ma sprawy, mam nadzieję, że się przyda.

Pozdr
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: pcf8574 problem z PINAMI

Post autor: ethanak » 24 cze 2018, 21:18

@Slawek - Jesteś pewien że w ten sposób zwiększasz wydajność prądową? Przeczytaj uważnie czego dotyczy rys. 19.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: pcf8574 problem z PINAMI

Post autor: Slawek » 25 cze 2018, 18:32

Jestem pewien, to sprawdzone w praktyce.

Pozdr
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: pcf8574 problem z PINAMI

Post autor: ethanak » 25 cze 2018, 19:00

Z mojej znajomości angielskiego wynika, że chodzi o zmniejszenie prądu pobieranego przy zasilaniu bateryjnym, jeśli pin do którego podłączona jest leda skonfigurowany jest jako input... ale oczywiście mogę się mylić.
@Marhef, zerkniesz tam?
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Bob2462
Majsterkowicz
Posty: 79
Rejestracja: 13 mar 2016, 00:11

Re: pcf8574 problem z PINAMI

Post autor: Bob2462 » 26 cze 2018, 15:39

Tam jest napisane, że to zmniejsza zużycie energii kiedy LED jest podłączony pod VCC układu. Wtedy napięcie na pinie spada poniżej VCC ze względu na spadek napięcia na diodzie.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1164
Rejestracja: 18 lis 2011, 02:18

Re: pcf8574 problem z PINAMI

Post autor: Marhef » 26 cze 2018, 16:25

Jako, że zostałem wywołany do tablicy ;-) więc się wypowiem.
@ethanak, owszem, w nocie jest ten sposób opisany jako ograniczenie prądu przy podłączeniu diody na pinie wejściowym
@Slawek, nie wiem, na jakiej zasadzie to działa, ale jeśli zwiększa wydajność prądową pinu, to nic tylko się cieszyć :)
Podsumowując wypowiedź: nie wiem, czy producent przewidział takie zachowanie układu. Ale jeśli coś jest głupie, ale działa, to nie jest głupie
ODPOWIEDZ

Strony partnerskie: