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

[PCF8574] PCF8574 - Jak poprawnie odczytać stany portów P0-P2?

astral 02 Cze 2006 12:47 2027 8
REKLAMA
  • #1 2689395
    astral
    Poziom 17  
    Posty: 285
    Pomógł: 3
    Ocena: 36
    Witam!

    Po wszelakich próbach obsługi układu PCF8574 byłem zmuszony założyć nowy temat na forum.
    Otóż mój problem leży w błędnym odczycie przycisków podłączonych do portów P0...P2. Z tego co wyczytałem, to przed odczytem danych portów trzeba je ustawić w stan wysoki, tak też robię, tzn. wysyłam ciąg 00000111, dalej odczytuję stan portów. Jako wyznacznik stanów użyłem diody LED która mryga odpowiednią ilość razy zależną od odczytanych danych.

    Oto źródło programu:

    Config Sda = P3.5
    Config Scl = P3.4
    
    Dim Keys As Byte
    Dim I As Byte
    Dim A As Byte
    
    Declare Sub Flashled(a As Byte)
    Declare Sub Ledblink
    
    Keys = 0
    
    Do
    
     I2csend &H4E , &B00000111
     I2creceive &H4F , Keys
    
     If Keys <> 0 Then Call Flashled(keys)
    
     Wait 2
    
    Loop
    
    End
    
    Sub Flashled(a As Byte)
    
     For I = 1 To A
      Call Ledblink
     Next
    
    End Sub
    
    Sub Ledblink
    
     Reset P1.4
     Wait 1
     Set P1.4
     Waitms 225
    
    End Sub
    

    Przy przytrzymaniu przycisku podłączonego do portu P0, dioda mryga 6 (B110) razy, i tak odpowiednio P1 - 5 (B101) razy i P2 - 3 (B011) razy.
    A powinno być kolejno: B001, B010 i B100. Nie mam pojęcia dlaczego tak się dzieje.
    Adresowanie sprawdzałem kilka razy. Trzy porty adresowe mam podłączone do plusa. Porty P0...P2 są podciągnięte do plusa przez rezystory, a przyciski podłączone do masy.
    Czy ktoś ma jakiś pomysł w czym leży problem?
  • REKLAMA
  • #2 2689554
    Holy

    Poziom 14  
    Posty: 155
    Pomógł: 5
    Ocena: 6
    Proponuję zastosować kondensatory filtrujące trzaski switchy. Dołącz coś koło 47nF równolegle do klawisza.
    Konto firmowe:
    HOLTECH
    Fabryczna 18 lok. U6, Białystok, 15-483 | Tel.: +48XXXXXXXXX (Pokaż) | Strona WWW: www.holtech.eu
  • #3 2689936
    astral
    Poziom 17  
    Posty: 285
    Pomógł: 3
    Ocena: 36
    Debouncery mam już zastosowane.
  • REKLAMA
  • Pomocny post
    #4 2690049
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    astral napisał:
    Debouncery mam już zastosowane.

    A co ma piernik do wiatraka :?:
    Błąd masz w programie , a nie w sprzęcie :D
    Nie wnikając w szczegóły , dopisz jedną linię w kodzie:
    
    Do
    
     I2csend &H4E , &B00000111
     I2creceive &H4F , Keys
     Keys = Keys Xor &B00000111            'negacja 3 najmłodszych bitów
     If Keys <> 0 Then Call Flashled(keys)
    
     Wait 2
    
    Loop
    ...
    

    Wnioski wyciągnij sam :D

    Piotrek
    PS
    A gdy nie wciskasz żadnego przycisku , to LED nie mryga 7 razy :?:
    Nie wspominasz o tym :(
  • #5 2690159
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    "Otóż mój problem leży w błędnym odczycie przycisków podłączonych do portów P0...P2. Z tego co wyczytałem, to przed odczytem danych portów trzeba je ustawić w stan wysoki, tak też robię, tzn. wysyłam ciąg 00000111, dalej odczytuję stan "

    Hmmm jakoś w mojej dokumentacji nic nie zaznaczyli o takim sposobie odczytu danych ...

    Dla FastAVR
    
                 I2Cstart 64
                 tmp1=I2Cread,Nack
                 I2Cstop
    


    Działa wyśmienicie .... w fastavr I2Cread autoamtycznie zeruje LSB adresu.
    Pozdrawiam
  • REKLAMA
  • #6 2690847
    astral
    Poziom 17  
    Posty: 285
    Pomógł: 3
    Ocena: 36
    zumek napisał:
    A co ma piernik do wiatraka :?:
    Błąd masz w programie , a nie w sprzęcie :D

    To była moja odpowiedź na poprzedni post.

    zumek, dzięki! Rozwiązałeś mój problem. Że też ja nie zauważyłem żadnego związku między prawidłowym wynikiem a błędnym:

    001 -> 110
    010 -> 101
    100 -> 011

    Zapomniałem wspomnieć o tym, że dioda mrygała siedmiokrotnie przy żadnym przycisku nie naciśniętym.

    crazy_phisic, program jest napisany w BASCOM 8051 dla AT89C2051.
  • #7 2691568
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    A czy to ważne w czym jest program napisany? całe setno mojej wypowiedzi tkwi w stwierdzeniu że nie musisz ustawiać stanów wysokich, tylko bezpośrednio odczytać stan portu.
  • #8 2692172
    Holy

    Poziom 14  
    Posty: 155
    Pomógł: 5
    Ocena: 6
    Gdybyś od razu napisał dokładnie co otrzymujesz, to szybciej znaleźlibyśmy rzekomy błąd. :)
    A co do zapisu jedynek. To porty w PCFie są analogiczne do tych w całej serii 51, czyli quasidwukierunkowe. W stanie niskim mają pull-down do masy o wydajności 20mA, natomiast w wysokim wydajność spada do 100uA (źródło prądowe). Standardowo po włączeniu wszystkie porty ustawiają się na stan wysoki, więc są w stanie wysterować jakąś delikatną rzecz (bazę tranzystora lub bramkę), ale również mogą być łatwo "przyziemione". O i tak to mniej więcej wygląda.
    Konto firmowe:
    HOLTECH
    Fabryczna 18 lok. U6, Białystok, 15-483 | Tel.: +48XXXXXXXXX (Pokaż) | Strona WWW: www.holtech.eu
  • REKLAMA
  • #9 2692488
    astral
    Poziom 17  
    Posty: 285
    Pomógł: 3
    Ocena: 36
    Holy napisał:
    Gdybyś od razu napisał dokładnie co otrzymujesz, to szybciej znaleźlibyśmy rzekomy błąd. :)

    Widać napisałem wystarczająco dużo informacji by uzyskać pomoc od zumka.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu błędnego odczytu stanów przycisków podłączonych do portów P0-P2 układu PCF8574. Autor stosuje wysłanie wartości 00000111 przed odczytem portów, co jest zgodne z zaleceniami, jednak odczytane dane są nieprawidłowe. Wskazano, że problem leży w oprogramowaniu, a nie w sprzęcie, i zasugerowano zastosowanie operacji XOR z maską 00000111 na odczytanych danych, aby poprawnie zinterpretować stany portów. Potwierdzono, że porty PCF8574 są quasi-bidirectional z domyślnym stanem wysokim, co wymaga odpowiedniego przetwarzania odczytanych bitów. Wskazano, że nie jest konieczne ręczne ustawianie stanów wysokich portów przed odczytem, a sam odczyt można wykonać bezpośrednio. Program napisany jest w BASCOM 8051 dla mikrokontrolera AT89C2051. Dodatkowo poruszono kwestie debouncingu i filtracji zakłóceń, jednak problem rozwiązano na poziomie korekty odczytu danych w kodzie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA