I2C EEPROM kezelése

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

A memóriakiosztás címei a fordítás után a Report alatt megtalálhatóak...
De jó!
Már megint megtudtam fontos dolgokat!
:D
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

Hozzászólás Szerző: Sanci »

Köszönöm a segítséget!

Remélem így már boldogulok vele.

Az Eprom programozasat mar PC-ről tolom neki soros porton, VB -ben írt progival... az rész is még készülőben van.
Így a maceras rész megoldottnak látszik. :)
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

Hozzászólás Szerző: norbi »

Szép éjjelt mindenkinek!

Robinak köszönhetően sikerűlt összerakni egy kis tesztprogramot a 24LC512 I2C eeprom lapíráshoz (egy lap=128byte), csak annyi baj van vele, hogy az első 5byte helyére valamiért 0xFF-ek kerülnek, ez látszik visszaolvásnál is.
Beírás előtt először egy tömböt töltök fel 1-128ig majd ennek a tartalmát átírom az eepromba, a tömben jól van minden, amikor a beírásra kerül a sor ott is a megfelelő adat van a tömb minden elemében, de valamiért hibásan íródik be az eepromba.

Ime a tesztprogram:

Kód: Egész kijelölése

$regfile = "m128def.dat"
$crystal = 14745600
'$crystal = 8000000

'$baud = 38400
'$baud1 = 2400

$hwstack = 128
$swstack = 128
$framesize = 128

$lib "glcdeadogm128x6.lbx"

Config Portg.4 = Output
Led Alias Portg.4                                           'Active high

'LCD háttédfény
Config Porte.5 = Output                                     'R OC3A
Blue Alias Porte.5
Config Porte.4 = Output                                     'G OC3B
Green Alias Porte.4
Config Porte.3 = Output                                     'B OC3C
Red Alias Porte.3

Config Portf.6 = Output
Portf.6 = 0
Chipselect Alias Portf.6

Config Portf.5 = Output
Portf.5 = 1
Chipreset Alias Portf.5

Chipselect = 1
Waitms 10
Chipselect = 0


Chipreset = 0
Waitms 50
Chipreset = 1
Waitms 50


Config Graphlcd = 128 * 64eadogm , Cs1 = Portb.5 , A0 = Portb.4 , Si = Portb.2 , Sclk = Portb.1 , Rst = Portb.3

'I2C busz konfig
Config Scl = Portd.0
Config Sda = Portd.1
I2cinit

'Háttér bekapcsolása
Red = 1
Waitms 100
Green = 1
Waitms 100
Blue = 0

'24LC512 I2C EEPROM
Dim E_ah As Byte
Dim E_al As Byte
Dim E_dat As Byte                                           'Epromból kiolvasott teszt adat
Dim Dat As Byte                                             'Epromba beírt teszt adat
Dim E_addr As Word                                          'Olvasási cím
Dim E_addw As Word                                          'Írási cím
Dim Page_size As Byte                                       'Oldal néret megadása
Dim Sw_dat(128) As Byte
Dim Sw_dat_read(128) As Byte

Dim Ciklus As Word
Dim Ciklus_tomb As Word
Dim Kezdocim_plussz_oldalmeret As Word

'24LC512 EEPROM
Declare Sub E_page_write(byval E_addr As Word , Page_size As Byte)
Declare Sub E_read(byval E_addr As Word , E_dat As Byte)

'24LC512 EEPROM
Const E_ctlw = &B10100110                                   'Írás
Const E_ctlr = &B10100111                                   'Olvasás

Initlcd
Cls
Setfont Font8x8sajat

Page_size = 128
E_addw = &H0000
E_addr = E_addw                                             'Onnan kezdünk olvasni, ahova írtuk az első byte-ot!

'sw_dat buffer feltöltése az oldalméret nagységáig
For Ciklus = 1 To 128
   Sw_dat(ciklus) = Ciklus - 1                              'Igy 0-127-ig lesz benne az adat érték
Next Ciklus

Lcdat 1 , 1 , Hex(sw_dat(1)) ; Hex(sw_dat(2)) ; Hex(sw_dat(3)) ; Hex(sw_dat(4)) ; Hex(sw_dat(5)) ; Hex(sw_dat(6)) ; Hex(sw_dat(7)) ; Hex(sw_dat(8)) ; Hex(sw_dat(9))
Lcdat 2 , 1 , Hex(sw_dat(120)) ; Hex(sw_dat(121)) ; Hex(sw_dat(122)) ; Hex(sw_dat(123)) ; Hex(sw_dat(124)) ; Hex(sw_dat(125)) ; Hex(sw_dat(126)) ; Hex(sw_dat(127)) ; Hex(sw_dat(128))

