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

PCF8583 i EEPROM 2404 na I2C z AT89C2051 - niewidoczny EEPROM

Andrzej Majewski 08 Lis 2006 13:21 3545 14
REKLAMA
  • #1 3201236
    Andrzej Majewski
    Poziom 2  
    Posty: 2
    Proszę o pomoc, mam problem z zastosowaniem zegara pcf8583 oraz eepromu 2404 sterowanych poprzez i2c mikrokontrolerem at892051. Obydwa układy z osobna są rozpoznawane, natomiast wpięte oba w magistralę - widoczny jest jeden (pcf8583) z adresem np 160 drugi pomimo innego adresu np 178 i jakiegokolwiek mozliwie innego jest niewidoczny. Poziomy SDA, SCL podciągnięte rezystorami. Inne proóby z 2404 i pcf8574 na wspólnej i2c wypadły pomyślnie. Problem tkwi zapewne w pcf 8583? Będę wdzięczny za udzieloną radę
  • REKLAMA
  • #2 6360545
    stozu
    Poziom 10  
    Posty: 34
    Ocena: 6
    sprawdzić pasowałoby czy przypadkiem nie widzi pod adresem 160 układu 24c04, ja mam pamięć 24c16 i adres pierwszej strony jest 160, taki sam ma adres układ 8583, właśnie siedzę i próbuję coś z tym zrobić bo zegar czas urzeczywistego mi zwariował jak obsługiwałem równolegle. Na tą chwilę mój RTC wyświetla mi głupoty na LCD i próbuję coś z tym zrobić.

    Prawdopodobnie przy obsłudze eeproma powpisywało mi głupoty do RTC, ale nie wiem jak go przywrócić do poprawnego działania. Napisałem prosty program w BASCOMIE tylko do wyświetlania czasu z RTC ale wyświetla wciąż źle.... chodzi o dane pobierane z RTC.
  • #3 6360989
    arturt134
    Poziom 27  
    Posty: 792
    Pomógł: 76
    Ocena: 24
    Sprawdź dokładnie adresowanie - odczyt i zapis. Problem na pewno leży gdzieś tam.
  • #4 6459701
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    Problem może leżeć po stronie adresowania. Też z tym walczyłem. Mam 24c16 i PCF8583 na wspólnych liniach SCL i SDA z rezystorami (zestaw uruchomieniowy). Po podpięciu linii adresowych 24c16 do VCC i linii A0 zegara do VCC mam zegar dostępny p[od adresami 162/163.
  • REKLAMA
  • #5 6460611
    stozu
    Poziom 10  
    Posty: 34
    Ocena: 6
    RTC (PCF8583) na adresie 162/163 i eeprom 24c16 na 160/161 to nie ma sensu przecież.

    Pinów A0 A1 i A2 24c16 w eepromie nie można samemu ustawiac, bo układ używa ich do przełączania sobie storn pamięci, poza tym ten eeprom ma osiem stron pamieci po 256 bajtów.

    Wynika z tego że zajmuje wtedy: 160/161, 162/163, 164/165 itd. do 174/175

    Czyli adres RTC i jednej ze stron i tak będzie się pokrywał. Traci się wówczas jedną stronę pamięci, a czasami zapisując do zegara mikrokontroler zapisuje też do pamięci eeprom i są później śmieci i RTC w ogóle nie pracuje.

    Gdy użyłem RTC i eeproma równocześnie, nadpisało chyba coś w pamięci PCF-a i teraz pisząc do niego zapisuje mi chyba do eeproma, a jak odczytujęto mam jakieś śmieci i zegar nie działa.

    Problem powyższy mam ze swoją płytką ewaluacyjną, ponieważ zaprojektował ją jakiś infantylny projektant - nie wspominając o tym, że spieprzyli jeszcze kilka innych spraw.

    Osobiście proponujęinne kości np. 24c256 która jest trochę droższa ale adres ma już (8+7)15 bitowy i nie pokrywa się z adresem RTC (łącznie z numerem strony, których jest 512 po 64 bajty)
  • #6 6461105
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Zakładającego temat , patrząc na datę , sprawa już nie interesuje. Ale .....
    PCF8583 może mieć adres 160/161 lub 162/163, ustawiane jest to nóżką A0
    24C04 może mieć adres : 160/161 , 164/165 , 168/169 , 172/173 , ustawiane jest to nóżkami A1 i A2
    Można sobie wybrać żeby się nie pokrywały.
    Adres układu jest czym innym niż adresy pamięci i ich stron
  • REKLAMA
  • #7 6461945
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    Mnie interesuje :) Napisałem, że 24c16 i PCF mam podpięte pod jedną linię I2C i wyboru adresów dokonuje "nogami adresowymi". Jednak jak się okazuje pospieszyłem się, bo układ nie działa stabilnie - prawdopodobnie raz czyta z PCF, raz z pamięci, zapis robi nie do PCF ale do pamięci.
    W nocie 24c16 wyczytałem zdaje się, że nie korzysta on z adresowania sprzętowego, czyli że nie można ustawić adresu zwierając wyjścia A0-A2 do VCC??
    Nie wiem też co masz na myśli pisząc, że adres układu to coś innego niż adres strony pamięci?? Czy to wynika z tego, że adres strony pamięci do zapisu/odczytu podajemy dopiero po poprawnym zaadresowaniu układu?
    Coś na zasadzie odczytu z PCF - podajemy:
    - pod adres układu 162 (do zapisu) podajemy rejestr z którego będziemy czytać
    - spod adresu 163 układu (odczyt) czytamy odpowiednie wartości rejestrów
    Czy z 24c16 adresowanym np. pod 160/161 będzie podobnie:
    - pod 160 zapisujemy stronę pamięci np. 172 (dla zapisu) 173 (dla odczytu)
    - spod 172 czytamy dane, pod 173 zapisujemy dane?
  • REKLAMA
  • #8 6464885
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    24c16 ma wyprowadzone a0...a2 wiec jest możliwość ustawić adres urządzenia i może być ich dokładnie 8 (adresów ), czyli tyle ile może zaadresować szyna i2c.
    Format danych adresu urządzenia wygląda tak :
    1010 -cztery stałe bity sygnatury
    x x x - trzy bity adresu, reprezentują je nóżki A2, A1, A0 ,jeśli wszystkie są wyprowadzone to adres można ustalać od 0...8
    X -ostatni bit jest odpowiedzialny za odczyt/zapis.
    Podsumowując : 1010 xxx X wysłane na szynę i2c, zaktywizuje tylko układ o adresie xxx do odczytu lub zapisu w zależności od bitu X.
    Następnie na szynę wysyłamy adres danej (czyli pozycje w eepromie) do zapisu/odczytu.

    Cytat:
    Czy z 24c16 adresowanym np. pod 160/161 będzie podobnie:
    - pod 160 zapisujemy stronę pamięci np. 172 (dla zapisu) 173 (dla odczytu)
    - spod 172 czytamy dane, pod 173 zapisujemy dane?

    Nie.
    Do urządzenia o adresie np. 160 (1010 000 0) wysyłamy polecenie zapisu danej której adres (pozycja w eeprom) zawarta jest w następnym rozkazie, to samo dotyczy odczytu : np 161 (1010 000 1), w obu przypadkach rozkaz zawiera tylko adres urządzenia i bit zapis/odczyt.
    Przyklad :
    acall start
    mov a,#160 ;adres urzadzenia + bit zapisu
    acall write
    mov a,poz_epr ; adres w eepromie
    acall write
    mov a,dana ; bajt do zapisu
    acall write
    ---------
    no i odczyt :

    acall start
    mov a,#160 ;adres urzadzenia + bit zapisu
    acall write
    mov a,poz_epr ; adres do odczytania w eepromie
    acall write
    acall start
    mov a,#161 ; adres urządznie + bit odczytu
    acall write
    acall read ; odczyt danej z eepromu, spod adresu wczesniej ustalonego.

    Uff, to chyba byłoby na tyle.
  • #10 6468519
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    Wszystko ładnie i ślicznie wytłumaczone tylko jest jeden problem:
    Cytat:

    The 16K does not use any device address bits but instead the 3 bits are used for memory
    page addressing. These page addressing bits on the 4K, 8K and 16K devices
    should be considered the most significant bits of the data word address which follows.
    The A0, A1 and A2 pins are no connect.

    Jeśli dobrze rozumiem 24c16 nie używa wyjść adresowych do adresowania urządzenia ale do adresowania strony pamięci do zapisu/odczytu. I wyraźnie napisali, że piny A0-A2 nie są podłączone.
    24c16 używa tylko A2 do adresowania urządzenia, A0-A1 służą do adresowania stron pamięci.
    Czyli? 24c16 ma w końcu stały adres urządzenia 160/161?

    Jeśli A0-A2 są adresami stron pamięci jak przeadresować te strony na adresy inne niż 162/163 (na takich chodzi PCF)?
  • #11 6468992
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    No faktycznie jest problem, nie miałem do czynienia z pamięciami powyżej 2k, a to co napisałem, rzeczywiście odnosi się tylko do max.2k -ilowych.
    Koledzy : wicy i stozu macie RACJE.
    Rzeczywiście w 24c16 adresy stron podajemy tylko w poleceniu A0/A1 .... AE/AF, nie manipulując nogami a0...a2.
    I pokrywają się one z adresami PCF-a, i w takim razie nie wolno ich razem stosować ?
    Zainteresowała mnie sprawa i będę to badał, tym bardziej ze pow. 16k wszystko jeszcze bardziej się komplikuje.
    (a wyglądało tak prosto)
  • #12 6469151
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    Nie bardzo potrawię sprawdzić to co napisał stozu
    Cytat:
    Pinów A0 A1 i A2 24c16 w eepromie nie można samemu ustawiac, bo układ używa ich do przełączania sobie storn pamięci, poza tym ten eeprom ma osiem stron pamieci po 256 bajtów.

    bo dopiero zacząłem zabawę z I2C (i to na początek w Bascom).
    Na pierwszy rzut oka coś tu wygląda bez sensu. Skoro strony są adresowalne (a tak podaje datasheet) i nie są adresowalne sprzętowo to jak je adresować programowo? Może programowo da się przeadresować strony pamięci z pominięciem adresu 162/163?
  • #13 6473006
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Już wiem !
    Pamięć 24c16 nie posiada nóg a0...a2 (w nocie aplikacyjnej z rysunku wynika że ma, przynajmniej na pierwszy rzut oka).
    Posiada ona 8 stron po 256 bajtów , adresujemy je od A0,A2,A4,A6,A8,AA,AC,AE a w następnym poleceniu po dajemy pozycje na stronie, np.
    mov a,#A0     ;tu podaje strone pamieci
    call write  
    mov a,poz_eprom   ; pozycja na wybranej wczesniej stronie
    call write
    mov a,dana   ; bajt do zapisu
    call write

    I nie ma możliwości uniknięcia zdublowania adresu z PCF-em.
    -----------------------------
    Pamięć 24c32 posiada nogi a0...a2 i służą one do ustalenia adresu urządzenia na zasadach już nam znanych i można jej przydzielić dowolny z 8 adresów (a0...ae) , tak żeby sie nie pokrywał z PCF-em.
    Zawiera ona 16 stron po 256 bajtow, adresowanie ich odbywa sie tak :
    mov a,#A0  ; adres urządzenia, może byc inny ustalony nogami a0...a2
    call write
    mov a,A0    ;strona 0 pamieci, moze byc dowolna z zakresu a0,a1,a2,a3...ad,ae,af
    call write
    mov a,poz_eprom ; pozycja na wybranej wczesniej stronie
    call write
    mov a,dana   ; bajt do zapisu
    call write

    I to chyba byłoby na tyle, już wszystko (?) wiemy. Sprawdzałem w symulacji, działa jak trzeba.
  • #14 6476083
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    Niestety, mimo różnych prób nie udało mi się zestawić 24c16 i PCF8583 na jednej linii I2C. :(
    Kupiłem 24c256 i problem od ręki zniknął - przynajmniej jeśli idzie o zegar.
  • #15 9110560
    Andrzej Majewski
    Poziom 2  
    Posty: 2
    Dziękuję wszystkim którzy zaiteresowali się tematem. Problem rozwiązałem lecz zapomniałem podzielić się tym z kolegami. Nie pamiętam już jaka to była przyczyna, było to tak dawno. Urządzenie (programowany dzwonek szkolny) działa poprawnie przez kilka już lat. Doświadczenia jakie zdobyłem pozwolą na wykonanie wspólnie z uczniami nowszej wersji np. z synchronizacją czasu DCF lub GPS i dużymi korytarzowymi wyświetlaczami.

Podsumowanie tematu

✨ Problem dotyczył współpracy zegara czasu rzeczywistego PCF8583 oraz pamięci EEPROM 24C04/24C16 na wspólnej magistrali I2C z mikrokontrolerem AT89C2051. Oba układy działały poprawnie osobno, jednak po podłączeniu razem widoczny był tylko PCF8583, natomiast EEPROM nie był wykrywany mimo ustawienia różnych adresów. Dyskusja wykazała, że problem wynika z nakładania się adresów I2C obu układów. Pamięć 24C16 ma stały adres urządzenia (np. 160/161) i adresuje strony pamięci programowo, co powoduje konflikt z adresami PCF8583 (160/161 lub 162/163), które można ustawić nóżką A0. W efekcie zapisy do RTC mogą nadpisywać pamięć EEPROM i odwrotnie, co prowadzi do błędów odczytu i niestabilnej pracy. Rozwiązaniem okazało się zastosowanie pamięci 24C256, która posiada wyprowadzenia A0-A2 umożliwiające ustawienie unikalnego adresu urządzenia, eliminując konflikt z PCF8583. Dyskusja zawierała szczegółowe wyjaśnienia dotyczące adresowania I2C, różnic w budowie i adresowaniu pamięci 24C16 i 24C32/24C256 oraz praktyczne uwagi dotyczące implementacji w Bascomie. Autor potwierdził, że po zmianie pamięci problem został rozwiązany, a urządzenie działa stabilnie przez kilka lat.
Wygenerowane przez model językowy.
REKLAMA