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

Dlaczego PCF8574 w Bascom AVR nie dekoduje stanu wejść?

adams40 04 Cze 2007 12:37 2835 6
REKLAMA
  • #1 3951904
    adams40
    Poziom 11  
    Posty: 63
    Pomógł: 1
    Ocena: 6
    Witam! Napisałem następujący program:
    I2cinit
    Pcf = 255
    I2cstart
    Do
    I2csend &H40 , Pcf
    Waitms 100
    I2creceive &H41 , Pcf
    Pcf = Pcf Or &B11111111
    Loop Until Pcf = &B00000001

    'wczsniej oczywiście skonfigurowałem porty scl i sda, A0,A1,A2 połączone z masą, na porty wejściowe podaję stany 0 . mogę wówczas zaobserwować zmianę na linii INT układu PCF ale niestety program jakby nie dekoduje stanu na wejściach i nie wychodzi z pętli.
    Czy popełniam jakiś bład? co jest nie tak? bardzo proszę o pomoc.
  • REKLAMA
  • #2 3952529
    Andy74
    Poziom 25  
    Posty: 525
    Pomógł: 103
    Ocena: 24
    Witam.

    Po pierwsze: Adresowanie układu. Jeśli korzystamy z poleceń I2csend; I2creceive podajemy zawsze adres podstawowy. Bascom sam wie, że jeśli użyłeś I2creceive, to chcesz czytać z układu i trzeba ustawić najmłodszy bit adresu, więc powinno być:
    I2creceive &H40 , Pcf

    Po drugie:
    Pcf = Pcf Or &B11111111

    Po co to? Przecież jakakolwiek_zmienna_bajtowa or &B11111111 da zawsze w wyniku &B11111111...

    Pozdrawiam
    Andy
  • REKLAMA
  • #3 3954145
    adams40
    Poziom 11  
    Posty: 63
    Pomógł: 1
    Ocena: 6
    Witam, rzeczywiście ten operator OR dałem chyba z rozpędu nie zastanawiając się a tu raczej AND jest potrzebny. Sugeruję się wskazówką z książki Marcina Wiązani , że aby porty P0-P7 miały pracować jako wejścia należy wysłać na nie 1.Chyba ,ze coś źle zrozumiałem to bardzo proszę mnie poprawić. Uruchamiałem I2C posługując się przykładem właśnie z tej ksiązki ale niestety to nie działa. A propos adresowania.....czy dobrze rozumiem, że poprostu zamieniłem adresy zapisu i odczytu?
    Pozdrawiam adams40
  • REKLAMA
  • #4 3954362
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    Nota katalogowa nic nie wspomina o wstępnym ustawianiu stanów logicznych, układ rozpoznaje po wprowadzonym adresie "co chcemy zrobić" i sam ustawia wyprowadzenia w odpowiedni stan.

    Przykład progrmu który zawsze działa ;)
    
       I2cstart
       I2cwbyte &H41
       I2crbyte Tmp , Nack
       I2cstop
    
  • #5 3955154
    adams40
    Poziom 11  
    Posty: 63
    Pomógł: 1
    Ocena: 6
    Nic tylko ręce załamać......korzystam panowie z Waszych podpowiedzi ale do niczego mnie to nie doprowadziło. Oto fragment kodu, który napisałem:
    Cls
    Const Adresw = &H40
    Const Adresr = &H41
    Do
    I2cstart
    I2cwbyte Adresw
    I2cstart
    I2cwbyte Adresr
    I2crbyte Pcf , Nack
    I2cstop
    Cls
    Lcd Pcf
    Wait 1
    loop

    proszę, poprawcie panowie ten kod aby to zadziałało.
    chcę tylko sczytywać stan wejść układu PCF i wyświetlić go na LCD...jak to zadziala będę mógł dalej ruszyć z programem.
    pozdrawiam adams40.
  • REKLAMA
  • #6 3955233
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    Jaką masz dokładnie wersje układu pcf8574 czy pcf8574A bo różnią się one adresami. Linie SDA i SCL podciągnięte do zasilania?
  • #7 3955373
    adams40
    Poziom 11  
    Posty: 63
    Pomógł: 1
    Ocena: 6
    cracy_physic.....serdeczne dzięki za tą podpowiedź.....gdyby nie ona byłbym przekonany, że pullup-y mam dołączone. Korzystam z płytki ZL2AVR i linie scl i sda z rezystorami podciągającymi są rozdzielone od lini scl i sda z układu PCF.....dopiero po Twojej uwadze to zauważyłem.
    Wcześniej oczywiście kombinowałem z różnymi adresami.
    I2C oczywiście ruszyło :)
    Serdeczne dzięki. Przy okazji czy możesz odnośnie tego fragmentu kodu, który wkleiłem przekazać swoje uwagi?...czy można to jakoś uprościć?
    pozdrawiam -adams40

    Dodano po 1 [godziny] 16 [minuty]:

    Witam ponownie.Napisałem ,ze I2C ruszyło...ale ruszyło nie na programie, który wkleiłem 2 posty wyżej. We wklejonym programie chciałbym aby na LCD wyświetlana była wartość sczytana z wejść układu PCF. tak się nie dzieje. Jeśli można proszę o dalszą pomoc.

    Dodano po 23 [minuty]:

    Witam jeszcze raz. Dopisałem do programu jeszcze jedną linię:
    pcf = pcf XOR &B11111111
    i wszystko jest OK. Wartości z wejść są wyświetlane prawidłowo.
    Dziękuję wszystkim za wskazówki, zamykam temat.
    pozdrawiam adams40

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu z odczytem stanu wejść układu PCF8574 w Bascom AVR poprzez magistralę I2C. Główne błędy to nieprawidłowe adresowanie urządzenia (zamiana adresów zapisu i odczytu) oraz niewłaściwe operacje bitowe na odczytanych danych (użycie OR zamiast XOR lub AND). Układ PCF8574 wymaga podciągnięcia linii SDA i SCL do zasilania rezystorami pull-up, co było początkowo pominięte. Po poprawnym ustawieniu adresów (np. &H40 dla zapisu i &H41 dla odczytu), zapewnieniu rezystorów podciągających oraz zastosowaniu operacji XOR z maską &B11111111 na odczytanych bajtach, możliwe jest prawidłowe odczytanie stanu wejść i wyświetlenie ich na LCD. Różnice w adresach między wersjami PCF8574 i PCF8574A również mogą mieć wpływ na komunikację. Przykładowy, działający fragment kodu wykorzystuje polecenia I2cstart, I2cwbyte, I2crbyte i I2cstop w odpowiedniej kolejności.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA