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

[Bascom] Poprawny sposób zapisu / odczytu EEPROM 24cXX

MES Mariusz 25 Cze 2011 13:30 2356 6
REKLAMA
  • #1 9648411
    MES Mariusz
    Poziom 36  
    Witam.

    Jaki jest poprawny sposób zapisu / odczytu danych do pamięci EEPROM typu 24cXX ?

    W Elektronice Dla Wszystkich 12/2000 str. 22 zaprezentowano procedury:

    Sub Read_eeprom(adres As Byte, Value As Byte)
     I2cstart
     I2cwbyte 160
     I2cwbyte Adres
     I2cstart
     I2cwbyte 161
     I2crbyte Test, 9
     I2cstop
    End Sub
    
    Sub Write_eeprom(adres As Byte, Value As Byte)
     I2cstart
     I2cwbyte 160
     I2cwbyte Adres
     I2cwbyte Value
     I2cstop
     Waitms 10
    End Sub


    Tymczasem w innych źródłach zaleca się najpierw obliczenie wartości MSB, LSB:

    Odczyt_24c256:
     MSB$ = Adres / 256
     LSB$ = Adres Mod 256
     I2cstart
     I2cwbyte 160
     I2cwbyte MSB$
     I2cwbyte LSB$
     I2cstart
     I2cwbyte 161
     I2crbyte Dana , Nack
     I2cstop
    Return


    Zapis_24c256:
     MSB$ = Adres / 256
     LSB$ = Adres Mod 256
     I2cstart
     I2cwbyte 160
     I2cwbyte MSB$
     I2cwbyte LSB$
     I2cwbyte Dana
     I2cstop
    Retun
    


    Wygląda na to, że w przykładach z EDW zapomniano o uprzednim wyznaczeniu MSB oraz LSB. Chyba, że Bascom wykonuje jeszcze jakieś dodatkowe operacje o których nie wiem?
  • REKLAMA
  • #2 9648433
    tadzik85
    Poziom 38  
    Twój 2 przykład dotyczy pamięci o pojemnościach większych niż o ile dobrze pamiętam 512kb. Tam adres jest 2-bajtowy. Stąd różnice.
  • REKLAMA
  • #3 9648488
    MES Mariusz
    Poziom 36  
    Nie o to chodzi. Chodzi o to, że w EDW zrezygnowano z obliczania MSB, LSB

    A gwoli ścisłości - to o co tobie chodzi, czyli zapis do kostek serii 24c02...24c16 powinien wyglądać tak:

    Zapis_24c16:
     'ustalanie w ktorym bloku ma lezec dana
     Blok = Adres / 256
     'oblicznie adresu do zapisu jednej z grup danych
     Adr = 160 'tylko 1010 0000
     Shift Blok , Left , 1
     Adr = Adr + Blok ' teraz jest 1010 (blok) 0
     'oblicznie adresu komorki w ustalonym bloku
     LSB$ = Adres Mod 256
     I2cstart
     I2cwbyte Adr
     I2cwbyte LSB$
     I2cwbyte Dana
     I2cstop
    Return


    Dalej nie jestem pewien dlaczego w EDW zrezygnowano z przeliczenia MSB, LSB.
  • REKLAMA
  • #4 9648510
    tadzik85
    Poziom 38  
    Ten przykład pokazuje jak prosto zrealizować ciągłość kilku małych kości pamięci w jedną.

    Podsumuje ci to. Podałeś 3 przykłady każdy stosuje się w innym przypadku.
    1 dla małych pamięci poniżej 256kb
    2 dla dużych pamięci od 256kb
    3 dla kilku układów małych pamięci, gdzie jako programista nie musisz martwic się wyborem układu. przestrzeń adresowa została zlinearyzowana. Widzisz jakby jedną pamięć.
  • #5 9720190
    MES Mariusz
    Poziom 36  
    Link - czy rzeczywiście ktoś tu wspomina o pamięci wieloukładowej?
  • #6 9720304
    gaskoin
    Poziom 38  
    Nie, ale też link jaki podałeś nie powinien być traktowany jako wiarygodne źródło wiedzy.
  • REKLAMA
  • #7 9721118
    MES Mariusz
    Poziom 36  
    W takim razie tu bardziej wiarygodne źródło: Link 2

    I wracamy do pytania dlaczego w EDW było to zrobione prościej (pierwszy post).
REKLAMA