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

EEPROM 24C08 - jak uzyskać dostęp do stron i programować pamięć?

Madergames9 15 Lis 2006 20:01 3770 8
REKLAMA
  • #1 3228332
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Zamontowalem w ukladzie ww pamiec a zastosowalem program do obslugi mniejszej kosci 24C02 no i mam problem. Przeszukalem forum i owszem znalazlem ze moja kosc ma strony i aby uzyskac 1 adres musze podpiac piny A0, A1, i A2 do plusa. Mam jednak problem jak sie dokopac do tych stron i jak jest wtedy z programowaniem tzn czy trzeba zastosowac jakies specjalne instrukcje przepelnienia?. Ile mam dostepnej pamieci jak mam podpiety do plusa tylko pin A2. Drugie pytanko to czy wyjscie RW ma byc podpiete do masy czy zostawione wolne..?
    POZDRO...
  • REKLAMA
  • #2 3228453
    witold16
    Poziom 13  
    Posty: 112
    Pomógł: 4
    Ocena: 1
    Końcówki Ax muszą być podpięte pod minus albo plus zmienia to w ten sposob adres urządzenia. Szeregowa pamięc eeprom padzielana jest na strony na 256 komórek każda po 1 bajcie . Jesli chodzi o wyjscie RW (reda and write) to tam takiego nie ma pomyliło ci sie z wyświetlaczem tam sa dwa styki do magistrali I2C sdai scl napięcie zasilające masa i te Ax i to wszystko. Najpierw podajesz adres urządzenia z ktorego zamierzasz korzystać następnie adres komórki(ek) a następnie dane i to wszystko
  • REKLAMA
  • #3 3228472
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Te kości praktycznie niczym sie nie róźnią (jeśli chodzi o organizacje pamięci). Zmiana dotyczy sposobu adresowania tzn. mozna podłączyć tylko dwie takie kości i adres ustawia się poprzez pin A2(albo 0-gnd, albo 1-+5V). Aby zadresować te 1024 bajty musisz mieć 10bitów. Rysunek poniżej pomoże Ci zrozumiec w czym rzecz (podajesz adres nie 8 a 10-bitowy kosztem pinów A0 i A1).
    Załączniki:
    • EEPROM 24C08 - jak uzyskać dostęp do stron i programować pamięć? adres.jpg (14.48 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #4 3228515
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    W zasadzie , odpowiedź uzyskałeś od kolegi arturssp , w jednym z poprzednich postów.Więc mogę potwierdzić to , co już zostało powiedziane.
    24C08 jest "widziana" na szynie I2C jako 4 pamięci 24C02 zajmujące 4 kolejne adresy(zapis) 160,...,166 dla A2->GND(lub nie podłączone) i 168,...,174 dla A2->VCC.Natomiast pin WP->GND umożliwia zapis/odczyt , a pin WP->VCC tylko odczyt.Pozostałe szczególy w dokumentacji.
    Koniec.

    Piotrek
  • REKLAMA
  • #5 3228537
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Oki pomylilem sie chodzilo mi o pin WP czyli write protect. Jest tez jeden problem otoz programem do zczytywania adresow magistrali odczytywal mi kilka adresow a nie jeden jak pin A2 wisial w powietrzu a po podpieciu go do plusa adres zmienial sie na jeden 168. Wczesniej zczytal mi adresy 160, 162, 164, 166, jednak adres 162 gryzlby sie z adresem PCF8583. Wiec mam kostke z adresem 168 i co dalej..?. Jestem zielony w tym temacie. Jak zmienic listing ponizej, abym mogl z niej w pelni korzystac...?

    Sub Read_eeprom(adres As Byte , Byval Value As Byte)
    I2cstart 'generate start
    I2cwbyte 168 'slave adsress
    I2cwbyte Adres 'address of EEPROM
    I2cstart 'repeated start
    I2cwbyte 169 'slave address (read)
    I2crbyte Value , 9 'read byte
    I2cstop 'generate stop
    End Sub

    Sub Write_eeprom(adres As Byte , Byval Value As Byte)
    I2cstart 'start condition
    I2cwbyte 168 'slave address
    I2cwbyte Adres 'asdress of EEPROM
    I2cwbyte Value 'value to write
    I2cstop 'stop condition
    Waitms 10 'wait for 10 milliseconds
    End Sub


    Minelo pare minut iiiiii....

    Dobrze sprawdzilem programikiem i teraz mam adresy jak wyzej napisal czyli 4 od 168 do 174. Jak to wykorzystac?. Czytalem cos o stronach i nic z tego nie rozumiem. Czy moze ktos posiada program do sprawdzania tych pamieci ?. Najlepiej w Bascom-ie bo taki mam i nim programuje. Procek to Atmega 168
    Prosze pomozcie bo moj projekt stanal w miejscu. Mam pytanko czy jezeli program ma problem z odczytem pamieci to sie zatrzyma a tym miejscu..?
  • REKLAMA
  • #6 3228765
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Drogi kolego.Zanim rozwiążemy problem adresowania poszczególnych komórek Twojej pamięci , zastanów się nad poniższą procedurą ...
    
    Sub Read_eeprom(adres As Byte , Byval Value As Byte)
    ...
    End Sub
    

    ... bo ona jest "do kitu" :(

    Piotrek
  • #7 3229085
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Domyslam się, że chodzi o istniejaca konstrukcje ktora powinna wygladac tak..

    Sub Read_eeprom(adres As Byte , Value As Byte)
    ...
    End Sub

    Ale kompilator mi wtedy wywala taki komunikat w miejscu :

    Sub Erase_eeprom 'procedura czyszczenia pamięci eeprom
    Cls
    Upperline
    Lcd " Kasowanie... "
    Wait 2
    Cls
    Upperline
    Lcd " Na pewno ??? "
    Call Zapytanie
    Do
    Call Sprawdz
    If P7 = 1 Then
    Cls : Lcd "** Czekaj !!! **"
    For Licznik = 1 To 255
    Call Write_eeprom(licznik , 255)
    Next Licznik
    Cls : Lcd "Ok!"
    Wait 1
    Exit Do
    End If
    If P1 = 1 Then Goto Main
    Loop
    End Sub

    Komunikat kompilatora brzmi:

    Error : 248 Line : 643 BYVAL should be used in declaration [(112)]

    Dodalem BYVAL w deklaracji zmiennych w instrukcji

    Declare Sub i Sub i kompilator to "lyknal"... wiec o co chodzi...?. Ten program chodzil na 89C4051 kompilowanym i wgrywanym pod BASCOM-em 8051
    W czym wiec problem istnieje..?

    Dodano po 1 [godziny] 17 [minuty]:

    Oki chyba przerobilem lekcje nauczyciela... i wedlug mnie teraz listing w skrucie powinien wygladac tak..?

    Declare Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
    Declare Sub Read_eeprom(byval Adres As Byte , Value As Byte)

    Const Addressw = 168 'slave write address
    Const Addressr = 169 'slave read address

    Dim B1 As Byte , Adres As Byte , Value As Byte 'dim byte

    Main:

    Do
    Call Write_eeprom(1 , 3) 'write value of three to address 1 of EEPROM

    Call Read_eeprom(1 , Value) :
    Cls :
    Lcd Value 'read it back
    Wait 2
    Call Read_eeprom(5 , Value) :
    Cls
    Lcd Value
    Wait 2
    Loop

    Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
    I2cstart 'start condition
    I2cwbyte Addressw 'slave address
    I2cwbyte Adres 'asdress of EEPROM
    I2cwbyte Value 'value to write
    I2cstop 'stop condition
    Waitms 10 'wait for 10 milliseconds
    End Sub

    Sub Read_eeprom(byval Adres As Byte , Value As Byte)
    I2cstart 'generate start
    I2cwbyte Addressw 'slave adsress
    I2cwbyte Adres 'address of EEPROM
    I2cstart 'repeated start
    I2cwbyte Addressr 'slave address (read)
    I2crbyte Value , Nack 'read byte
    I2cstop 'generate stop
    End Sub


    Tzn w skrocie i tylko obrazowo...
    Korzystalem z sampli BASCOM-a jakby co...
    To teraz jak jest oki to jak z tym adresowaniem i odczytem tej koszteczki..? Hem zapis rowniez...
  • #8 3230549
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Madergames9 napisał:
    ... Oki chyba przerobilem lekcje nauczyciela... i wedlug mnie teraz listing w skrócie powinien wygladac tak..?

    Declare Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
    Declare Sub Read_eeprom(byval Adres As Byte , Value As Byte) ...

    Ok :D
    Proponuję byś jawnie deklarował Byref Value As Byte , bo przy większym projekcie można się nieźle zamotać ;)
    Jeśli zaś chodzi o meritum , to może to wyglądać jak poniżej:
    
    $hwstack = 32
    $swstack = 24
    $framesize = 24
    Const Devicebase = &HA8
    
    Declare Sub Read_eeprom(byval Adres As Word , Byref Value As Byte)
    Declare Sub Write_eeprom(byval Adres As Word , Byval Value As Byte)
    Declare Sub Calc_adr(byval Ad As Word)
    Declare Function Eeprom_r(byval Adres As Word) As Byte
    
    'Użyłem globalnych , bo "zjadają" odrobinę mniej flasha niż lokalne ;)
    Dim Dana As Byte , Page As Byte , Byteaddr As Byte , Adr As Word
    
    Adr = 1000
    Dana = 85
    Do
       Call Write_eeprom(1000 , Dana )
       Call Read_eeprom(adr , Dana )
       'lub  użycie funkcji
       Dana = Eeprom_r(adr)
    Loop
    
    Sub Read_eeprom(byval Adres As Word , Byref Value As Byte)
    Call Calc_adr(adres)
    I2cstart       'generate start
    I2cwbyte Page       'slave adsress + numer strony
    I2cwbyte Byteaddr       'address of EEPROM
    
    Page = Page Or 1       'adres do odczytu
    'Incr Page             'lub tak
    'Page.0 = 1            'albo tak
    
    I2cstart       'repeated start
    I2cwbyte Page       'slave address (read) +numer strony
    I2crbyte Value , 9       'read byte
    I2cstop       'generate stop
    End Sub
    
    Sub Write_eeprom(byval Adres As Word , Byval Value As Byte)
    Call Calc_adr(adres)
    I2cstart       'start condition
    I2cwbyte Page       'slave address
    I2cwbyte Byteaddr       'asdress of EEPROM
    I2cwbyte Value       'value to write
    I2cstop       'stop condition
    Waitms 10       'wait for 10 milliseconds
    End Sub
    
    Function Eeprom_r()
    Call Calc_adr(adres)
    I2cstart       'generate start
    I2cwbyte Page       'slave adsress
    I2cwbyte Byteaddr       'address of EEPROM
    Page = Page Or 1       ' lub inna , wymieniona wcześniej możliwość
    I2cstart       'repeated start
    I2cwbyte Page       'slave address (read)
    I2crbyte Eeprom_r , Nack       'read byte
    I2cstop       'generate stop
    End Function
    
    Sub Calc_adr(byval Ad As Word)
    Page = High(ad) And 3
    Page = Page * 2
    Page = Page Or Devicebase
    Byteaddr = Low(ad)
    End Sub

    Jako dodatek , funkcja(jakoś tak bardziej naturalnie) do odczytu eepromu
    Piotrek
  • #9 3232327
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Wielkie dzieki za podpowiedzi. Faktycznie teraz pamiec mi czyta jak trzeba. Z uzyciem jej w calosci jeszcze chwilke poczekam. Zabieram sie za wlasciwa plytke prototypowa. Jeszcze raz dziekuje
    Jedno male pytanko, czyli powinienem otwarcie zadeklarowac:

    Dim Byref Value As Byte

    Tak..?

    Natomiast

    Declare Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
    Declare Sub Read_eeprom(byval Adres As Byte , Value As Byte)

    Pozostawic czy tutaj tez trzeba cos zmienic..?


    .....pop paru sekundach....

    Dobrze juz zajazylem, wiec to co wczesniej napisalem jest juz nie istotne....:D

Podsumowanie tematu

✨ Dyskusja dotyczy obsługi pamięci EEPROM 24C08, która jest podzielona na strony po 256 bajtów i adresowana jako cztery kolejne kości 24C02 na magistrali I2C. Piny A0, A1, A2 służą do ustawiania adresu urządzenia, co pozwala na adresowanie 1024 bajtów pamięci za pomocą 10-bitowego adresu. Podłączenie pinów A0, A1, A2 do plusa lub masy zmienia adres bazowy kości. Pin WP (Write Protect) steruje możliwością zapisu – podłączenie do masy umożliwia zapis, do plusa blokuje zapis. Wyjście RW nie występuje w tych kościach, pomyłka dotyczyła innego układu. Programowanie wymaga odpowiedniego adresowania i stosowania instrukcji I2C: najpierw adres urządzenia, potem adres komórki pamięci i dane. Przykładowy kod w BASCOM-8051 wymaga deklaracji parametrów z użyciem ByVal i ByRef, aby poprawnie odczytywać i zapisywać dane. Wskazano, że 24C08 jest widziana jako cztery 24C02 o kolejnych adresach, a adresy te zależą od stanu pinu A2. Problemy z adresowaniem i programowaniem można rozwiązać przez odpowiednią konfigurację pinów i poprawne deklaracje w kodzie, co potwierdzono na przykładzie działającego programu.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA