Zapis i Odczyt Pamięci AT24Cxx


10
Ocena: None Średnia: 10 (2 głosujących)

Poniżej przedstawione są dwie grupy procedur obsługi pamięci. Dla kostek od AT24C02 do AT24C16 pierwsza grupa (pamięć podzielona na bloki, adres w bloku 8-bitowy) oraz grupa druga od AT24C32 do AT24C512 (pamięć w jednym bloku, adres 16-bitowy)

Język Bascom AVR

Poniżej przedstawiona jest procedura zapisu danych dla pamięci od AT24C02 do AT24C16. Najpierw ustalany jest blok danych dzieląc podany adres przez 256, następnie obliczany jest adres komórki w bloku. W dalszej kolejności za pomocą magistrali I2C zapisywane jest dana pod wskazanym adresem

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
  Adr2 = Adres Mod 256
  I2cstart                                                    
  I2cwbyte Adr                                                 
  I2cwbyte Adr2                                               
  I2cwbyte Dana
  I2cstop
Return

Używanie procedury zapisu:

Adres = xxx
Dana = yyy
Gosub Zapis_24c16

Poniżej przedstawiona jest proceduraodczytu danych dla pamięci od AT24C02 do AT24C16. Obliczenia bloku danych i adresu są analogiczne jak w przypadku procedury zapisu. W dalszej kolejności adresujemy pamięć do zapisu, wykonujemy ponownie warunek startu, co pozwala odczytać wartość wykorzystując ostatnio używany adres.

Odczyt_24c16:
    'ustalanie w ktorym bloku ma lezec dana
  Blok = Adres / 256
    'oblicznie adresu do zapisu jednej z 8 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
  Adr2 = Adres Mod 256
 
  I2cstart                                                   
  I2cwbyte Adr                                             
  I2cwbyte Adr2                                              
  I2cstart
 
  Incr Adr                 'zmiana adresu na odczyt                                     
 
  I2cwbyte Adr                                                  
  I2crbyte Dana , Nack                                         
  I2cstop
Return

Używanie procedury odczytu:

Adres = xxx
Gosub Odczyt_24c16
yyy = Dana

Do zapisu pamięci od AT24C32 do AT24C512 wykorzystujemy procedurę przedstawioną poniżej. Najpierw obliczany jest starszy i młodszy bajt adresu a następnie wysłane są trzy bajty za pomocą magistrali I2C

Zapis_24c256:
  Adr2 = Adres / 256
  Adr3 = Adres Mod 256
 
  I2cstart                                                     
  I2cwbyte 160                                              
  I2cwbyte Adr2                                              
  I2cwbyte Adr3                                               
  I2cwbyte Dana                                               
  I2cstop
Return

Używanie procedury zapisu:

Adres = xxx
Dana = yyy
Gosub Zapis_24c256

Do odczytu pamięci od AT24C32 do AT24C512 wykorzystujemy procedurę przedstawioną poniżej. Sposób obliczania bajtów adresowych jest analogiczny jak w procedurze zapisu. W dalszej kolejności adresujemy pamięć do zapisu, wykonujemy ponownie warunek startu, co pozwala odczytać wartość wykorzystując ostatnio używany adres.

Odczyt_24c256:
  Adr2 = Adres / 256
  Adr3 = Adres Mod 256
 
  I2cstart                                          
  I2cwbyte 160                                              
  I2cwbyte Adr2                                           
  I2cwbyte Adr3                                              
  I2cstart
 
  I2cwbyte 161                                                 
  I2crbyte Dana , Nack                                       
 
  I2cstop
Return

Używanie procedury odczytu:

Adres = xxx
Gosub Odczyt_24c256
yyy = Dana

Zakresy zmiennej Adres w zależności od typu pamięci:
AT24C02 -> 0 - 255
AT24C04 -> 0 - 511
AT24C08 -> 0 - 1023
AT24C16 -> 0 - 2047
AT24C32 -> 0 - 4095
AT24C64 -> 0 - 8191
AT24C128 -> 0 - 16383
AT24C256 -> 0 - 32767
AT24C512 -> 0 - 65535
AT24C1024 -> 0 - 65535 (zapisany zostanie tylko jeden blok pamięci, żeby zapisać drugi należy zmienić bajt adresowy, wynoszący standardowo 160)




Portret użytkownika gosc

zapytanie o zapis / odczyt at24c128

Witam!
Mogłbym prosić o jakiegoś gotowca w bascom zapisującego/odczytującego jakies dane.
chodzi o to, że chcę zapamiętywać adres i komende z pilota rc5 i zapisac to do nieulotnej pamieci.
jako przykład wystarczyłoby zapisywanie jakies stałej wprowadzonej w program. mysle ze dalej już sobie poradzę.

Portret użytkownika mirley

Re: Pamięć

