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

[Z80] Z80 I2C ASM - Jak poprawnie komunikować się z EEPROM 24LC16?

Roman98 05 Cze 2013 22:15 4575 8
REKLAMA
  • #1 12386902
    Roman98
    Poziom 12  
    Chciałbym na moim leciwym CA80 (z procesorem Z80 i portem 8255) wykorzystać EEPROM 24LC16 jako pamięć podręczną na pisane programy. Przesyłanie danych wg I2C. Linie SDA i SCL podciągnięte do +5V poprzez rezystory 4,7 k. Program napisany w asemblerze Z80 niestety nie działa, wszystkie odczyty są równe 0. Linią SDA podłączona do PA0, linia SCL do PC4. Po ustawieniu portu PA / SDA/ na odczyt, pojawia się stan wysoki (rezystory podciągające). Nie znam na tyle angielskiego, aby z noty katalogowej 24LC16 wyciągnąć słuszne wnioski. Bazowałem na tym, co znalazłem w necie i na forach.
    Czy mógłby mi ktoś podpowiedzieć, gdzie robię błąd ? (pamięć pod IC-PROG działa).

    W skrócie procedura wygląda tak:
    - start
    - wpisz adres EEPROM (A0)
    - wpisz adres komórki w EEPROM (01, druga komórka?)
    - start
    - wpisz adres EEPROM (A1) - odczyt
    - czytaj bajty
    - stop
    Próbowałem też po starcie wysłać A1 i odczytywać pamięć ale wynik daje też 0.
    Za każdą poradę będę wdzięczny.
    Kod (asembler Z80):
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Poprawiono prezentację składniową kodu, LordBlick
  • REKLAMA
  • #2 12387418
    BlueDraco
    Specjalista - Mikrokontrolery
    Tak na pierwszy rzut oka na końcu procedury STOP brakuje RET.

    Nie bardzo rozumiem jak sterujesz linie I2C z 8255, tzn. jak symulujesz otwarty dren?

    Linia SDA powinna mieć stale ustawiony stan wyjścia 0, a jedynkę powinieneś uzyskiwać przez zmianę kierunku na wejście.
  • REKLAMA
  • #3 12387595
    Roman98
    Poziom 12  
    Procedura STOP jest ostatnią i RET wg mnie nie jest potrzebne, po STOP mogę sobie wyświetlić zawartość przepisaną do RAM.

    Jeśli do portu 8255 wysyłam CONTROL 90H (port PA WEJ - SDA, port PC WYJ - SCL) rezystor podciągający wymusza na linii SDA stan H, a linia SCL pozostaje w takim stanie, jakim była - L lub H. Natomiast CONTROL 80H ustawia obie linie na L.

    Być może opóźnienia nie są takie jak trzeba ale sprawdzałem z różnymi wartościami i bez zmian.
  • REKLAMA
  • #4 12387836
    BlueDraco
    Specjalista - Mikrokontrolery
    Ciekawe skąd procesor wie, że procedura jest "ostatnią" i co robi po wykonaniu instrukcji "OUT (PC), A" na jej końcu... Jak myślisz?

    To, co piszesz powyżej, nie zgadza się z programem. Wielokrotnie zmieniasz w nim stan linii SD przez zapis portu A, a powinieneś to robić tylko raz na początku - ustawić na 0. Potem "machanie" linią SDA powinno być realizowane wyłączenie przez zmianę kierunku.

    Podejrzana jest dla mnie też procedura CLK i ogólnie to, co robisz z linią SCL.
  • #5 12389287
    Roman98
    Poziom 12  
    Dzięki za zainteresowanie, być może uda się coś zrobić.
    Po wykonaniu procedury STOP, miałem napisany podprogram (specyficzny dla CA80, więc go tu nie zamieściłem) odczytujący kolejno pamięć od 0C700H. Zgoda, w tym przypadku po STOP, Z80 idzie „w krzaki” ale wcześniej powinien zapisać do pamięci to, co odczytał z 24LC16, poczynając od 0C700H w CA80.
    Z tego, co wyczytałem w publikacjach n/t I2C, wysyłając dane, najpierw ustawiam linię SDA /L lub H/, potem CLK robi impuls (ok. 80 us, może być mniej). Podczas odczytu, najpierw ustawiam SCL na H, odczytuję SDA, następnie SCL ustawiam na L. Czy to jest dobrze?
    Spróbuję ustawiać SDA z L na H poprzez zmianę w WYJ na WEJ (muszę całość przeprogramować). Tylko jak to pogodzić ze sterowaniem SCL, muszę spróbować.
    W datasheets 24LC16 nie ma (przynajmniej nie potrafiłem odnaleźć) takiej sekwencji (START, A0, nr kom, START, A 1). Widzę, że popełniłem błąd, powinienem ponowny START przenieść wyżej, przed
    LD E, 0A1H. Wieczorem zrobię próbę.
    Dzięki za podpowiedzi!
  • REKLAMA
  • #6 12394720
    Roman98
    Poziom 12  
    Zrobiłem jak zaleciłeś BlueDraco (sterowanie linią SDA poprzez zmianę WEJ/WYJ na porcie 8255), ale nadal jest to samo, odczytuje same zera. Wygląda tak, jakby pamięć ciągle miała ustawione ACK i nie może z tego wyjść (sprawdziłem to podczas pracy krokowej na CA80, jest taka możliwość). Nie wiem co może być źle w sterowaniu.
    Jak pisałem wcześniej, sekwencja: wyślij A1, potem numer komórki, od której ma nastąpić odczyt, bez ponownego startu, daje też zera przy odczycie :cry:
    BlueDraco, co miałeś na myśli pisząc:
    "Podejrzana jest dla mnie też procedura CLK i ogólnie to, co robisz z linią SCL."

    Trwało to trochę, bo miałem inne "domowe" sprawy.
    Dziękuję moderatorowi LordBlick za poprawienie wizualne poprzedniego kodu.


    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #7 12402271
    Roman98
    Poziom 12  
    Po zmianach programu, udało się zrobić odczyt. :D
    Dzięki BlueDraco za podpowiedzi. Korzystałem również z opisów "Radzio" na <mikrokontrolery.net>
    Oto kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #8 12409844
    Tuxlab
    Poziom 13  
    Witam !

    Najlepiej zastosować układ PCF8485 jest konwerter magistrali równoległej 8 bitów na I2C, bardzo wygodny w użyciu do Z80. Używam go z powodzeniem od kilku lat i nigdy nie było problemu z obsługą różnych układów (czujniki i pamięci).

    pozdrowienia
    T
  • #9 13605093
    Roman98
    Poziom 12  
    temat zamykam. Problem leżał w niewłaściwym sterowaniu liniami DATA i CLOCK. Kiedy poprawiłem sterowanie za poradą BlueDraco (stan linii zmieniamy jako WEJ lub WYJ), program działa!
REKLAMA