Call E_page_write(e_addw , Page_size)                       'Beleírjuk a megtelt oldalt az ext.eepromba

Kezdocim_plussz_oldalmeret = E_addr + Page_size
Kezdocim_plussz_oldalmeret = Kezdocim_plussz_oldalmeret - 1
For Ciklus = E_addr To Kezdocim_plussz_oldalmeret           'Itt a Ciklus érték a kiolvasási címet határozza meg!
   Call E_read(ciklus , E_dat)
   Ciklus_tomb = Ciklus + 1                                 'Mert a tömb index nem kezdődhet 0-tól (ami az irási kezdő cím amugy)
   Sw_dat_read(ciklus_tomb) = E_dat
Next Ciklus

Lcdat 3 , 1 , Hex(sw_dat_read(1)) ; Hex(sw_dat_read(2)) ; Hex(sw_dat_read(3)) ; Hex(sw_dat_read(4)) ; Hex(sw_dat_read(5)) ; Hex(sw_dat_read(6)) ; Hex(sw_dat_read(7)) ; Hex(sw_dat_read(8)) ; Hex(sw_dat_read(9))
Lcdat 4 , 1 , Hex(sw_dat_read(120)) ; Hex(sw_dat_read(121)) ; Hex(sw_dat_read(122)) ; Hex(sw_dat_read(123)) ; Hex(sw_dat_read(124)) ; Hex(sw_dat_read(125)) ; Hex(sw_dat_read(126)) ; Hex(sw_dat_read(127)) ; Hex(sw_dat_read(128))

Do
   nop
Loop

End

'///////////////////////////////////////////////////////////////////////////////

Sub E_page_write(byval E_addw As Word , Page_size As Byte)
Local Page_byte As Byte
Local Page_wirite_set As Byte
Page_wirite_set = 1

   For Page_byte = 1 To Page_size
      If Page_wirite_set = 1 Then                           ' ha 1, akkor az első beírás jön, ahol meg kell adni a kezdő cimet
         I2cinit
         E_ah = High(e_addw)
         E_al = Low(e_addw)
         I2cstart
         I2cwbyte E_ctlw
         I2cwbyte E_ah
         I2cwbyte E_al
         Page_wirite_set = 0
      End If

      I2cwbyte Sw_dat(page_byte)                            'Beírodik a ciklusszámlálónak megfelelő byte
      If Page_byte = Page_size Then Page_wirite_set = 255   'Ha elértük az utolsó byte-ot a page-ben akkor jöhet a STOP

      If Page_wirite_set = 255 Then
         I2cstop
         E_addw = E_addw + Page_size              'Ha túlléptük az oldalméretet növeljök a címet a teleírt oldal méretével és kilépünk
         Page_wirite_set = 1                                'Alapbeállításra vissza, mert teleírodott az oldal!
      End If

   Next Page_byte

End Sub

'///////////////////////////////////////////////////////////////////////////////

Sub E_read(byval E_addr As Word , E_dat As Byte)
   I2cinit
   E_ah = High(e_addr)
   E_al = Low(e_addr)
   I2cstart
   I2cwbyte E_ctlw
   I2cwbyte E_ah
   I2cwbyte E_al
   I2cstart
   I2cwbyte E_ctlr
   I2crbyte E_dat , Nack
   I2cstop                                                  '
End Sub

'///////////////////////////////////////////////////////////////////////////////

$include "font\font8x8sajat.font"
Mitől lehet ez?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Első hiba a Chipreset után a chipet kiválasztva hagyod!
Lehet azért szedi össze a szemetet az elején?

Kód: Egész kijelölése

Chipselect = 1 
Waitms 10 
Chipselect = 0 

Chipreset = 0 
Waitms 50 
Chipreset = 1 
Waitms 50
’Ide még kellene : 
Chipselect = 1 
A többi részt még tanulmányozom.
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

Hozzászólás Szerző: norbi »

Bocs, lehet, hogy nem írtam oda egyértelműen, de az az LCD CS-e :)
Sajnos az 1.1verziós panelon az LCD CS és RST lábak a mega128 portf-jére kerültek, s azt nem tudja lekezelni, így maradt az, hogy én kezelem!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Mi lenne, ha kivennéd az írás ciklusból a sok szemetet?:

Kód: Egész kijelölése

I2cinit
E_ah = High(e_addw)
E_al = Low(e_addw)
I2cstart
I2cwbyte E_ctlw
I2cwbyte E_ah
I2cwbyte E_al

   For Page_byte = 1 To Page_size

      I2cwbyte Sw_dat(page_byte)                            'Beírodik a ciklusszámlálónak megfelelő byte

   Next Page_byte

I2cstop
E_addw = E_addw + Page_size                                 'Ha túlléptük az oldalméretet növeljök a címet a teleírt oldal méretével és kilépünk
:?:
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

