Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Zapis eeprom'a 2402 z tablicy

Mariusz_N 28 May 2006 18:22 1254 5
  • #1
    Mariusz_N
    Level 18  
    Witam wszystkich
    *********** Wielka prośba o pomoc ***********
    Napisałem w Bascom'ie na procka AT89c2059 mały programik zamka obsługujący pastylkę Dallas'a. Odczytuje pastylkę i porównuję ze wzorcami które wpisałem w program na stałe i to wszystko działa. Tutaj mam pytanie jak odczytany numer z pastylki który jest w tablicy (8 elementowej) zapisać do eeprom'a np. 2402 ? do tej pory zapisywałem eeprom'a podając mu adres, dana i zapis (przykład w Bascom.pdf) ale teraz tak nie da się zrobić :( Czy można podać tylko adres od którego ma zacząć wpisywać i sam sobie będzie dalej adresował i pobierał kolejno dane z tablicy :?: Wertowałem dużo przykładów ale nigdzie nie natknąłem się na żadne takie rozwiązanie.

    Z góry dziękuję za pomoc lub jakieś przykłady, linki
    Pozdrawiam
  • #2
    elektryk
    Level 42  
    Mariusz_N wrote:
    jak odczytany numer z pastylki który jest w tablicy (8 elementowej) zapisać do eeprom'a np. 2402 ? do tej pory zapisywałem eeprom'a podając mu adres, dana i zapis
    Przecież to się sprowadza do tego samego, bez stosowania zadnych stuczek możesz odczytać pamięć eeprom i skopiować ją do pamięci RAM, a procedura porównująca ma operować na zmiennej w pamięci RAM.
  • #3
    Mariusz_N
    Level 18  
    Ponownie witam
    Dzięki za odpowiedź ale nie chodziło mi o odczyt danych z eeprom'a i porównanie ale o zapis w jednej pętli wszystkich elementów tabeli. Odczyt ID pastylki do tabeli napisałem tak:

    Code:
    1wreset           ' Reset magistrali
    
    1wwrite &H33      ' Odczytaj ID
    For I = 1 To 8             
    Ar(i) = 1wread()  ' Wpisz do tablicy numer ID
    Next


    Mam teraz problem z napisaniem podobnej pętli która zapisze mi do eeprom'a cały numer ID pastylki (dużo parametrów zepisu eeprom,a)
    Jeśli jest to możliwe to proszę o jakieś wskazówki lub przykład
    Dziękuję i pozdrawiam
  • Helpful post
    #4
    arnoldziq
    Moderator of Programming
    Może cos takiego ?


    Code:


    Config Scl = Portc.0                                        ' I2C Clock.
    Config Sda = Portc.1                                        ' I2C Data.
    Config I2cdelay = 100

    Declare Sub I2c_ram_write(byval Addres_desired As Word , Byval Byte_to_write As Byte)       ' Writes data to the I2C EEPROM.
    Declare Function I2c_ram_read(byval Addres_desired As Word ) As Byte       ' Reads data to the I2C EEPROM.
    Declare Function Rw_adress(byval Read_adres As Word) As Byte       ' EEPROM adress calculation
    '****************************************************************************
    Dim Low_byte As Byte , High_byte As Byte , Hc As Byte
    Defword I
    Dim Ar(10) As Byte 


    1wreset           ' Reset magistrali
    1wwrite &H33      ' Odczytaj ID
    For I = 1 To 8             
    Ar(i) = 1wread()  ' Wpisz do tablicy numer ID
    Next


    For I = 1 To 8             
     Call I2c_ram_write(I , Ar(I))  ' zapisz do eeproma
    Next


    '****************************************************************************
    End                                                         'end program
    '****************************************************************************
    Function Rw_adress(byval Read_adres As Word) As Byte
     Hc = High(read_adres)                                      ' get adres DIV/256
     Shift Hc , Left , 1                                        'make Place For READ/WRITE Byte, filed by 0 ( write operation )
     Set Hc.7                                                   ' set Xxxxxxxx to 1
     Reset Hc.6                                                 ' set xXxxxxxx to 0
     Set Hc.5                                                   ' set xxXxxxxx to 1
     Reset Hc.4                                                 ' set xxxXxxxx to 0
     Reset Hc.0                                                 ' set READ/WRITE byte to 0 (write oper.) ' this line is not nessesery
     Rw_adress = Hc                                             ' return value
    End Function
    '****************************************************************************
    Sub I2c_ram_write(byval Addres_desired As Word , Byval Byte_to_write As Byte)       ' Writes data to the I2C EEPROM.
       High_byte = Rw_adress(addres_desired)                    ' calculate high eeprom adres , and write operation
       Low_byte = Low(addres_desired)                           ' Extract low byte of addesss to be written.
       I2cstart                                                 ' Send I2C Start.
       I2cwbyte High_byte                                       ' Send high adres to write to
       I2cwbyte Low_byte                                        ' Send low address to write to.
       I2cwbyte Byte_to_write                                   ' Send the data to be written.
       I2cstop                                                  ' All we want to do is done.
       Waitms 10                                                ' Wait for write to finish up.
    End Sub
    '****************************************************************************
    Function I2c_ram_read                                       ' Reads data from the I2C EEPROM.
    Dim Tmp_byte As Byte
       High_byte = Rw_adress(addres_desired)                    ' calculate high eeprom adres , and write operation
       Low_byte = Low(addres_desired)                           ' Extract low byte of address to be read.
       I2cstart                                                 ' Send I2C Start..
       I2cwbyte High_byte                                       ' Send High byte of address to read from.
       I2cwbyte Low_byte                                        ' Send low byte of address to read from.
       I2cstart                                                 ' Issue another start sequence.
       Set High_byte.0                                          ' set RW byte to 1 ( read oper.)
       I2cwbyte High_byte                                       ' Send high adres to read from
       I2crbyte Tmp_byte , Nack                                 ' Read data from desired location in chip.
       I2cstop                                                  ' All we want to do is done.
       I2c_ram_read = Tmp_byte
    End Function
    '****************************************************************************
  • Helpful post
    #5
    szymtro
    Level 30  
    zapis:
    Code:
    i2cstart
    
    i2cwbyte adres_i2c_pamieci
     for i =1 to 8
     i2cwbyte dane(i)
     next i
    i2cstop

    przy zapisie trzeba zobaczyc ile fizycznie pamiec i2c ma buforu (do szybkiego zapisu bajt po bajcie

    odczyt:
    Code:
    i2cstart
    
    i2cwbyte adres_i2c_pamieci
    i2cstart
    for i=1 to 7
     i2crbyte dane (i), ack
    next i
    i2crbyte dane(8), nack
    i2cstop

    odczyt jest troche bardziej skomplikowany bo nie ma ack (tylko nack) po ostatniej zmiennej. Można to uprościć i w ostatnim bajcie dać jakąś zmienną a potem wywalić ją do kosza.
  • #6
    Mariusz_N
    Level 18  
    Wielkie wielkie dzięki za pomoc arnoldziq i szymtro teraz zajarzyłem jak to zrobić a swoją drogą szkoda że podręcznik do Bascom'a w PDF jest tak ubogi w przykłady.

    Jeszcze raz dzięki :D
    Pozdrawiam
    Temat zamknięty