Jakiego uzywasz mikrokontrolera, po co chcesz to zapisywać w zewnętrznej pamięci jak większość AVR'ów ma wewnętrzny eeprom. Poza tym przeczytaj opis wyżej, prościej już nie jestem Ci w stanie tego przedstawić. Wlejasz całą procedurę odczytująca i zapisującą do swojego programu a potem wpisujesz gdzieś w programie to co widnieje pod "Używanie procedury zapisu/odczytu"

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jarekk

Witam, Potrzebuje napisać

Witam,
Potrzebuje napisać rejestrator, który będzie zapisywał w pamięci zewnętrznej I2C datę oraz godzinę wystąpienia zdarzenia. Zdarzeniem będzie chwilowa zmiana stanu jednego z wejść procesora.
Chciałbym bez większych problemów datę i godzinę zapisywać jako liczbę. Czyli np. 2009-12-30 jako 20091230 i godzinę np. 12:34:56 jako liczbę 123456.
W jaki sposób mogę zapisywać takie duże liczby do zewnętrznej pamięci ?.

Portret użytkownika mirley

Re: EEPROM zapis

Trzeba przeliczyć ta wartość na wartości 8 bitowe które zmieszczą się w komórkach EEPROM. po pierwsze proponuje zapis daty jako 091230 a nie 20091230, będą potrzebne tylko 3 bajty a nie 4. Zapis jako duża liczba w tym przypadku niczego nie oszczędzi a tylko narobi kłopotów, w kolejnych komórkach zapisuj: rok jako wartość od roku 200, czyli aktualnie 2010 to 10, potem miesiac i dzień , podobnie z godzinami, gg, mm, ss. Następne zdarzenie będzie zapisywane na kolejnych bajtach. Czyli co 6 bajtów będzie kolejny wpis w pamięci o kolejnym zdarzeniu.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jarekk

Czy procedura zapisu nie

Czy procedura zapisu nie powinna na końcu zawierać wpisu Waitms 10 (znalazłem to w helpie od Bascoma).
Wykorzystuje w swoim projekcie pamięć 24C512 i bez tego wpisu nie mogę poprawnie zapisywać danych, jeżeli zapisuję ich sporą ilość. Jeżeli zapisuję powiedzmy jeden wpis, czyli 6 komórek pamięci zapis odbywa się poprawnie. Jeżeli chcę zapisać naraz więcej wpisów np. 10 (60 komórek pamięci) tak od połowy zapisu pojawiają się jakieś dziwne wartości. Po dodaniu wpisu Waitms 10 wszystko działa poprawnie.
Jaka jest różnica pomiędzy pamięcią 24C512 a 24LC512. Pamięć 24LC512 bez wpisu Waitms 10 praktycznie nie działa. Od pierwszych komórek zapisu pojawiają się błedy.

Portret użytkownika mirley

Re: Zapis Do eeprom

jasne że nie powinna zawierać żadnego Waitms, polecenia wait są nieudolne i psują działanie całego programu. To co masz tu przestawione to są same procedury zapisu i odczytu, to jak często je wywołujesz zależy od Ciebie. W najprostszym przypadku możesz dać tego swojego waitms 10, ja zawsze używam timerów co daje odpowiednie odstępy czasu.

jeśli zbyt szybko będziesz chciał zapisywać to poprostu pamięć nie zdąży tego zrobić, co do pamięci z literką L to prawdopodobnie wolniejsza odmiana tego układu

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika beleco

witam

mam pytanie, czy zbudowałes juz ten rejestrator. poradziles sobie z tymi pamieciami??

-

Max

Portret użytkownika connan12345

Obsługa pamięci 3wire np.93C66

Witam ! Siedzę od niedawna nad projektem programatora pamięci 24cXX i 93cXX . Ten Twój opis jest rewelacyjny! Teraz mam pytanie : jak obsłużyć pamięć z rodziny 93cXX ? w pdfie do attiny2313 widzimy że nóżki PB7(19) , PB6(18) ,PB5(17) posiadają odpowiednio UCSK , DO , DI - używane w tych pamięciach. Jak będą wyglądały procedury odczytu/zapisu ? Dzięki za odpowiedź. Pozdro
PS.
Odnośnie problemu z układami mającymi "L" - wyczytałem że te układy mają obniżone napięcie zasilania 2,5 - 3,3V , więc możliwe że i prędkości też są mniejsze. Tak jak w przypadku kontrolerów atmega8 i atmega8L (oczywiście częściej spotykane są "eLki" w formie SMD).

Portret użytkownika jarekk

Rejestrator napisałem, w

Rejestrator napisałem, w fazie testów działał poprawnie. Projekt zmienił założenia początkowe, w chwili obecnej nie jest kontynuowany.

Portret użytkownika mirley

Re: Pamięci

