I2C Eeprom címzés

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Szabadij
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2011. július 24. vasárnap, 6:00

I2C Eeprom címzés

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

Üdvözlök mindenkit a fórumon!

Újonc vagyok itt a fórumon,kb fél éve kezdtem foglalkozni az avr ek lelkivilágával.Egyenlőre az alapalkalmazásokat próbálgatom végig.
Megvolt a ledvillogtatás;lcd kezelés;pwm;gombok lekezelése stb.
Most jutottam el az IIC részhez és mindjárt akadályba ütköztem.
Akadt kéznél egy X24C16 os eeprom,a problémám ezzel kapcsolatos .
Írtam egy progit ami elvileg teleírná az eepromot 0-255 ig értékekkel,majd túlcsordulva ismét 0-255 ig amig a teljes terület meg nem tellik.
Amikor ez megvan akkor ponyproggal kiolvasom,ott jól látszik vizuálisan ,hogy mi lett az írás eredménye.
Sajnos megnézve azt látom ,hogy csak 256 bit et ír meg ez eddig jó is a megfelelő értékek íródnak bele,de akárhogy is gyúrom a progimat a többi területre nem tudok írni,magyarán nem tudom megcímezni azt.
Biztos,hogy valami alap dolgon hasalok el,de utánaolvasgatva sem találtam rá megoldást,ezért fordulok hozzátok.
Előre is köszönöm az ötleteket.





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

$regfile = "M8def.dat"
$crystal = 4000000
$baud = 9600
$swstack = 128
$hwstack = 128
$framesize = 128

Config I2cdelay = 20
Config Sda = Portc.4
Config Scl = Portc.5
Config Pind.6 = Output

Dim X As Byte
Dim Cim As Integer
Dim Adatbe As Byte

I2cinit

Const Icwrite = &HA0
Const Icread = &HA1
X = 0
   For Cim = 0 To 2048
   Adatbe = X


  Set Portd.6

  I2cstart
  I2cwbyte Icwrite
  I2cwbyte Cim
  I2cwbyte Adatbe
  I2cstop
  Waitms 20

  Print "cim      " ; Cim
  Print "adatbe   " ; Adatbe

   X = X + 1

  Next Cim
  Reset Portd.6

End
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

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

Szia!

A 24c16 EEPROM-ok 11 bites címet használnak, és fizikailag 8 db 256 méretű blokkból épülnek fel.
A 11 bites címből az alsó 8 bitet úgy kell megadni, ahogy a programodban írtad. A megasabb helyiértékű biteket, a blokkválasztó biteket az eszköz címével "összevonva" kell megadni.

Kép

Az ábra szerint az Icwrite címtartománya &HA0-&HAE, míg az Icread tartománya &HA1-&HAF

Más szóval: az 1010 eszközcímet a kiválasztott 0 és 7 közötti blokkcím követi, majd a bájt záró 0/1 írás/olvasás esetén. [/b]
Avatar
Szabadij
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2011. július 24. vasárnap, 6:00

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

Üdv szegoj!
Köszönöm a gyors segítséget!
Valószínűleg a laikusságom miatt félig értem,félig meg nem amit írtál.
A progimban a "blokkválasztó" biteket variálva mostmár meg tudom címezni az egész eepromot.Ennek mérhetetlenül örülök is.:D

De pont ebből fakadóan ez bennnem újabb kérdéseket vet fel:
Mi van akkor ha több ilyen eepromot lógatok a buszra?

Ezesetben a "blokkválasztó" bitek miatt nem az az eszköz fog megszóllítódni amelynek az állítható címkiválasztó bitjei megegyeznek a blokkválasztó bitekkel?

Pl.:3 eepromnál mondjuk a fizikai címzések:
Első: 10100000
Második: 10100010
Harmadik: 10100100

Pl. az első eepromba akarok írni a:10100010 így kiválasztott blokkterületbe akkor nem a második eeprom fog megszóllítódni írásra.

