I2C EEPROM kezelése
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.
Ez valahol le is van írva...
http://avr.tavir.hu/modules.php?name=Co ... age&pid=14 Tömb fejezet, lapközepe.
Szervusztok!
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?
'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!
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?
'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!
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......
- 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......
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
-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
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?
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?
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:
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
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
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
ennél van olcsóbb megoldás szerintem
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]
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
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]
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...
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...