Elektronika

Edukativni tekstovi iz sveta elektronike

Komponente

Opisi komponenata koje se koriste u elektronici

Novosti

Najnovije vesti iz elektronike i ostalih srodnih oblasti

Projekat

Projekti iz elektronike za samogradnju

Rečnik

Rečnik pojmova iz elektronike i računarstva

Početna » Programiranje

Pristup EEPROM-u

Autor | Subota, 27. Jun 2009.Nema komentara

Većini mikrokontrolera koji dolaze sa ugrađenim EEPROM-om, Hi-Tech C kompajler omogućuje nekoliko metoda za pristup ovoj memoriji. U ovom tekstu su opisane sve njegove metode za pristup EEPROM-u.

__EEPROM_DATA() makro

Za one PIC mikrokontrolere koji podržavaju eksterno programiranje EEPROM-a, makro _EEPROM_DATA se može koristiti da se postave inicijalne vrednosti EEPROM-a u HEX fajl kojim se programira mikrokontroler. Makro se koristi na sledeći način:

  #include <htc.h>
  __EEPROM_DATA(0,1,2,3,4,5,6,7);  

Ovaj makro prihvata osam parametara, koji predstavljaju osam vrednosti u EEPROM lokacijama. Svaka vrednost treba da je veličine jednog bajta. Nekorištene vrednosti treba da budu predstavljene kao parametar nula. Makro se može pozvati više puta, zavisno od količine podataka koje je potrebno smestiti u EEPROM. Preporučljivo je da se makro nalazi izvan bilo koje funkcije u programu.

Ovaj makro se ne koristi da bi se pisalo u EEPROM lokacije tokom izvršavanja programa, već samo da bi se upisale inicijalne vrednosti prilikom prvog programiranja mikrokontrolera.

EEPROM pomenljive

Korišćenjem eeprom promenljivih omogućen je mnogo fleksibilniji pristup inicijalizaciji EEPROM lokacija nego sa makroom __EEPROM_DATA, jer one ne zahtevaju osam bajtova za parametre i obezbeđuju ugrađene funcije za pristup istim lokacijama.

Korišćenje EEPROM promenljivih predstavlja veoma jednostavan i efikasan metod da se konfiguriše i pristupi EEPROM-u. Ova opcija omogućava inicijalizaciju EEPROM lokacija i obvezbeđuje najjednostavniji mehanizam za pristup u toku izvršavanja programa. Ova opcija se može primeniti samo na globalne i/ili statičke promenljive i označava da se objekat nalazi u EEPROM-u. Na primer:

 eeprom unsigned int serial_number = 0x1234; 

Ovo će kreirati eeprom promenljivu sa predefinisanom vrednošću 0x1234. Ova vrednost se postavlja samo u toku programiranja mikrokontrolera. Ovoj promenljivoj može se pristupiti tokom izvršavanja programa, za čitanje i upis u nju:

 serial_number = 0xAA55; 

Kompajler će kreirati odgovarajući kod kako bi se pristupilo promenljivoj. Za razliku od rom promeljivih, ukoliko se izvrši upis u inicijalizovanu eeprom promenljivu tokom izvršavanja programa, pri sledećem resetu mikrokontrolera eeprom promenljiva će sadržati vrednost koja je poslednja u nju upisana, a ne inicijalizovanu.

Treba voditi računa da kompajler podržava samo osnovne operacije dodeljivanja objektima u EEPROM-u. Ukoliko se u nekom kompleksnom izrazu upotrebi eeprom promenljiva, kompajler će generisati grešku “can’t read code”. U ovakvoj situaciji pokušajte da pojednostavite izraz ili možda da koristite privremenu promenljivu za smeštanje vrednosti iz eeprom promenljive.

Napomena: Kako lokacije eeprom promenljivih određuje kompajler, nije neophodno pristupati EEPROM-u sa specifičnom adresom, naprotiv ovo čak treba izbegavati. Iz ovog razloga nije preporučljivo kombinovano korišćenje eeprom promenljivih i drugih EEPROM metoda za pristup.

Funkcije za pristup EEPROM-u

Funkcije eeprom_read() i eeprom_write(), mogu biti pozivane za čitanje iz EEPROM-a i za pisanje u EEPROM, tokom izvršavanja programa. Sledećim kodom je moguće promenljivu veličine jednog bajta upisati u EEPROM i iščitati koristeći ove funkcije:

#include <htc.h>
void eetest(void) {
  unsigned char prom = 0x23;
  unsigned char adr = 0x12;
  eeprom_write(adr,prom);
  promenljiva = eeprom_read(adr);
} 

Ove funkcije proveravaju da li postoji neki konkurentni upis u EEPROM pre izvođenja tražene operacije. Funkcija eeprom_write() će otpočeti proces upisa vrednosti u EEPROM i taj proces neće biti završen pre nego što ta funkcija vrati kontrolu programu. Novi podatak koji se upisuje u EEPROM biće dostupan približno četiri milisekunde posle povratka kontrole programu. Dakle u prethodnom primeru nova vrednost neće biti dostupna u momentu kada je funkcija eeprom_read()M pozvana, ali kako smo rekli da ove funkcije pre svog izvršavanja čekaju da se konkurentne funkcije završe, korektna vrednost će biti iščitana.

Napomena: Sa nekim od metoda za pristup EEPROM-u, poželjno je koristiti predprocesorsku direktivu _EEPROMSIZE. Ovaj simbol definiše količinu bajtova koja je dostupna za selektovani čip sa kojim se radi.

Makroi za pristup EEPROM-u

Iako ovi makroi obavljaju skoro isti posao kao prethodno navedene funkcije za rad sa EEPROM-om, njih treba upotrebljavati samo u izuzetnim situacijama. Prikladno je odabrati makroe EEPROM_READ i EEPROM_WRITE umesto odgovarajućih funkcija, ukoliko je bilo koji od navedenih uslova tačan:

  • Ne možete priuštiti dodatni nivo dubine u steku neophodan za pozivanje funkcije
  • Ne možete priuštiti dodatni kod za prosleđivanje parametara i izvršavanje instrukcija call/return
  • Ne možete priuštiti dodatno procesorsko vreme neophodno za izvršavanje poziva funkcija

Budite obazrivi. Ako u programu imate više instanci poziva ma kojeg makroa, ušteda memorije koda je nemoguća, jer se sadržaj kompletnog makroa u tom slučaju duplira u kodu.

U slučaju EEPROM_READ(), postoji još jedan detalj koji treba napomenuti. Za razliku od funkcije eeprom_read(), ovaj makro ne čeka da se konkurentni upis završi, pre nego što on pređe na iščitavanje EEPROM-a. Da smo u prethodnom primeru koristili EEPROM_READ() umesto eeprom_read() željena operacija ne bi bila izvršena. Ukoliko nije zagarantovano da su sva upisivanja u EEPROM završena pre poziva makroa EEPROM_READ(), potrebno je proveriti status odgovarajućeg bita:

#include <htc.h>
void eetest(void) {
  unsigned char prom = 0x27;
  unsigned char adr = 0x12;
  EEPROM_WRITE(adr,prom);
  while (WR) continu;
  prom = EEPROM_READ(adr);
} 

Na ovaj način smo se obezbedili da se sačeka završetak upisa u memoriju, pre novog isčitavanja.

Leave your response!

You must be logged in to post a comment.