Hozzászólás Szerző: norbi »

Ha olyan az alkalmazás, hogy valamiért nincs mód eltárolni előre a beírandó oldalt, vagyis ahogy jönnek a byte-ok, mindig meg kell hívni a rutint, akkor mindenképp kel a "sok szemét", hogy ne írodjon be mindig a kezdő cím és az i2cstop!

Ez nem jelent gondot, persze azért kipróbáltam enélkül, ahogy javasoltad, de ugyanaz a hiba :cry:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

I2cinit
E_ah = High(e_addw)
E_al = Low(e_addw)
I2cstart
Itt a cím H (felső byte) és L (alsó byte) miért mindég egyforma?
Így a második lap címe = H8080.
Szerintem a helyes érték = H0080 lenne!
A 3. lap címe = H0100
De ha egyforma akkor ügye csak H0101 lehet?
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

Hozzászólás Szerző: norbi »

itt:

E_ah = High(e_addw)
E_al = Low(e_addw)

az E_ah-ba kerül az E_addw word tip.változó felső 8byte-ja, az E_al-be az alsó 8byte-ja, vagyis nem ugyanaz kerül bele!

Ha:

E_addw=&H0000 akkor E_ah=&H00 és E_al=&H00 1.lap
E_addw=&H0080 akkor E_ah=&H00 és E_al=&H80 2.lap
E_addw=&H0100 akkor E_ah=&H01 és E_al=&H00 3.lap

stb.

Vagy nem erre céloztál?

U.i: Meg van a hiba, kimaradt egy waitms 5 az i2cstop után 8)

Igy már minden ok!
Nagyon köszönöm, hogy próbáltál segíteni!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Kösz!
A téma átgondolása közben én is tanultam!
:)
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

Hozzászólás Szerző: norbi »

Szép éjjelt!

Majdnem elkerűlte valami a figyelmem az eeprom kezelésnél...mégpedig az, hogy a mostani rutinnal max 0xFFFF-ig cimezhetek, mert a cim wordben van tárolva és ezt szedem szét MSB-re és LSB-re, de mi van akkor, ha nekem 0x1FFFF-ig kell cimezni?
Igy már LONG-ot kell használjak, de ezt hogyan szedejm szét "elegánsan" byte-okra?
Overlay LONG-ként és ugy hivatkozzak a byte-okra?
Ezt valósítom most meg, de ha valaki tud egyszerűbbet, szebbet, szóljon bátran! 8)

KJöszönöm!

u.i.: azt hiszem, ennél egyszerűbb nem is lehet :P
Dim E_add_pw As Long 'SW mérete byte-okban
Dim E_add_pw_h As Word At E_add_pw Overlay
Dim E_add_pw_l As Word At E_add_pw + 2 Overlay

I2cinit
I2cstart
I2cwbyte E_ctlw
I2cwbyte E_add_pw_h
I2cwbyte E_add_pw_l
I2stop

Remélem másnak is hasznára válik! :wink:
A hozzászólást 1 alkalommal szerkesztették, utoljára norbi 2009. október 21. szerda, 2:45-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Long->
loww/highw (2 db Wordre szeded)

loww/highw->
low/high (2*2 dby byte-ra)


De az overlay sztem egyszerűbb és programhelyet sem visz....
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

Hozzászólás Szerző: norbi »

Kicsit javítottam az előző hsz-omon, mert rájöttem, hogy a cim beírást nem lehet 4lépésben (4byte=long) végezni, hanem 2x kell wordöt írni.

De ugyanígy kell olvasni is? Vagy ez a 2x word írás sem helyes?

Az adatlapban MSB és LSB byte-ot ír írásnál és olvasásnál is, de ha én így címzem, akkor csak 0xFFFF-ig használom ki a chipet, ugyebár ez volt a gond...az adatlap hol tesz utalást arra, hogy miként cimezhető 0x1FFFF-ig, mert én nem találom...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Szerintem adatlap:
Description:
The Microchip Technology Inc. 24AA512/24LC512/
24FC512 (24XX512*) is a 64K x 8 (512 Kbit) Serial
Electrically Erasable PROM, capable of operation
across a broad voltage range (1.8V to 5.5V).
:!:
64K*8bytes = HFFFF és nincsen tovább címzés!
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

Hozzászólás Szerző: norbi »

De mivel byte-okat írunk és olvasunk, akkor kell tudjuk is címezni 0x1FFFF-ig, másképp hogyan írhato az 0xFFFF feletti rész?

Csak az a furcsa, hogy aza atlapban a byte write résznél az I2C adatok ugy mutatja, hogy csak MSB és LSB megy...vagyis 2byte a címzés, de az úgy csak az említett 0xFFFF.
Válasz küldése