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

PIC16f77 i2C: Problemy z obsługą EEPROM 24C16 i RTC Philips PFC8583

silelis 01 Maj 2007 13:42 1960 2
REKLAMA
  • #1 3838210
    silelis
    Poziom 12  
    Posty: 114
    Ocena: 24
    Cześć,

    Jestem dość młodym projektantem układów elektronicznych, a co za tym idzie mam małe doświadczenie w rozwiązywaniu dziwnych nieprocedurowych zachowań układu.

    Właśnie zaprojektowałem układ na PIC16f77 i zaczynam powoli pisać obsługę poszczególnych urządzeń. Program piszę w CCS http://www.ccsinfo.com/content.php?page=compilers.

    W tej chwili natrafiłem na dość dziwną nigdzie nie opisywaną sytuację z I2C. Otóż mikrokontroler obsługuje u mnie 3 urządzenia na szynie I2C (EEprom_TEXT z komunikatami na wyświetlacz, EEprom_DATA do zapisu informacji i Real Time Clock do liczenia czasu)

    Budowa magistrali:
    PIC16f77 i2C: Problemy z obsługą EEPROM 24C16 i RTC Philips PFC8583
    wartości rezystorów R5 i R6 to: 4,7 kOhma, EEPROM 24C16, RTC Philips PFC8583.

    Opis dziwnego zachowania układu:

    Na początek pisałem procedurę obsługi EEPROM_TEXT i wyświetlanie informacji na LCD (EEPROM_DATA i RTC były wyjęte z podstawek). Ponieważ wszystko szło dobrze, dołożyłem EEPROM_DATA i chciałem pisać blok akwizycji danych pomiarowych. W tym momencie program zaczął mi się wykładać. Dziwne zachowanie polegało na tym, iż np. mikrokontroler pierwsze cztery byte komunikatu odczytywał z EEPORM_DATA a resztę (nawet cały wyswieltacz LCD4x16 z prawidłowego EEPROM_TEXT). Wyjąłem więc EEPROM_DATA i przełożyłem EEPROM_TEXT w miejsce EEPROM_DATA. Oczywiście nie zmieniałem w kodzie adresu urządzenia I2C. Ku mojemu zdziwieniu program odczytał komunikaty, mimo, że teoretycznie nie powinien. Czyta je również wtedy, gdy EEPROM_TEXT siedzie w miejscu RCT. Gdy do układu dołożę RTC to w ogóle ten zaczyna pierwszy się odzywać na wszelkiego rodzaju komunikację na magistrali.

    Wygląda to tak jakby na całej szynie I2C nie obowiązywała zasada odczytu adresu urządzenia do którego komunikat jest kierowany. Co jest tego przyczyną???
  • REKLAMA
  • #2 3838258
    MirekCz
    Poziom 35  
    Posty: 2220
    Pomógł: 330
    Ocena: 62
    A jaki jest twój kod?
    Jeżeli urządzenia mają różne adresy, to możliwe, że wysyłasz informacje do wszystkich urządzeń (jest taka możliwość - adres urządzenia == 0000000 to powoduje).
    To by tłumaczyło dlaczego dostajesz odpowiedź od każdego z nich i wszystko działa ok tylko jak jest jedno urządzenie na szynie.

    Najlepiej sprawdź w kodzie assemblera (listingu) wygenerowanym przez kompilator jak na prawdę kompilator ustawia adres do komunikacji I2C.
  • #3 3857305
    silelis
    Poziom 12  
    Posty: 114
    Ocena: 24
    Wielu początkujących elektroników szuka na to pytanie odpowiedzi. Problem polega na konflikcie adresu i2c zegara i eeprom.

    Zegar można zaadresować 101000x a eeprom ma na stałe wpisane adresy.

    Jak bysmy nie zaadresowali RTC to zawsze mamy konflikt adresów.

    1010000 to adres pierwszej strony pamięci EEPROM
    1010001 to adres drugiej strony pamięci EEPROM.

    Rozwiązaniem jest odseparowanie tych dwuch układów switchem i2c ja do tego celu urzyłem PCA9544 4-ro kanałowy switch.
REKLAMA