93C66 to pamięć działająca odmiennie niż opisywane tutaj 24cxx, musiał byś napisać swoje procedury do obsługi. Do jakich pinów to podłaczysz to nie powinno mieć znaczenia, chyba że znajdziesz gdzieś gotowy kod. Nic takiego nie pisałem więc nie zamieszczę żadnego gotowego kodu.

Ps. Następnym razem pisz w tej sprawie na forum bo nie dotyczy to powyższego opisu. Może któryś z użytkowników będzie miał coś gotowego do tych pamięci

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika bryli

Pytanie

Mam jedno pytanie.
Czy w tym miejscu

Blok = Adres / 256

nie powinno być?
Blok = Adres \ 256

czyli według Help Bascomowego "\" to dzielenie całkowite

przykładowo Adres=432
więc Blok to 432 \ 256=1
i Shift Blok, Left, 1 inczaej pomnożenie przez 2
więc Adr=Adr+Blok=170

Jeżeli źle myśle to proszę mnie poprawić i wytłumaczyć, bo za mocny z Bascoma nie jestem.

Pozdrawiam

Portret użytkownika mirley

Re: Dzielenie

jak dla mnie nie ma żadnego znaczenia "/" czy "\" czy dzielenie całkowite czy nie. Zawsze używam tego zwykłego "/". Wynik i tak jest typu całkowitego to się nie ma szans zapisac do zmiennej 1.4342 itp

Shif left to po prostu mnożenie przez 2

Wynik z obliczania adresu: Adr=Adr+Blok=162 a nie 170

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika bryli

Dzięki za odpowiedź, wkleiłem

Dzięki za odpowiedź, wkleiłem ten kawałek Twojego kodu i trybi, a co do tego:

Quote:
Wynik z obliczania adresu: Adr=Adr+Blok=162 a nie 170

to moje nie dopatrzenie, w kodzie mam ustawiony adres pamięci na 168 dlatego 170

Portret użytkownika Pedzik

Ciągle wywala mi "invalid

Ciągle wywala mi "invalid datatype" i "variable not dimensioned" na linii "I2cwbyte Adr". Zmienne Adres, Blok i Dana zdefiniowałem jako Byte a potem jako Word i nie pomogło... co robić?

Portret użytkownika matrix

Error variable not

Error variable not dimensioned znaczy że nie zdefiniowałeś jakiejś zmiennej. co do pierwszego błędu to jakaś zmienna jest niewłaściwa dla danego typu.

Portret użytkownika Pedzik

Ale przecież nie da się

Ale przecież nie da się zdefiniować Adr i Adr2, jak napisałem wcześniej zdefiniowałem tylko Adres, Dana i Blok. On wywala że właśnie Adr jest nie zdefiniowana... Z góry dzięki za wszelką pomoc

Portret użytkownika mirley

Re: EEPROM

Dodaj pod twoimi zmiennymi linijkę:

Dim Adr As Byte , Adr2 As Byte

Adr i Adr2 to moje zmienne pomocnicze. Adres ma byc Word a dana i blok typu byte.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Pedzik

Teraz czepiło się podanej

Teraz czepiło się podanej przez Pana linijki i pojawił się trzeci błąd "reserved word can not be used", używam bascoma 1.11.9.8, spróbuję potem zamiast Adr, Adr2 podać jakiekolwiek inne nazwy. Bardzo dziękuję pomoc

Portret użytkownika mirley

Re: nazwy

Wypróbuj nazwy np A1 i A2, pisałem to w starszym bascomie więc od tego czasu w nowszej wersji musieli dodać coś nowego co używa nazwy adr

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Krzysztof N.

Pamieć HM6116

Witam

Mam kilka kości pamięci HM6116 Static RAM 2048-word x 8 bit. Czy ktoś mógłby mi podpowiedzieć jak obsłużyć ta pamięć z poziomu AtMega8??? Przegladam Datasheet tej pamięci i widze wykresy READ i WRITE ale nie bardzo moge pojać o co w tym chodzi??? Czy czasy w nich podane są bardzo istotne czy moge np w jednej chwili ustawić wszystkie sygnały wychodzące z mP do pamięci???

Portret użytkownika mirley

Re; Pamięć

Z tego co widzę to pamięć ma dostęp równoległy, podłaczasz do mikrokontrolera wszystkie linie adresowe i danych oraz sygnały OE i WE. W mikrokontrolerze będzie trzeba dynamicznie podczas działąnia zmieniać piny danych raz na wejścia a raz na wyjścia żeby to działało.

Z tego co widzę z wykresów wystarczy ustawić adres do odczytu i podać impuls na OE żeby odczytać dane. Z zapisem podobnie tylko stan WE musi być przeciwny. Popatrz na schemat pamięci w karcie katalogowej

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Maximus22_kr

Witam Jeśli chodzi o odczyt

