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 »

Közben rájöttem, hogy a tömbindexelés nem 0-kezdődik, hanem 1-től!
Tehát pl ahol:
For I = 0 To Counts
I2crbyte Value_r(i) , Ack
Érték adás van az nem jó!
Majd javítom. De már fáradt vagyok!
Különben Wimdows sincs hiba nélkül, majd jön az SPn!
:twisted:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

EEPROM esetén az írás 1 blokkba, vagy byte szinten 10 msec időt vesz igénybe. A törlés is!

Az olvasásnak nincs időigénye, az simán az I2C-n azonnal jön.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

A DIM a Bascomban _mindig_ 1-től számozódik!
Ez valahol le is van írva...

http://avr.tavir.hu/modules.php?name=Co ... age&pid=14 Tömb fejezet, lapközepe.
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

Szervusztok!

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

Egy kis segítségre lenne szükségem az alábbi kódban, ami amúgy tökéletesen működik, de van tisztázatlan kérdésem
Amit nem értek hogy az adat irasa a az also nyolc byte-n 1 -el kisebb mint olvasasnal. Persze lehet hogy ennek így is kell lennie? :oops:



'Mega128 _ 24C32 EEprom kezelese
Config Scl = Portd.0 'assign the SCl line to PORTD.0
Config Sda = Portd.1 'assign the SDA line to PORTD.1

Dim Adatbe As Byte
Dim Adatki As Byte

Do
'Adat irasa
Input "ertek adas 0 - 255 :" , Adatbe
I2cstart 'generate start
I2cwbyte &B1010_0000 'szolitsa meg a 24C32 -t
I2cwbyte &H00 'Felso nyolc byte cime
I2cwbyte &H01 'Also nyolc byte cime 'L adress of EEPROM
I2cwbyte Adatbe 'Kuldjuk a cimre az adatot
I2cstop 'I2C stop
Waitms 10

'Olvasasa
I2cstart 'I2c inditasa
I2cwbyte &B1010_0000 'szolitsa meg a 24C32 -t
I2cwbyte &H00 'Felso nyolc byte cime
I2cwbyte &H00 'Also nyolc byte cime
I2cstart
I2cwbyte &B1010_0001 'Kinek küldje az adatot?

I2crbyte Adatki , Ack 'Olvassuk ki az Eprom-ot?
I2crbyte Adatki , Nack 'Kiolvastuk az eprom-ot?
I2cstop
Print "Kiolvasott :" ; Adatki
Loop

'________________________________

mivel az eprom nem 256 bytos a címet 2 byton kell meghatározni. L az lasó nyolc bit a H a felső nyolc bit
Igy 16 biten lehet cimet meghatározni.
Pl: ha a 10 es cimre szeretnenk irni akkor a H=0 L=0AH
ha az 513 ra akkor H=2 L=1
Amit nem értek hogy az adat irasa a az also nyolc byte-n 1 -el kisebb mint olvasasnal.
'Mi lehet az oka?

Az egyéb leirt dolgok elvileg jók... esetleg ha van észrevétel szívesen veszem!
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ás olvasás alatt mit értesz?

- van az EEPROMban a byte címe ahova írsz.
- van az I2C cím amin olvasol / írsz.

1, EEPROM byte címe íráskor/olvasáskor ugyanaz kell legyen.
2, I2C cím: az utolsó bit az írás/olvasás.


3, Az írás metódusa:
- chipet megszólítom
- írni akarok
- megadom az írási címet
- chipet megszólítom
- adatot küldök

Olvasás:
- chipet megszólítom
- írni akarok
- megadom az olvasandó címet
- chipet megszólítom
- adatot olvasok.


Nos ha kimarab a olvasásnál a megszólítom, hogy olvasni akarok _után_ a honnan. akkor az autoincrement miatt a írás _utáni_ címről olvasok, mert:
ha a
Az írás metódusa:
- chipet megszólítom
- írni akarok
- megadom az írási címet
- chipet megszólítom
- adatot küldök '1. byte
- chipet megszólítom
- adatot küldök '2. byte
- chipet megszólítom
- adatot küldök '3. byte
- chipet megszólítom
- adatot küldök '4. byte

az n. byte helyre ír......
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

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

SZervusz!
-Igaz.
Köszönöm a gyors reagálást!
Közben azt hiszem rájöttem a hibára.

'I2crbyte Adatki , Ack 'Olvassuk ki az Eprom-ot?
úgy tünik ő volt a ludas.
így azonos a cím az olvasasnal es az irasnal is ha kiveszem a programból.



'Mega128 24C32 EEprom kezelese
Config Scl = Portd.0 'assign the SCl line to PORTD.0
Config Sda = Portd.1 'assign the SDA line to PORTD.1

Dim Adatbe As Byte
Dim Adatki As Byte

Do
'Adat irasa
Input "ertek adas 0 - 255 :" , Adatbe
I2cstart 'generate start
I2cwbyte &B1010_0000 'szolitsa meg a 24C32 -t
I2cwbyte &H00 'Felso nyolc byte cime
I2cwbyte &H01 'Also nyolc byte cime 'L adress of EEPROM
I2cwbyte Adatbe 'Kuldjuk a cimre az adatot
I2cstop 'I2C stop
Waitms 10

'Olvasasa
I2cstart 'I2c inditasa
I2cwbyte &B1010_0000 'szolitsa meg a 24C32 -t
I2cwbyte &H00 'Felso nyolc byte cime
I2cwbyte &H01 'Also nyolc byte cime
I2cstart
I2cwbyte &B1010_0001 'Kinek küldje az adatot?

'I2crbyte Adatki , Ack 'Olvassuk ki az Eprom-ot?
I2crbyte Adatki , Nack 'Kiolvastuk az eprom-ot?
I2cstop
Print "Kiolvasott :" ; Adatki
Loop
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