Mert eddig úgy tudtam és olvastam,hogy a címbitben az első 7 bit a fizikai cím,úgymint 4 fix gyári címbit,és 3 variálható címbit(amit úgy állítok be,hogy az eszköz ehhez a 3 címbithez tartozó címlábát 5 voltra,vagy GND-re kötöm),a 8. bit az írás-olvasás bit.
De amit írtál az is kitűnően működik,ez nem fér a fejembe.

Lehet,hogy keverem a szezont a fazonnal,de nézzétek el nekem,mert eddig nem kellett az eepromok lelkivilágával soha foglalkoznom.

Remélem érthetően le tudtam írni a problémát várom az okítást,addig is köszönöm a türelmet és a jószándékot!
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

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

Szabadij írta:Üdv szegoj!
Köszönöm a gyors segítséget!
Valószínűleg a laikusságom miatt félig értem,félig meg nem amit írtál.
A progimban a "blokkválasztó" biteket variálva mostmár meg tudom címezni az egész eepromot.Ennek mérhetetlenül örülök is.:D

De pont ebből fakadóan ez bennnem újabb kérdéseket vet fel:
Mi van akkor ha több ilyen eepromot lógatok a buszra?

Ezesetben a "blokkválasztó" bitek miatt nem az az eszköz fog megszóllítódni amelynek az állítható címkiválasztó bitjei megegyeznek a blokkválasztó bitekkel?

Pl.:3 eepromnál mondjuk a fizikai címzések:
Első: 10100000
Második: 10100010
Harmadik: 10100100

Pl. az első eepromba akarok írni a:10100010 így kiválasztott blokkterületbe akkor nem a második eeprom fog megszóllítódni írásra.

Mert eddig úgy tudtam és olvastam,hogy a címbitben az első 7 bit a fizikai cím,úgymint 4 fix gyári címbit,és 3 variálható címbit(amit úgy állítok be,hogy az eszköz ehhez a 3 címbithez tartozó címlábát 5 voltra,vagy GND-re kötöm),a 8. bit az írás-olvasás bit.
De amit írtál az is kitűnően működik,ez nem fér a fejembe.

Lehet,hogy keverem a szezont a fazonnal,de nézzétek el nekem,mert eddig nem kellett az eepromok lelkivilágával soha foglalkoznom.

Remélem érthetően le tudtam írni a problémát várom az okítást,addig is köszönöm a türelmet és a jószándékot!
Hello Szabadij!

Saját magaddal keveredtél ellentmondásba: ha 24c16 EEPROM számára küldött cím 5-7 bitje blokkválasztó bit (írod, hogy ez már működik), hogy tudnál akkor ezekkel a bitekkel EEPROM-ot választani. Formálisan vannak A0, A1, A2 kivezetései az EEPROM-nak, de azok elektromosan nem csatlakoznak sehova sem.

Másrészt pedig nem mondasz butaságot. :lol:
Megint más IC-knél az említett címkivezetések chipválasztásra használhatók, ahol persze ezek a kivezetések belül is be vannak kötve (!) például olyan EEPROM esetén, melynek a 24C16-nál nagyobb a memória mérete, ilyen a 24c256

Kép