Witam
Jeśli chodzi o odczyt pamięci 24c32 - 24c512 to działa super.
Niestety trochę się zamotałem, jeśli chodzi o odczyt mniejszych pamięci.

Zmienne

Dim Adr_msb As Byte
Dim Adr_lsb As Byte
Dim Blok As Byte
Dim Adres_n As Word      
Dim Adres_read As Byte
Dim Adres_save As Byte
 
Adres_read = 173                                            'adres odczytu EEPROM I2C
Adres_save = 172                                            'adres zapisu EEPROM I2C

Odczyt

Blok = Adres_n / 256                                        'ustalanie w ktorym bloku ma lezec dana
Shift Blok , Left , 1                                       'oblicznie adresu do zapisu jednej z 8 grup danych
Adres_save = Adres_save + Blok                              ' teraz jest 1010 (blok) 0
Adr_msb = Adres_n Mod 256                                   'oblicznie adresu komorki w ustalonym bloku
 
I2cstart                                                    'warunek startu
I2cwbyte Adres_save                                         'wyślij adres układu
I2cwbyte Adr_msb                                            'wyślij adres w pamięci EEPROM
I2cstart
 
I2cwbyte Adres_read                                         'adresujemy układ EEPROM do odczytu
I2crbyte A , Ack                                            'wyślij daną
I2crbyte B , Ack                                            'wyślij daną
I2crbyte C , Ack                                            'wyślij daną
I2crbyte D , Ack                                            'wyślij daną
I2crbyte E , Ack                                            'wyślij daną
I2crbyte F , Ack                                            'wyślij daną
I2crbyte G , Ack                                            'wyślij daną
I2crbyte H , Nack                                           'wyślij daną
I2cstop                                                     'warunek stopu
 
Waitms 100      

Zapis

Blok = Adres_n / 256                                        'ustalanie w ktorym bloku ma lezec dana
Shift Blok , Left , 1                                       'oblicznie adresu do zapisu jednej z 8 grup danych
Adres_save = Adres_save + Blok                              ' teraz jest 1010 (blok) 0
Adr_msb = Adres_n Mod 256                                   'oblicznie adresu komorki w ustalonym bloku
 
I2cstart                                                    'warunek startu
I2cwbyte Adres_save                                         'wyślij adres układu
I2cwbyte Adr_msb                                            'wyślij adres w pamięci EEPROM
 
I2cwbyte A                                                  'wyślij daną
I2cwbyte B                                                  'wyślij daną
I2cwbyte C                                                  'wyślij daną
I2cwbyte D                                                  'wyślij daną
I2cwbyte E                                                  'wyślij daną
I2cwbyte F                                                  'wyślij daną
I2cwbyte G                                                  'wyślij daną
I2cwbyte H                                                  'wyślij daną
I2cstop                                                     'warunek stopu
 
Waitms 100                           

Chciałem zapisać, a później odczytać numer ID układu(ów) termometru DS18B20

Pozdrawiam
Piotr

Portret użytkownika mirley

Re: Pamięci

Z czym dokładnie jest problem?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Maximus22_kr

Brakiem zapisu