, ACK -> Fogok még olvasni!
, NACK -> Köszi, de ez volt az utolsó, nem kérek többet....
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

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

Ezzel nem voltam tisztába!
Még nem volt szükségem 2IC bus kezelésére, de most eljött a pillanat.

Ezek szerint amíg nem küldök , NACK -ot
és egymas utan folyamatosan olvasom az ACK-val, akkor mindíg a következő byte-tól olvassa.. ?
Ekkor elvileg megtehetem hogy amíg Pl.: 255 nem érkezik (Nincs adat) akkor fejezze be az olvasast.. ?

Tehát az eprom-bol beolvasott byte-ből stringet csinalhatok.
illetve ha a beolvasott byte= 255 akkor azzal mehatarozhatom a szamomra szukseges "Adat" (String) végét..?

Illetve ha tudom hogy hol kezdődik a szamomra aktualis "adat", akkor csak a kezdo 'Poziciot' eleg megadnom.

Huh.. kicsit lehet tulbonyolítottam de remélem érthető. Tehát jól gondolom?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Ez azért nem ilyen egyszerű.
Az adatlapot tessék átfutni. Itt bejátszik a 64 byte-s laphatár is.

Maradj a bytenyit olvasok, bytenyit írok felállásnál. Az _minden_ chipnél megy.


Illetve a Processzor belső EEPROMja is könnyen kezelhető, pl. szövegtárolásra (de a flashban is elfér, ha nem változó a szöveg).


EEPROMban karakterlánc kezelése:

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

dim a as ERAM String*10
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

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

Ahham. A belső EEprom már kicsi a mostani célra sajnos.
A szöveg is változó.

Minden esetre köszönöm a segítséget.
Az adatlapot még bogarászom. Bár mint említettem az Angol nem erösségem :(
A string-ek hossza max 32 byte amit le kell tarolnom.
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

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

Amit eddgi olvastam adatlapot 24c ..lc 256 abban benne volt az auto
increment azaz ha read-elsz egymás után akkor egymás utáni adatokat
fogsz kapni(ez pl jó karakterláncra)

De lehet hogy gyártója vagy tipusa válogatja és van olyan
amiben nincs sequential read..
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

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

Szia!

Huh.. egy próbát megér :)

String-ben egy karaktert már sikerült bespékelnem neki.

Csak visszafelé kell konvertálnom.

Jelenleg így:
'Mega128 _ 24C32 EEprom kezelese
Config Scl = Portd.0 'assign the SCl line to PORTD.0
Config Sda = Portd.1 'assign the SDA line to PORTD.1
Dim Pstring As String * 2
Dim Adatbe As String * 1
Dim Adatki As Byte

Do
'Adat irasa
Input "ertek adas 0 - 255 :" , Adatbe
I2cstart 'generate start
I2cwbyte &B1010_0000 'szolitsa meg a 24C32 -t
I2cwbyte &H00 'Felso nyolc byte cime
I2cwbyte &H01 'Also nyolc byte cime 'L adress of EEPROM
I2cwbyte Adatbe 'Kuldjuk a cimre az adatot
I2cstop 'I2C stop
Waitms 10

'Olvasasa
I2cstart 'I2c inditasa
I2cwbyte &B1010_0000 'szolitsa meg a 24C32 -t
I2cwbyte &H00 'Felso nyolc byte cime
I2cwbyte &H01 'Also nyolc byte cime
I2cstart
I2cwbyte &B1010_0001 'Kinek küldje az adatot?

I2crbyte Adatki , Ack 'Olvassuk ki az Eprom-ot?
'I2crbyte Adatki , Nack 'Kiolvastuk az eprom-ot?
I2cstop
Print "Kiolvasott :" ; Adatki



Pstring = String(1 , Adatki)
Print "Kiolvasott :" ; Pstring 'Itt ujra karakterkent megjelenik az eeprom-bol beolvasott ertek
I2crbyte Adatki , Nack 'Ez volt az utolsó
Loop
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

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

herc1234!

Müködik. Szóval olvashatom egymas utan.
Nagyon köszönöm a segítséget!
Így már léphetek még1-et :)

Háát az biztos hogy az én agyam nagyon nehezen akarta megérteni... 8)
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

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

ennél van olcsóbb megoldás szerintem

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

const size=4 'amenyit csak bír
DIM Strvar as string*size at $'avr szabadon használható első cime
dim beolvas1 as byte at $61 overlay 'avr ram terület belelóg a Strvar változóba'
dim beolvas2 as byte at $62 overlay ' mondjuk az ascii kód második tagja
'a lényeg annyi hogy ha elcsuszol valahol egy byteot akkor elmennek 
'a karakterek is
'aztán 

sallang sallang....
for ....'ciklus size constként
sub beolvas
sub léptet
next

print Strvar

end


beolvas:
sallang sallang ezt nem magyarázom hisz ezt érted bár szerintem lehet
word-öt is kiküldeni addressnek(aztán lehet hogy nem nem ez a lényeg)
 
léptet:
shift right vagy left Strvar
vagy valami ilyesmi
nem akartam nagyon konkrét lenni mert a lényeg itt a változók egymásra
lapozása a legolcsóbb és egyszerübb megoldás




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

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

SRAM & Overlay esetével azért óvatosan....
Az elejére az alapváltozókat kell berakni, utána a olvasandó stringet (ez már fixen kiadja amemóriacímeket), majd utána a programírás/bővítés maradék változóit.
A memória "tetején" a HW/SWStack és a Frames memóriarekesze található....

A memóriakiosztás címei a fordítás után a Report alatt megtalálhatóak...
Válasz küldése