Avtor: Mag. Vladimir Mitrović
2017_257_34
V uvodu sem omenil, da se na ZS-042 ploščici poleg integrirane ure realnega časa DS3231 kot bonus nahaja tudi serijski EEPROM AT24C32 kapacitete 4 kB. Bascom-AVR ima alternativne knjižnice, ki omogočajo uporabo nekaterih serijskih EEPROM-ov na zelo eleganten način, kot da gre za interni EEPROM samega mikrokontrolerja. Na žalost te knjižnice ne podpirajo vseh serijskih EEPROM-ov in niti niso dostopne uporabnikom demo verzije programa. Če želite izkoristiti AT24C32 iz ZS-42 modula ste prepuščeni standardnim Bascom-ovim I2C ukazom in proučevanju tehnične dokumentacije integriranega vezja
Spretnejšemu programerju ne bi smelo predstavljati večji problem da bi napisal nekaj podprogramov za naslavljanje, branje in pisanje samo enega serijskega EEPROM-a. Zanimalo me je, kako napisati podprograme, ki bi obsegali celotno paleto serijskih EEPROM-ov, od AT24C01 do trenutno največjega, AT24CM02. Če jih preučimo bolj podrobno bomo opazili, da imajo vsi enak osnovni naslov, 1010 binarno, vendar se postopek naslavljanja razlikuje odvisno od kapacitete čipa (slika 8):
- EEPROM-i uporabljajo eno-bajten naslov čipa (device address) in eno- ali dvo-bajten naslov spominskih lokacij znotraj čipa (word address);
- Naslov čipa je sestavljen iz štiri-bitnega osnovnega naslova(1010), tri-bitnega izbranega naslova (A2 A1 A0) in RW bita, ki določa aktivnost (branje ali pisanje);
- Izbran naslov je določen z logičnimi stanji pinov A2, A1 in A0; če so ta logična stanja različna je na isto vodilo možno vezati več kot en serijski EEPROM;
- Odvisno od kapacitete EEPROM-i potrebujejo 7 – 18 naslovnih bitov za naslavljanje spominskih lokacij znotraj čipa (na sliki 8 so izkoriščeni naslovni biti obarvani s sivo barvo, neizkoriščeni pa so označeni z znakom X);
- EEPROM-i do 24C16 imajo samo en bajt za naslavljanje spominskih lokacij in se kot naslovni biti pri 24C04, 24C08 in 24C16 dodatno uporablja še eden, dva ali vsi trije biti izbranega naslova (biti uporabljeni za naslavljanje adresiranje spominskih lokacij izgubijo funkcijo izbranega naslova);
- Isti princip je uporabljen tudi za EEPROM-e velike kapacitete (24CM01, 24CM02), ki imajo 17- oziroma 18-bitni naslov spominskih lokacij).
Raziskovanje mi je vzelo malo več časa kot sem planiral, ampak je rodilo knjižnice 24C$SE.sub in 24C$SEmini.sub, ki bodo predmet našega prihodnjega premisleka. Podprogrami iz knjižnice pokrivajo Atmelove (zdaj Microchip) EEPROM-e z oznakami AT24C01 do AT24CM02 kot tudi ekvivalentne proizvode drugih proizvajalcev (npr., AT24C04 = XL24C04 = M24C04).
Knjižnica 24C$SE.sub
Knjižnica 24C$SE.sub vsebuje nekaj globalnih spremenljivk in rutine (podprograme) za izbor in naslavljanje integriranih vezij iz družine 24C v razponu od 24C01 do 24CM02, kot tudi za izmenjavo podatkov z njima. Vse spremenljivke in podprogrami imajo prefiks 24c$.
Globalne spremenljivke, ki so z vklopom 24C$SE.sub knjižnice postale sestavni del vašega programa so dimenzionirane na naslednji način:
Dim 24c$pages As Word Dim 24c$pagel As Word
Spominski prostor EEPROM-a je razdeljen na strani; 24C$pages vsebuje število strani, 24C$pagel pa dolžino vsake strani izbranega EEPROM-a.
Dim 24c$current_address As Long
24c$current_address vsebuje trenutno vrednost naslovnega kazalca.
Dim 24c$device_w_address As Byte Dim 24c$device_r_address As Byte
24c$device_w_address i 24c$device_r_address so naslovi trenutno izbranega izbranega čipa (device address) za pisanje in branje.
Vrednosti navedenih spremenljivk lahko uporabite iz svojega programa, ne priporočam pa, da jih spreminjate, ker s tem direktno vplivate na način izvršitev podprogramov. Poleg teh knjižnica dimenzionira še nekaj globalnih spremenljivk za izmenjavo podatkov med podprogrami, kot tudi lokalne spremenljivke, ki jih podprogrami uporabljajo. Imena teh “skrivnih” globalnih spremenljivk imajo prefiks 24c$$ zato priporočam, da takšna imena spremenljivk ne uporabljate v svojih programih.
Vsi podprogrami (rutine) iz knjižnice 24C$SE.sub so vidni iz programa kot “običajni” Bascom-AVR ukazi. Sledi njihov opis:
Ukazi 24c01$select, 24c02$select, 24c04$select, 24c08$select, 24c16$select, 24c32$select, 24c64$select, 24c128$select, 24c256$select, 24c512$select, 24cm01$select, 24cm02$select
24c01$select par1, par2 ... 24cm02$select par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje izbran naslov čipa (A2 A1 A0 = 000-111b). |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje trajanje pavze v milisekundah, ki se bo aktivirala po vsakem write ukazu (pavza je potrebna zato, da bi EEPROM lahko dokončal vpis podatkov); 0 namesto pavze vključuje acknowledge polling (podrobno pojasnjeno v primerih) | |
Namen: | Opisuje karakteristike EEPROM-a na I2C vodilu (kapaciteta,naslov, trajanje operacije vpisa) s katerim se bo odvijala vsa bodoča komunikacija. Vpisuje 0 na naslovni kazalnik (24c$current_address) in formira naslove čipa za pisanje in branje(24c$device_w_address, 24c$device_r_address). | |
Opomba: | Med izvrševanjem programa je možno izmenično izbrati nekaj EEPROM-ov, vendar bo v vsakem trenutku aktiven samo tisti, ki je bil izbran zadnji. Ukaz je potrebno izvršiti tudi ko se na vodilu nahaja samo en EEPROM. |
Ukaz 24c$set_addres
24c$set_address par1
Parametri: | par1 | konstanta ali ime long spremenljivke ki vsebuje vrednost ki jo je treba vpisati v naslovni kazalnik EEPROM-a (tekoč naslov) |
Namen: | Vpisuje podatek par1 v naslovni kazalnik 24c$current_address, kontrolira vpisano vrednost in maskira odvečne bite če je naslov večji od dovoljene za izbrani EEPROM in formira naslove čipa za pisanje in branje (24c$device_w_address, 24c$device_r_address). |
Ukaz 24c$incr_address
24c$incr_address
Parametri: | Jih ni |
Namen: | Povečuje vrednost naslovnega kazalnika 24c$current_address za 1, s prehodom na 0 ko naslov postane večji od dovoljenega za izbrani EEPROM in formira naslove čipa za pisanje in branje (24c$device_w_address, 24c$device_r_address). |
Ukaz 24c$$form_address
24c$$form_address
Parametri: | Jih ni |
Namen: | Pomožni podprogram ki uporablja ukaze 24cxx$select, 24c$set_address in 24c$incr_address; priporoča se, da se ga ne uporablja neposredno. |
Ukaz 24c$$send_address
24c$$send_address
Parametri: | Jih ni |
Namen: | Pomožni podprogram ki ukaze iz knjižnice uporablja za naslavljanje izbranega EEPROM-a; priporoča se, da se ga ne uporablja neposredno. |
Opomba: | V kolikor je vključen acknowledge polling (pri ukazu 24cxx$select, par2 = 0), bo podprogram čakal dokler se naslovljeni EEPROM ne odzove. |
Ukaz 24c$write_block
$notypecheck 24c$write_block par1, par2
Parametri: | par1 | Ime spremenljivke, ki označuje začetek bloka podatkov |
par2 | konstanta ali ime word spremenljivke, ki vsebuje dolžino bloka podatkov | |
Namen: | Vpisuje blok podatkov določene dolžine začenši od tekočega naslova EEPROM-a; povečuje vrednost naslovnega kazalnika za dolžino bloka. Teoretično je blok lahko dolg 65535 bajta; v praksi je določen s kapaciteto RAM-a mikrokontrolerja ali kapaciteto EEPROM-a. | |
Opomba: | Za pravilno prevajanje mora biti aktiven Bascom-AVR ukaz $notypecheck. |
Čeprav je ta ukaz dovoljšen za vpis katerega koli podatka v spomin EEPROM-a, sem predvidel še tri namenske ukaze, ki olajšajo delo s spremenljivkami tipa byte, word in long:
Ukaz 24c$write_b
24c$write_b par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje vrednost ki jo je potrebno vpisati v EEPROM |
Namen: | Vpisuje podatek par1 dolžine 1 bajt na tekoči naslov EEPROM-a; povečuje naslovni kazalnik za 1. |
Ukaz 24c$write_w
24c$write_w par1
Parametri: | par1 | konstanta ali ime word spremenljivke, ki vsebuje vrednost ki jo je treba vpisati v EEPROM |
Namen: | Vpisuje podatek par1 dolžine 2 bajta začenši od tekočega naslova EEPROM-a; povečuje naslovni kazalnik za 2. |
Ukaz 24c$write_l
24c$write_l par1
Parametri: | par1 | konstanta ali ime long spremenljivke, ki vsebuje vrednost ki jo je treba vpisati v EEPROM |
Namen: | Vpisuje podatek par1 dolžine 4 bajta začenši od tekočega naslova EEPROM-a; povečuje naslovni kazalnik za 4. |
Ukaz 24c$$write
24c$$write
Parametri: | Jih ni |
Namen: | Pomožni podprogram, ki uporablja vse ukaze za pisanje v EEPROM; priporočljivo je, da se ga ne uporablja neposredno. |
Opomba: | V kolikor je vključen acknowledge polling (pri ukazu 24cxx$select, par2 = 0), bo podprogram čakal, dokler se naslovljeni EEPROM ne odzove; če je izključen (pri ukazu 24cxx$select, par2 > 0), bo podprogram čakal par2 milisekund dokler se proces vpisa ne konča. |
Ukaz 24c$read_block
$notypecheck 24c$read_block par1, par2
Parametri: | par1 | Ime spremenljivke, ki označuje začetek bloka podatkov |
par2 | konstanta ali ime word spremenljivke, ki vsebuje dolžino bloka podatka | |
Namen: | Bere blok podatka specificirane dolžine začenši od tekočega naslova EEPROM-a in ga shrani v RAM mikrokontrolerja začenši od navedene spremenljivke; povečuje vrednost naslovnega kazalnika za dolžino bloka. Teoretično je blok lahko dolg 65535 bajtov; v praksi je določen s kapaciteto RAM-a mikrokontrolerja in kapaciteto EEPROM-a. | |
Opomba: | Za pravilno prevajanje mora biti aktiven Bascom-AVR ukaz $notypecheck. |
Čeprav je ta ukaz dovolj za branje katerega koli podatka iz spomina EEPROM-a, sem dodal še tri namenske ukaze, ki olajšujejo delo s spremenljivkami vrste byte, word in long:
Ukaz 24c$read_b
24c$read_b par1
Parametri: | par1 | ime byte spremenljivke v katero se bo vpisal prebrani bajt iz EEPROM-a |
Namen: | Bere 1 bajt s tekočega naslova EEPROM-a in ga shrani v spremenljivko par1; povečuje naslovni kazalnik za 1. |
Ukaz 24c$read_w
24c$read_w par1
Parametri: | par1 | ime word spremenljivke v katero se bosta vpisala dva prebrana bajta iz EEPROM-a |
Namen: | Bere 2 bajta začenši od tekočega naslova EEPROM-a in ju shrani v spremenljivko par1; povečuje naslovni kazalnik za 2. |
Ukaz 24c$read_l
24c$read_l par1
Parametri: | par1 | ime long spremenljivke, v katero se bodo vpisali štirje prebrani bajti iz EEPROM-a |
Namen: | Bere 4 bajte začenši od tekočega naslova EEPROMa in jih shrani v spremenljivko par1; povečuje naslovni kazalnik za 4. |
Ukaz 24c$$read
24c$$read
Parametri: | Jih nima |
Namen | Pomožni podprogram, ki uporablja vse ukaze branja iz EEPROM-a; priporoča se, da se ga ne uporablja neposredno. |
Opomba: | V kolikor je vključen acknowledge polling (pri ukazu 24cxx$select, par2 = 0), bo podprogram čakal dokler se naslovljeni EEPROM ne odzove. |
Ukaz 24c$erase
24c$erase
Parametri: | Jih nima |
Namen: | Briše vsebino EEPROM-a in vpiše na vse spominske lokacije FFh. |
Opomba: | Ukaz uporablja page write tehniko. V kolikor je vključen acknowledge polling (pri ukazu 24cxx$select, par2 = 0), bo podprogram pred vpisom vsake strani čakal dokler se naslovljeni EEPROM ne odzove; če je izključen (pri ukazu 24cxx$select, par2 > 0), bo podprogram čakal par2 milisekundi dokler se proces vpisa vsake posamezne strani ne zaključi. |
Knjižnica 24C$SEmini.sub
Kakor že ime sugerira, 24C$SEmini.sub “mini” verzija knjižnice 24C$SE.sub, je namenjena manjšim mikrokontrolerjem. Gre za to, da imata EEPROM-a največje kapacitete 24CM01 in 24CM02, 17- in 18-bitno naslovno besedo za katero moramo v knjižnici predvideti long spremenljivke. Zaradi kompatibilnosti se iste spremenljivke nepotrebno uporabljajo tudi za vse manjše EEPROM-e. Delo z long spremenljivkami ne povzroča samo večje zasedenosti RAM-a mikrokontrolerja, pač pa je tudi obdelava takšnih spremenljivk obsežnejša, zato program postaja večji. Če se “borite” da bi vaš program lahko uporabljali z demo Bascom-AVR in ne želite uporabiti velikih EEPROM-ov, je 24C$SEmini.sub boljša izbira.
Knjižnica 24C$SEmini.sub podpira EEPROM-e od 24C01 do 24C512, od knjižnice 24C$SE.sub se razlikuje v naslednjih nekaj podrobnostih. Naslovni kazalnik je sedaj spremenljivka vrste word, dolžina strani je zapisana v spremenljivki vrste byte:
Dim 24c$current_address As Word Dim 24c$pagel As Byte
Ta sprememba potegne za sabo zmanjšanje nekaj pomožnih spremenljivk v knjižnici, vpliva pa tudi na ukaz 24c$set_address, kateri se sedaj preda naslov v spremenljivki vrste word:
Ukaz 24c$set_address
24c$set_address par1
Parametri: | par1 | konstanta ali ime word spremenljivke, ki vsebuje vrednost, ki jo je treba vpisati v naslovni kazalnik EEPROM-a (tekoči naslov) |
Namen: | Vpisuje podatek par1 v naslovni kazalnik 24c$current_address, kontrolira vpisano vrednost in maskira odvečne bite, če je naslov večji od dovoljenega za izbrani EEPROM in formira naslove čipa za pisanje in branje (24c$device_w_address, 24c$device_r_address). |
Vse ostalo je za uporabnika identično. Da ne bomo ostali na suhoparnem naštevanju ukazov iz teh knjižnic, bomo v naslednjem prispevku s primeri pokazali, kako jih pravilno uporabljati.
Opomba: 24C$SE.sub in 24C$SEmini.sub knjižnice lahko brezplačno dobite v uredništvu revije Svet elektronike.
Barduino (3)