Ne zavarjon, hogy a rajzon két A0, A1 és A2 van: az EEPROM 15 biten címezhető (A0-A14 jelekkel( és rendelkezik három chipválasztó kivezetéssel is, megtévesztésűl ezeket is A0-A2-vel jelölik. Így ebből a típusból 8 köthető "párhuzamosan".

Ilyen továbbá pl. a PCF8574 I/O kontroller is.[/b]
Avatar
Szabadij
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2011. július 24. vasárnap, 6:00

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

Üdv szegoj !

Köszönöm ,hogy eloszlattad a lila ködöt a szemem elől!
Mielőtt segítségért fordultam hozzátok átnéztem minden erre vonatkozó okosságot amit csak felleltem(IIc specifikáció,tavir alapok stb.).
Már legalább 3 szor átolvastam a 24c16 adatlapját is mégis elsiklottam felette,hogy az ic címlábai nem használatosak,pedig világosan bele van írva...
Ezekkel az infókkal amit adtál elleszek egy darabig.
Egy lépéssel előrébb vagyok megint a tanulásban,sokat segítettél!

Mégegyszer köszönöm,további szép napot/estét!
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

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

Hello Szabadij!

Csak nyugodtan zavarj bármikor, szívesen segítek, ha tudok.
Avatar
Szabadij
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2011. július 24. vasárnap, 6:00

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

Üdv!
Már megint itt vagyok úgy látszik ez az IIc eeprom nekem elég nagy falat.
Mostmár meg tudom írni az egész eepromot,viszont most olvasni szeretnék belőle.
A 8 adatblokkból a 4 elsőt feltöltöttem adatokkal.Ezekből szeretnék most visszaolvasni,de valamiért nem megy.
A progi lefut,de mindig 255 értéket ad vissza,pedig pl az első blokkban 0-255 ig növekvő értékeket tároltam le.
Tehát pl. 1-es blokk 15 ös címen 15 öt kéne visszaadnia a proginak.
Megint fél nap próbálkozás után elfogytak az ötleteim.Ha nektek vannak akkor ne kíméljetek.
Előre is köszönöm!

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

$regfile = "M8def.dat"
$crystal = 4000000
$baud = 9600
$swstack = 128
$hwstack = 128
$framesize = 128

Config I2cdelay = 20
Config Sda = Portc.4
Config Scl = Portc.5
Config Pind.6 = Output

Dim X As Byte
Dim Cim0 As Byte
Dim Cim1 As Byte
Dim Adatbe As Byte
Dim A As Byte
Dim B As Byte
I2cinit

  Do
  Set Portd.6
  Print "ird a blokkot 1-4 ig"
  Input , Cim1
  Print "ird a cimet 0-255 ig"
  Input , Cim0

   Select Case Cim1
    Case 1 : A = &B10100000
    Case 1 : B = &B10100001
    Case 2 : A = &B10100010
    Case 2 : B = &B10100011
    Case 3 : A = &B10100100
    Case 3 : B = &B10100101
    Case 4 : A = &B10100110
    Case 4 : B = &B10100111
    Case Else Print "   Na nemar 1-4 ig irj be erteket"
  End Select


  I2cstart
  I2cwbyte A
  I2cwbyte Cim0
  I2cstart
  I2cwbyte B
  I2crbyte Adatbe , Nack
  I2cstop

  Print "    cim      " ; Cim0 ; "    adatblokk    " ; Cim1 ; "   adat   " ; Adatbe
  Reset Portd.6
  Waitms 100
  Loop

  End
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Az írást, olvasás címe eltérő!
az utolsó bit mondja meg, hogy mit akarsz csinálni, nem csak az I2CWbyte/i2crbyte :)
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 Bascomban nem lehet Select Case-ben többször egymásután ugyanarra az értékre vizsgálni!
Mert az első találat esetén végrehajtódik az utasítás, és kiugrik a vizsgálatból.
End Select utánra>
Nálad a „B” sosem kap értéket!

A helyes így lenne:

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

Select Case Cim1 
     Case 1 : A = &B10100000 
     	B = &B10100001 
     Case 2 : A = &B10100010 
     	B = &B10100011 
     Case 3 : A = &B10100100 
     	B = &B10100101 
     Case 4 : A = &B10100110 
     	B = &B10100111 
     Case Else Print "   Na nemar 1-4 ig irj be erteket" 
   End Select
8)
Avatar
Szabadij
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2011. július 24. vasárnap, 6:00

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

Üdv kapu48 !

Nálad a pont!
Valóban a case rész átírása az általad leírt módon meghozta a sikert.

Úgy emléxem,hogy elsőre én is valahogy így írtam,de lehetett más hiba is mert a bascom be sem fordította,ezért írrtam át így.
Most viszont ezzel a kis változtatással reklamálás nélkül befordult,és működik is rendesen ahogy kell nekije. :D
Egyébként mindenre gondoltam volna csak erre nem.Pedig valahol írva is vagyon,hogy az első igaz feltétel után kilép a select-ből.Vagy figyelmetlen vagyok,vagy túl sok még a sötét folt .
Ebből is látszik,hogy bőven van mit tanulnom.

Robert !
Azt tudom ,hogy az írás-olvasás címe eltérő elsőre ez sem volt nekem egyértelmű,de ezen már túl vagyok.