Przy obecnym kodzie zapisuje te osiem zmiennych wywołując przyciskiem procedurę zapisu, następnie wywalam te zmienne z programu, kompiluję, programuję i robię odczyt i mam zamiast wartości zmiennych same 255 ( osiem razy 255 ), dodatkowo podłączony PCF8563 ( adres 162 i 163 ) zgłupiał i ma zmienione ustawienia daty i czasu ( w takiej samej konfiguracji testowałem z pamięcią 24LC32 i nie było problemu. Coś chyba namieszałem w zmiennych. Przytoczę kod Kolegi

Zapis_24c16:
      'ustalanie w którym bloku ma leżeć dana
  Blok = Adres / 256     <span style="font-weight:bold">u  mnie Adres to Adres_n - adres komórki, gdzie chce zapisać dane </span>
     'oblicznie adresu do zapisu jednej z  grup danych
  Adr = 160    <span style="font-weight:bold">u mnie 172, czyli Adres_save</span>                                              
  Shift Blok , Left , 1
  Adr = Adr + Blok                                            
     'oblicznie adresu komórki w ustalonym bloku
  Adr2 = Adres Mod 256           <span style="font-weight:bold">u  mnie Adres to Adres_n - adres zapisu komórki, a Adr2 to Adr_msb - wyliczony </span>
 
  I2cstart                                                    
  I2cwbyte Adr ( u mnie Adres_save = 172 )                                                
  I2cwbyte Adr2 ( u mnie Adr_msb - obliczony )                                               
  I2cwbyte Dana1 A
  I2cwbyte Dana2 B
  I2cwbyte Dana3 C
  I2cwbyte Dana4 D
  I2cstop
Return

Z ciekawości ustawiłem wyświetlanie tych zmiennych na LCD i mam
Blok --- 254
Adres_n -- 8 ( u Kolegi Adr )
Adr_msb --- 0 ( u Kolegi Adr2 )
Wartość zmiennej Blok jest taka sama dla adresu zapisu 8 jak i 0
Może opiszę swoje zmienne:
Blok --- jest obliczany
Adres_save - 172 ( adres zapisu w magistrali I2C )
Adres_msb - wyliczony ze zmiennej Blok i Adres

Przy odczycie mam tylko taką różnice, że Kolega incrementuje zmienną Adr ( u mnie Adres_save ) ja zaś podstawiam ją

Portret użytkownika Maximus22_kr

z jedną zmienną działa, a ja

z jedną zmienną działa, a ja potrzebuję zapisać 8 zmiennych i to jeszcze kilka kompletów tych zmiennych, czyli pozostaje tylko większa pamięć EEPROM ?

Portret użytkownika mirley

Re; Eeprom

Ja mam coś takiego

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
  Adr2 = Adres Mod 256
  I2cstart                                                    
  I2cwbyte Adr                                                 
  I2cwbyte Adr2                                               
  I2cwbyte Dana
  I2cstop
Return

U mnie zmienna blok numeruje strony.... Zmienna Adres jest word i jak nie mam adresu powyżej 255 to zapisuje w bloku 0, jak adres jest 256 to zapisuje defakto adres 0 ale już w bloku 1. To jest dla pamięci 4k, 8k i 16k. ak i 2k nie mają bloków bo starczy adresów w 8 bitach.

co te twoje wartośc na LCD są dziwne. Adr powinien być 160 + 2x blok, a adr2 0-255 ale dla adres= 0, adr2 też ma być 0

Zapisując więcej danych powinno normalnie działać kolejne I2cwbyte Dana1, I2cwbyte Dana2 itd a na końcu i2cstop. Adres który podajesz to adres pierwszej zapisywanej komórki. Nie wiem tylko co się stanie jak wyjdzie to poza stronę (zmienna adr przekroczy bajt)

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Maximus22_kr

OK, działa. Zapisuje

OK, działa. Zapisuje jednocześnie osiem zmiennych. Zrobiłem to tradycyjnie podając tylko adres komórki, bez żadnych obliczeń- czy taki sposób ma swoje minusy ? ( wiem, że adresować potrzeba odpowiednio - 0, 8, 10, 18, 20, 28, 30 itd. )

Teraz chciałbym odczytać zmienne w pętli i zapisać je do tablicy. Deklaruję tablice będącą wielokrotnością 8. Chciałbym, żeby zapisał odczytaną zmienną, każda komórka w kolejnej części tablicy. Jednak coś nie tak robię - nie wiem, czy można mieć pętlę w pętli ( mam kilka kursów w PFD i słabo to jest opisane ), próbowałem też bez pętli przez Incr zmiennej Twi z warunkiem, że jak dojdzie do 16 to ma się zatrzymać. Próbowałem też używać flag, ale wydaje mi się, że jak coś się wykonuje to całą reszta "stoi", więc flagi nie będą wykorzystane.

Dim Twi as Byte
Dim Twi_tab(16) as Byte
 
 
For Adres_m = 0 To 15 Step 1       <span style="font-weight:bold">'Powinno być raczej (chyba ) For Adres_m= 0 To 10 sStep 10</span>
I2cstart                                                    'warunek startu
I2cwbyte Adres_save                                         'wyślij adres układu
I2cwbyte Adres_m                                            'wyślij adres w pamięci EEPROM
I2cstart
 
I2cwbyte Adres_read                                         'adresujemy układ EEPROM do odczytu
I2crbyte A , Nack                                           'wyślij daną
 
If Err = 0 Then
    For Twi = 1 To 8
    Twi_tab(twi) = A
    Next Twi
 
   End If
I2cstop                                                     'warunek stopu
Waitms 100                                                  'czekamy 100mS ponieważ EEPROM potrzebuje czasu na  zapisanie 
Next Adres_m

Portret użytkownika mirley

Re: EEprom

Można bez problemu umieszczać pętle w pętli... nie wiem tylko po co cos takiego:

    For Twi = 1 To 8
      Twi_tab(twi) = A
    Next Twi

Ta pętla wpisze ci do każdej komórki tablicy Twi_tab zmienną A, chyba że o to chodzi.

Zapisywac kolejne komórki do tablicy możesz za pomoca tego adresu co do eeprom wysyłasz... np:

Twi_tab(Adres_m +1) = A

dałem adres +1 bo adresy masz od zera a tablice się od 1 numeruje w bascom. Tabicę tylko musisz rozszeżyć do 16

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Maximus22_kr

Bardzo dziękuję Koledze za

Bardzo dziękuję Koledze za odpowiedź. Oczywiście, że nie chodziło o zapełnianie wszystkich komórek tą samą wartością. Drugą pętlę "wciskałem" gdyż doszukałem się informacji, że ze względu na strukturę pamięci EEPROM są problemy z jej odczytem. Tzn pamięć EEPROM ma tak adresowane komórki - przynajmniej ja to tak rozumiem:
0000 0001 0002 0003 0004 0005 0006 0007
0008 0009 0010 0011 0012 0013 0014 0015
0010 0011 0012 0013 0014 0015 0016 0017
0018 0019 0020 0021 0022 0023 0024 0025
0020 0021 0022 0023 0024 0025 0026 0027
0028 0029 0030 0031 0032 0033 0034 0035

patrząc na to wygląda jakby cześć komórek "przepadła" i jest brak ciągłości. Sugerowane rozwiązanie to pętla

For A = 0 To 100 Step 10

Wtedy traci się trochę komórek, ale nie ma problemu z ciągłością danych. Ale wtedy to proste rozwiązanie, które Kolega podał wyżej spowoduje utworzenie sporej ( przynajmniej jeśli chodzi o numeracje ) tablicę.

Mam pytanie z zakresu I2C ( TWI jak kto woli ). Czy Kolega miał może jakieś doświadczenia z expanderami I2C ? Np. PCF8574 lub MCP23008/MCP23016 ? Tzn. może trochę naiwne pytanie, ale czy nie ma problemu, żeby część wyprowadzeń expandera była wejściami, część wyjściami. Mam kod z jednej ze stron, ale opisuję on tylko zastosowanie expandera w różnych konfiguracjach ( standardowo i z przerwaniem ) jako wejście.

Portret użytkownika mirley

Re: EEPROM

Pierwsze słyszę o czym takim w eeprom. Nigdy nie miałem problemu z ciagłościa danych. Zapisuje zawsze adres i wartość i odczytuje, nie miałem takich problemów.

Tworzenie tablicy trzeba rozważyć w zalezności od zastosowania. Jak potrzebne sa w programie dane na bieżąco to tablica jest potrzeba. Jeśli tylko zapisujesz strumień danych to wystarczy jedna zmienna. Nie rozumiem tez czemu masz problem z zapisem w pętli kolejnych adresów pamięci. trzeba Tu oczywiście uważać na faktyczny adres w ramach konkretnego bloku.

Co ekspenderów to ustawiałem ylko jako wyjścia całość. Z tego co wiem to popularne pcf'y nie mają konfiguracji wejść. Da się czytać i zapisywać podobnie jak w starym 2051

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Qbaa

Zapis / odczyt

Posiadam pamięć 24c1024.
Z zapisem i odczytem pojedynczej danej nie ma problemu.
Pytanie mam jak wygląda procedura zapisu i odczytu danych kilku bajtowych lub tablic w Bascomie.
Proszę o jakieś wskazówki.

Portret użytkownika mirley

Pamięć eeprom

Dane musisz podzielić na bajty i zapisywac po kolei... chyba innego sposobu nie ma. nie musisz oczywiście za każdym razem otwierać transmisji I2c. Poczytaj w karcie o zapisie większych bloków danych

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Michcio

Quote:Posiadam pamięć

Quote:
Posiadam pamięć 24c1024.
Z zapisem i odczytem pojedynczej danej nie ma problemu.
Pytanie mam jak wygląda procedura zapisu i odczytu danych kilku bajtowych lub tablic w Bascomie.
Proszę o jakieś wskazówki.

Najlepiej zrób to w pętli, będzie banalnie proste :) To samo z odczytem

