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

TWI + expander PCF8574. Zapis działa, odczyt już nie.

Jakub17 29 Sie 2018 10:20 822 2
  • #1 17411118
    Jakub17
    Poziom 6  
    Witam

    Mam problem z odczytem bajta na magistrali I2C. Zapis do urządzenia Slave (ekspander PCF8574) działa ( na wyjściach zapalają się odpowiednie diodki) natomiast gdy chce odczytać wartość portu wejściowego ekspandera, to program zatrzymuje się na pętli nieskończonej w funkcji TWI_read() - flaga TWINT nie zostaje ustawiona - sprawdziłem, że nie wykonuje się następna instrukcja po ustawieniu flagi TWINT. Problem występuje na dwóch różnych mikrokontrolerach ATmega328P (Xplained Mini) i ATmega32. Również w przypadku innych urządzeń I2C jak pamięć zewnętrzna EEPROM następuje zawieszenie w funkcji TWI_read().

    main.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i2c_twi.c

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Używam rezystorów pull-upp 1k. Dla 10k układ nie działa poprawnie. Sprawdziłem napięcia na liniach SDA i SCL po "zawieszeniu" programu. Panują jakieś dziwne wartości 1 V z kawałkiem i 2 V z kawałkiem. Układ zasilany napięciem 5 V. Poniżej obrazek z noty katalogowej ekspandera jak ma wyglądać odczyt:
    TWI + expander PCF8574. Zapis działa, odczyt już nie.

    Dodano po 5 [godziny] 17 [minuty]:

    Ktoś moglby zweryfikować moj kod na swoim sprzęcie? Albo coŝ poradzić? Męcze sie juz od dwoch dni I nie wiem co.jest zle :/
  • #2 17412088
    Mandeson
    Poziom 11  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wysyłanie na wyświetlacz trwa kilkadziesiąt / kilkaset milisekund! Rozpoczynasz transmisję i od razu ją przerywasz na bardzo długi czas. Podłączony układ wpada w timeout i mikrokontroler się zawiesza.
    Oprócz tego zamiast wysyłania 0x01 na początku trzeba wysłać 0xFF (żeby ustawić piny na wejścia). Aby wysterować wejścia ekspandera należy zwierać je do masy. Piny mogą być albo wejściami albo zwarte do masy. 1 to jest wejście, 0 to jest zwacie do masy.
    Jeśli chcesz mieć wyjście to wysyłasz np. 0xFE i ostatni pin jest 0v. Działa to na podobnej zasadzie co w 8051.

    Poprawiony kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 17412647
    Jakub17
    Poziom 6  
    Niestaty Twoje porady nie odniosły rezultatu :( Bez znaczenia czy w miejsce przed newralgicznym punktem wkleje kod z wyświetlaczem czy nie, to nadal nie działa. Identyczna sytuacja występuje w przypadku pamięci EEPROM, również następuje zatrzymanie w pętli w funkcji TWI_read. Z jakiegoś powodu flaga TWINT nie zostaje ustawiona...
REKLAMA