Mindkettőtöknek köszönöm,hogy szakítottatok időt és energiát a problémámra,ez megint sokat segített!
Azért ha elakadok akkor jövök még zavarkodni. :wink:
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

Re: I2C Eeprom címzés

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

Sziasztok!

Az alábbi kódot futtatom mega324PA-n:

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

$regfile = "M324pdef.dat"
$crystal = 7372800

$baud = 115200
$baud1 = 4800
$hwstack = 170
$swstack = 170
$framesize = 50

'configure the used port pin for I2C
Config I2cdelay = 10                                        ' default slow mode:5
Config Sda = Portc.6
Config Scl = Portc.7

'Write address of the 24LC64
Const E_ctlw = &HA0
'Read address of the 24LC64
Const E_ctlr = &HA1

'Address high
Dim E_ah As Byte
'Address low
Dim E_al As Byte
'High and low
Dim E_addr As Word
'Data to be written
Dim E_dat As Byte
Dim Dat As Byte




Declare Sub E_write(byval E_addr As Word , Dat As Byte)
Declare Sub E_read(byval E_addr As Word , E_dat As Byte)
'--- Foprogram ---

'Test read and writes
Print "Testing I2C Eeprom"


E_addr = &H0000
Dat = 120
Call E_write(e_addr , Dat)
Print "write: " ; Dat

Incr E_addr
Dat = 31
Call E_write(e_addr , Dat)
Print "write: " ; Dat

Incr E_addr
Dat = 43
Call E_write(e_addr , Dat)
Print "write: " ; Dat

E_addr = &H0000
Call E_read(e_addr , E_dat)
Print "read: " ; E_dat

Incr E_addr
Call E_read(e_addr , E_dat)
Print "read: " ; E_dat

Incr E_addr
Call E_read(e_addr , E_dat)
Print "read: " ; E_dat

Print "end"

Do
   Waitms 100
Loop

' Routine to write
'
Sub E_write(byval E_addr As Word , Dat As Byte)
E_ah = High(e_addr)
E_al = Low(e_addr)
I2cstart
I2cwbyte E_ctlw
I2cwbyte E_ah
I2cwbyte E_al
I2cwbyte Dat
I2cstop
Waitms 10
End Sub



' Routine to read
'
Sub E_read(byval E_addr As Word , E_dat As Byte)
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
De nem működik...
I2C detect ezt adja:

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

Start...
I2c-locator 1=no_device 0=device

     0    2    4    6    8    A    C    E
 00  1    1    1    1    1    1    1    1   
 10  1    1    1    1    1    1    1    1   
 20  1    1    1    1    1    1    1    1   
 30  1    1    1    1    1    1    1    1   
 40  1    1    1    1    1    1    1    1   
 50  1    1    1    1    1    1    1    1   
 60  1    1    1    1    1    1    1    1   
 70  1    1    1    1    1    1    1    1   
 80  1    1    1    1    1    1    1    1   
 90  1    1    1    1    1    1    1    1   
 A0  1    1    1    1    0    1    1    1   
 B0  1    1    1    1    1    1    1    1   
 C0  1    1    1    1    1    1    1    1   
 D0  1    1    1    1    1    1    1    1   
 E0  1    1    1    1    1    1    1    1   
 F0  1    1    1    1    1    1    1    1   
a program pedig ezt:

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

Testing I2C Eeprom
write: 120
write: 31
write: 43
read: 255
read: 255
read: 255
end
Évek alatt már többször megpróbáltam ezt az i2c eepromokat, de még sosem jöttem rá miért nem jó!!!
Segítsetek megkeresni a hibát.
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

Re: I2C Eeprom címzés

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

Ok, megvan a hiba. Rossz volt a címzés!!!
ez kiadta a jó címet:

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

 Print "Scan start"
For I = 1 To 254 Step 2
  I2cstart
  I2cwbyte I
  If Err = 0 Then
     Print "Slave at : " ; I
  End If
  I2cstop
Next
Print "End Scan"
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: I2C Eeprom címzés

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

Az I2C locator is ezt teszi....
nem a Hex <=> Dec átváltáson csúszott el?
Válasz küldése