Portret użytkownika rdromulus

Zapis/ odczyt Mam taki

Zapis/ odczyt
Mam taki problem chce zapisywać do pamięci numery kart, jest to tablica z pięcioma wartościami. po zapisaniu pierwszej serii, jak zrobić aby program zapisywał w kolejnych pięciu bitach.

Portret użytkownika mirley

Re: Eeprom

Dodaj poprostu 5 do adresu... a jak masz 3 karty to dla ostatniej dodaj 10... Ogólnie musisz pamiętać ile kart zapisałeś i kolejną zapisywac na adresach począwszy od N*5

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika IMEX2

Zapis do pamieci Godziny Alermu ze Sterownika Domowego

Cześć Mirku

Dawno nic nie pisałem ale teraz mam do rozgryzienia zapis no i oczywiste ze odczyt pamieci na I2C
Znając twój sposób pisania programów ....... Czy jesteś w stanie napisać kawałek kodu do Zapisywania godziny Alarmu ze sterownika domowego. Porównałem te 2 kody dla pamieci i wydaje sie byc prostszy ten dla od 32K ..
Chcę wykonać "Sterownik Centralkę Alarmową" z zapisem o zdarzeniach. Niestety nigdy sie nie bawiłem pamięciami dlatego Bardzo prosze i kawałek gotowego kodu do twojego sterowniaka, a reszty sam dojdę.
W domowym sterowniku są 2 alarmy Cichy i Głośny (w moim przypadku to będą kolejne porty czujek) czyli zapisz o zdarzeniu do pamięci godziny-minuty-sekundy-kanał-rok-miesiac-dzien-jakas_dodatkowa_dana Czyli mamy do zapisania 8 informacji do zapisu. Lub dla domowego godziny-minuty-kanal .
Mam gdzieś napisany programik jak szujać układy wpięte pod I2C i jakie mają adresy.

