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

Problem z wejściem P7 (IO7) układu PCF8574AP w [C]

jaros85 17 Mar 2010 19:34 1184 4
  • #1 7843910
    jaros85
    Poziom 20  
    Witam mam expander PCF8574 połączony z uC Atmega8
    Przy zapisie bajtu do układu wszystko jest OK.

    Problem występuje gdy chcę odczytać stan wszystkich 8 portów układu PCF8574.
    Gdy czytam dane i żaden port nie jest zwarty z masą to otrzymuje wartość 0xFF czyli same jedynki logiczne.

    Mogę zwierać dowolne nóżki do masy i wszystko działa ale gdy zewrę nóżkę P7 (IO7) z masą i nastąpi czytanie danych cały program się zatrzymuje komplety brak reakcji. Jedyna pomoc do reset uC ale nie odłączam nic od zasilania.

    Dane wysyłam przez port szeregowy
    START_TWI();
    WRITE_TWI(0x71);
    temp=READ_TWI(1);
    STOP_TWI();
    
    itoa(temp,wyslij,2);
    nadajstring(wyslij);//w tym miejscu wysyłam dane przez rs232
    
    temp=0x7F;
    itoa(temp,wyslij,2);
    nadajstring(wyslij);//w tym miejscu wysyłam dane przez rs232


    Jak widać dla pewności wysyłam jeszcze wartość jakiej się powinienem spodziewać temp=0x7F; po zwarciu nóżki P7 z masą i działa.

    Chcę jeszcze dodać że uC się nie zawiesza bo odsyła dane jakie wysyłam do niego przez port szeregowy. Wygląda jak by zawieszał się sam moduł I2C.
  • #2 7843960
    tadzik85
    Poziom 38  
    Sygnał ACK z slave po wysłaniu adresu pewnie psuje ci szyki.
  • #3 7844047
    jaros85
    Poziom 20  
    Sygnał ACK jest generowany zawsze z PCF8574AP i ja nie mam wpływu na jego stan zawsze się pojawia bez względu czy czytam dane czy je zapisuje.

    Dodano po 3 [godziny] 3 [minuty]:

    Chciałbym jeszcze dodać jeden fakt jaki zaobserwowałem:

    Jeżeli chcę wykorzystać wyprowadzenie INT w moim PCF8574AP to działa to trochę dziwnie. Jak zwieram dowolne wyjście P0-P7 z masą to na wyjściu INT pojawia się stan niski ALE jak podłączę wyjście INT do dowolnego wejścia w uC (ja połączyłem INT z PD3) i wykonam następujący kod:

    if(bit_is_clear(PIND,PD3))
    {
    START_TWI();
    WRITE_TWI(0x71);
    temp=READ_TWI(1);
    STOP_TWI();
    
    _delay_ms(10);
    while(bit_is_clear(PIND,PD3)) {}
    _delay_ms(10);
    
    itoa(temp,wyslij,2);
    nadajstring(wyslij);
    
    nadajznak(10);
    nadajznak(13);
    
    }


    To ta pętla nie wiedzieć czemu wykona się 2 razy mimo iż program się zatrzyma na pętli while. Nawet jak dodam opóźnienie rzędu 5 sekund to i tak pętla wykona się 2 razy (sygnał INT jest tak długo utrzymywany w stanie niskim jak długo trwają wszystkie opóźnienia)

    Dopiero jak pętla będzie wyglądać tak: to się wykona tylko raz:

    if(bit_is_clear(PIND,PD3))
    {
    START_TWI();
    WRITE_TWI(0x71);
    temp=READ_TWI(1);
    STOP_TWI();
    
    _delay_ms(50);
    while(bit_is_clear(PIND,PD3)) {}
    _delay_ms(50);
    
    itoa(temp,wyslij,2);
    nadajstring(wyslij);
    
    nadajznak(10);
    nadajznak(13);
    
    START_TWI();
    WRITE_TWI(0x70);
    STOP_TWI();
    }


    Dziwne :?:

    Ale tak czy inaczej nie wiem dlaczego na nóżce P7 może być tylko stan wysoki jeżeli będzie niski to się wszystko wiesza.
  • #4 7845245
    tadzik85
    Poziom 38  
    Kwestia połączeń. Przerwanie może być generowane również po zapisie wobec tego przerwanie wykona się 2x. Ale to tylko moje domniemania.
  • #5 7847126
    jaros85
    Poziom 20  
    Ale ja wyjście INT wykorzystuje do obsługi pętli w której następuje odczyt stanów wejść nie generuje nim zewnętrznego przerwania w uC.

    I na dodatek ja z tego układu czytam a nie zapisuje do niego. Dopiero jak wstawiłem w kodzie procedurę zapisu to pętla się wykona tylko raz.

    Moim zdaniem może to być wina samego układu PCF8574AP po prostu ma taką konstrukcję i tyle. Gdy się z niego czyta dane i generowany jest w tym samym czasie sygnał INT to jest problem. Wszystko gra jeżeli jak wygeneruje INT ale zwolnię go przed procedurą odczytu danych ale w takiej sytuacji to przecież nie da się odczytać stanu wyjść jeżeli chciałbym do nich podłączyć przyciski.
REKLAMA