Ciekawą opcją może być zapisywanie pełnymi dziesiątkami jeśli chodzi o bloki pamięci czyli 10, 20, 30, ..... dla czytelnego odczytu

Domniemam że musi boć jakaś komórka która będzie zapisywać informacje o zapisanym już lub jaki ma być zapisany kolejny blok pamięci - potem np podzielenie tego przez 10 i wyjdzie ile mamy wpisów i aktywacji alarmu.

To na razie tyle
Pozdrawiam
Grzesiek

-

Grzesiek - miasto Ostróda

GG 12372371 dom
tel 502812675 SMS

Portret użytkownika mirley

Re: Eeprom

Zapis można wykonać dokładnie tak jak wyżej bajt po bajcie, procedury masz wyżej gotowe. Można też zapisywac więcej danych na raz:

Zapis_24c256:
  Adr2 = Adres / 256
  Adr3 = Adres Mod 256
 
  I2cstart                                                     
  I2cwbyte 160                                              
  I2cwbyte Adr2                                              
  I2cwbyte Adr3                                               
  I2cwbyte Dana1
  I2cwbyte Dana2
  I2cwbyte Dana3
  I2cwbyte Dana4
  I2cwbyte Dana5
  ...
  I2cwbyte DanaN                                               
  I2cstop
Return

Podobnie odczyt powinien działać tylko przy każdej danej dajesz Ack a przy ostatniej Nack

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matekogon

Zapis grafiki bgf do eepromu

Hejka Mirku mam pytanko odnośnie eepromu. Czy mógłbyś mi doradzić w jaki sposób zapisać obrazki bgf w zewnętrznej pamięci.Chciałbym tym sposobem odciążyć wewnętrzną pamięć AVR. Jak masz jakiś przykład to byłbym wdzięczny bo wogóle nie wiem jak się za to zabrać.

ps. Wiem że porywam się z motyką na księżyc ale coś trzeba w życiu robić.

Portret użytkownika mirley

Re: Wyświetlacz

Nigdy nie używałem obrazków ani nawet graficznego LCD..... jednak wydaje mi się że sprawa powinna być prosta..... w sumie nie musisz używać formatu bgf. Zapisz w pamięci poprostu kolejne wiersze obrazka, gdzie 0 to zgaszony piksel a 1 zapalony i po problemie. Odczytując z eepromu kolejne bajty albo grupy bajtów zapalisz kolejną linię na wyświetlaczu.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Maximus22_kr

Zapis i odczyt ID DS18B20

Chciałem odświeżyć temat.
Mam siedem czujników DS18B20 - koledzy z innego forum doradzili mi, żeby przechowywać numery seryjne w zewnętrznej pamięci EEPROM i wczytywać je dopiero przed wywołaniem czujnika. Zrezygnowałem z odczytu i zapisu w pętli For...Next gdyż "wydaje" mi się że łatwiej będzie bez - podaję tylko początkowy adres zapisu/odczytu.

Do
'*****Zapis
If Akcja = 0 Then
  Adr_m = 10
 Gosub zapis_eeprom
End If
 
'*****Odczyt
If Akcja1 = 0 Then
  Adr_m = 10
 Gosub odczyt_eeprom
End If
 
Loop
End
 
Sub zapis_eeprom:
I2cstart                                                    'warunek startu
I2cwbyte Adres_save                                         'wyślij adres układu
I2cwbyte Adr_m                                              'wyślij adres w pamięci EEPROM
 
I2cwbyte dsin(1)                                                  'wyślij daną
I2cwbyte dsin(2)                                                  'wyślij daną
I2cwbyte dsin(3)                                                  'wyślij daną
I2cwbyte dsin(4)                                                  'wyślij daną
I2cwbyte dsin(5)                                                  'wyślij daną
I2cwbyte dsin(6)                                                  'wyślij daną
I2cwbyte dsin(7)                                                  'wyślij daną
I2cwbyte dsin(8)                                                  'wyślij daną
I2cstop                                                     'warunek stopu
 
Waitms 100  
 
 
End Sub
 
 
Odczyt_eeprom:
 
I2cstart                                                    'warunek startu
I2cwbyte Adres_save                                         'wyślij adres układu
I2cwbyte Adr_m                                              'wyślij adres w pamięci EEPROM
I2cstart
 
I2cwbyte Adres_read                                         'adresujemy układ EEPROM do odczytu
I2crbyte dsid(1) , Ack                                            'wyślij daną
I2crbyte dsid(2) , Ack                                            'wyślij daną
I2crbyte dsid(3) , Ack                                            'wyślij daną
I2crbyte dsid(4) , Ack                                            'wyślij daną
I2crbyte dsid(5) , Ack                                            'wyślij daną
I2crbyte dsid(6) , Ack                                            'wyślij daną
I2crbyte dsid(7) , Ack                                            'wyślij daną
I2crbyte dsid(8) , Nack                                           'wyślij daną
I2cstop                                                          'warunek stopu
 
Waitms 100 
 
End sub

i teraz ( na razie testowałem na trzech ID ) zapisuję/odczytuję:
Adr_m = 10 dla pierwszego DS18B20
Adr_m = 20 dla drugiego DS18B20
Adr_m = 30 dla trzeciego DS18B20

Jeśli zapiszę tylko jeden ID to odczyt OK. Jeśli trzy ID to odczytując po kolei wygląda, jakby się wymieszały ich zawartości, czasem początek jest na końcu. Czasami np. dwa ostatnie elementy tabeli to 255.

Portret użytkownika mirley

Re: Zapis EEPROM

Spróbuj na początek zapisywać tylko jeden bajt i do każdego bajtu podawaj adres. Jeśli to się uda to możesz kombinować z odczytem blokowym

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Drozda76

AT24C32

Dobry Wieczór

Wzorując się na Twoim przykładzie mam problem z odczytem 24C32.

Ad2 = Adres / 256
Ad3 = Adres Mod 256

I2cstart
I2cwbyte Adressw
I2cwbyte Ad2
I2cwbyte Ad3
I2cstart
I2cwbyte Adressr
I2crbyte Dana , Nack
I2cstop

Pamięć zwraca mi dane co druga komórkę. adres jest zwiekszany o 1.
zmienne pomocnicze
ad2 i ad3 są byte
adres jest word

Czy ktoś mógłby mi podpowiedziec gdzie jest błąd ?

mniejsze pamięci odczytuje jak złoto.

Portret użytkownika slavcio2012

Zmienna LONG

A jak zapisywać i odczytywać w tych kostkach zmienną LONG bo mam z tym problem

Portret użytkownika mirley

Re: EEPROM

Powinno działac tak:

Ad2 = Adres / 256
Ad3 = Adres Mod 256
 
I2cstart
I2cwbyte Adressw
I2cwbyte Ad2
I2cwbyte Ad3
I2cstart
I2cwbyte Adressr
Dana = Dana_L
I2crbyte Dana , Ack
Dana_L =Dana_L/256
Dana = Dana_L
I2crbyte Dana , Ack
Dana_L =Dana_L/256
Dana = Dana_L
I2crbyte Dana , Ack
Dana_L =Dana_L/256
Dana = Dana_L
I2crbyte Dana , Nack
I2cstop

Wysyłanie od najmłodszego bajtu do najstarszego zmiennej long Dana_L, zmienna Dana to pomocniczy Byte

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Yahoo

Kasowanie danych z 24C1024

Witam
Mam pytanie...jak w najszybszy sposób zapisać całą pamięć zerami bądź jedynkami? Innymi słowy chcę usunąć z niej dane.

Dotychczas zapisuje w pętli dana 4 bajtową (typu single o wartośći równej 0), zatem do zapisania sa dwa bloki po 65536 adresów każdy. Opóżnienie czasowe przy zapisie dałem 20 ms.
Może jest jednak jakiś inny sposób który pozwoli zrobić to szybciej.

Portret użytkownika mirley

Re: Zapis EEPROM

nie znam innego sposobu

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika BIGjack

Czy możesz wkleić kod zapisu

Czy możesz wkleić kod zapisu całej pamięci 24c256 ff-ami

Portret użytkownika kris

Dana long jest duża i jak

Dana long jest duża i jak podzielimy przez 256 nadal nie jest zapisywalna w rozmiarze byte więc przeba jej wcisnąć tylko ostatnie 8 bitów z dzielenia.
Potem następne 8 i następne a ostatnie nie trzeba.
więcjeszcze do 3 pierwszych bierzemy reszty modulo 256
Ad2 = Adres / 256
Ad3 = Adres Mod 256

I2cstart
I2cwbyte Adressw
I2cwbyte Ad2
I2cwbyte Ad3
I2cstart
I2cwbyte Adressr
Dana = Dana_L mod 256
I2crbyte Dana , Ack
Dana_L =Dana_L/256
Dana = Dana_L mod 256
I2crbyte Dana , Ack
Dana_L =Dana_L/256
Dana = Dana_L mod 256
I2crbyte Dana , Ack
Dana_L =Dana_L/256
Dana = Dana_L
I2crbyte Dana , Nack
I2cstop