85_87.pdf

(123 KB) Pobierz
Pamięci nieulotne w systemach mikroprocesorowych, część 1
K U  R S
Pamięci nieulotne w systemach
mikroprocesorowych, część 1
Jedn¹ z†najbardziej efektywnych
i†jednoczeúnie tanich metod przecho-
wywania danych jest wykorzystanie
pamiÍci RAM mikrokontrolera. Ma to
jedn¹, waøn¹ zaletÍ: w†przypadku awa-
rii napiÍcia zasilaj¹cego dane juø znaj-
duj¹ siÍ tam, gdzie bÍd¹ potrzebne po
przywrÛceniu ìnormalnychî warunkÛw
pracy. Nie trzeba zatem wykonywaÊ
øadnych dodatkowych krokÛw w†celu
ich przechowania. Oczywiúcie pozosta-
je kwestia kontroli, czy zapamiÍtane
dane nie zosta³y uszkodzone, ale nie
zmienia to cech, o†ktÛrych by³a mowa
wczeúniej. To od strony programowej.
A†jak wygl¹da to samo zagadnienie od
strony sprzÍtowej?
Niestety, niezbÍdne s¹ pewne do-
datkowe po³¹czenia i†elementy ze-
wnÍtrzne. Jak zapewne pamiÍtamy,
pamiÍÊ DRAM jest zbudowana z wie-
lu miniaturowych kondensatorÛw, ktÛ-
re przechowuj¹ ³adunek elektryczny
nios¹cy informacjÍ o†stanie bitu. Pa-
miÍci DRAM wymagaj¹ odúwieøania
zawartoúci, czyli okresowego do³ado-
wywania kondensatorÛw. PamiÍÊ
SRAM nie wymaga odúwieøania (a
w†tak¹ zazwyczaj s¹ wyposaøane mik-
rokontrolery) i†moøe przechowywaÊ
dane dowolnie d³ugi czas, ale pod
warunkiem zapewnienia zasilania. Ro-
lÍ ürÛd³a zasilaj¹cego moøe pe³niÊ
kondensator elektrolityczny o†bardzo
duøej pojemnoúci, akumulator lub ba-
teria. Wszystko zaleøy od wymagaÒ
aplikacji. W†swoich projektach czÍsto
wykorzystujÍ bateriÍ litow¹ o†napiÍciu
3†V. Zasilanie mikrokontrolera wy³¹cz-
nie z†baterii jest raczej nieefektywne,
toteø stosuje siÍ automatyczne prze-
³¹czniki zasilania prze³¹czaj¹ce zasila-
nie mikrokontrolera pomiÍdzy ürÛd³em
stacjonarnym (np. zasilaczem) a†bate-
ri¹ czy akumulatorem. Prze³¹cznik
moøna zbudowaÊ w†oparciu o†specja-
lizowany uk³ad scalony lub za pomo-
Konstruuj¹c urz¹dzenia z†mikrokontrolerami czÍsto
stajemy przed koniecznoúci¹ zapewnienia przechowywania
danych takøe po wy³¹czeniu lub zaniku zasilania. £atwo
jest, jeúli s¹ to sta³e jak: napisy menu (dla przyk³adu
w†rÛønych jÍzykach), obrazy, sta³e parametry nastaw.
Gorzej, gdy musimy przechowaÊ zmienne. Jeszcze
trudniej, gdy musz¹ one byÊ zapamiÍtane rÛwnieø
w†przypadku awarii napiÍcia zasilania.
c¹ diod krzemowych lub lepiej - ger-
manowych. Przyk³adami fabrycznych
rozwi¹zaÒ w†formie uk³adÛw scalo-
nych mog¹ byÊ MAX6326, -75, -81.
Inne, bardziej skomplikowane, wypo-
saøone s¹ rÛwnieø w†funkcjÍ nadzoru
napiÍcia zasilania MAX6365...68, wej-
úcie sygna³u zewnÍtrznego reset
(MAX6366) i†uk³ad watchdog
(MAX6368). Przyk³ady ich zastosowaÒ,
zaczerpniÍte z†not aplikacyjnych pro-
ducenta, umieszczono na rys. 1 i† 2 .
Na rys. 3 przedstawiono schemat naj-
prostszego prze³¹cznika diodowego.
Oczywiúcie, oprÛcz przytoczonych,
moøna zaproponowaÊ rÛwnieø wiele
innych rozwi¹zaÒ sprzÍtowych. Opra-
cowuj¹c konstrukcje w³asnych prze-
³¹cznikÛw, zw³aszcza w†po³¹czeniu
z†uk³adem nadzoru napiÍcia zasilania,
trzeba mieÊ na uwadze kilka istotnych
czynnikÛw, miÍdzy innymi:
- zanik napiÍcia zasilaj¹cego powinien
zostaÊ wykryty wczeúniej niø pojawi
siÍ sygna³ reset dla mikrokontrolera,
- napiÍcie zasilaj¹ce z†baterii musi
byÊ prze³¹czone w†sposÛb ìpewnyî,
eliminuj¹cy wahania napiÍcia mog¹-
ce zak³ÛciÊ pracÍ mikrokontrolera,
- spadek napiÍcia na diodzie krzemo-
wej spolaryzowanej w†kierunku prze-
wodzenia to oko³o 0,6 V, natomiast
na diodzie germanowej 0,2 V; war-
toúÊ t¹ naleøy odj¹Ê od napiÍcia ba-
terii zasilaj¹cej i†ta rÛønica zasila
mikrokontroler,
- pr¹d pobierany przez pamiÍÊ CMOS
lub mikrokontroler w†stanie IDLE
jest tak ma³y, øe rÛwnieø detekcyj-
ne diody germanowe z†powodzeniem
mog¹ spe³niaÊ rolÍ prze³¹cznika na-
piÍcia zasilaj¹cego; odnosz¹c tÍ uwa-
gÍ do rys. 3: dioda D2 moøe byÊ
diod¹ germanow¹.
Uk³ady mikrokontrolerÛw wprowa-
dzone w†tryb IDLE pobieraj¹ znikom¹
iloúÊ energii i†zachowuj¹ zawartoúÊ pa-
miÍci RAM. Typowo pr¹d potrzebny do
zasilania w†trybie IDLE ma wartoúÊ
mniejsz¹ niø 100
µ
Rys. 1. Przykład zastosowania układu MAX6326 do przełączania źródeł
napięcia zasilającego
Rys. 2. Przykład użycia układu
MAX6368 do przełączania źródła
napięcia zasilającego oraz
generowania sygnału reset dla
mikrokontrolera
Elektronika Praktyczna 10/2003
85
A. W†sytuacji jak
opisywana wyøej, gdy do przechowywa-
32651538.011.png 32651538.012.png 32651538.013.png 32651538.014.png 32651538.001.png 32651538.002.png 32651538.003.png 32651538.004.png 32651538.005.png
 
K U  R S
List. 1. Przykład procedury obsługi przerwania wprowadzającej mikrokontroler
w stan obniżonego poboru energii IDLE
;********** PRZERWANIE ZEWN.INT1 ****************
IrqExt1:
clr EA
mov P1,INIT_FOR_P1
mov P2,INIT_FOR_P2
mov P3,INIT_FOR_P3
orl PCON,#3
;wyłączenie mikrokontrolera, przechowywanie zawartości RAM
ajmp $
;ponowne załączenie po sygnale RESET (PD=IDL=1 -> PD)
Rys. 3. Budowa taniego, diodowego
przełącznika napięcia zasilania
List. 2. Przykład realizacji funkcji zapisu/odczytu danych w EEPROM
;***************** OBSŁUGA DANYCH PAMIĘTANYCH W EEPROM ***********************
;Testowanie bitu gotowości pamięci EEPROM po operacji zapisu
EE_BusyTest: mov A,WMCON
anl A,#00000010B
jz EE_BusyTest
ret
nia danych uøywana jest wewnÍtrzna
pamiÍÊ CMOS, uk³ad mikrokontrolera
musi byÊ zasilany z†baterii a†zanik na-
piÍcia zasilaj¹cego powinien byÊ sygna-
lizowany w†celu wprowadzenia mikro-
kontrolera w†stan obniøonego poboru
energii (IDLE). Abstrahuj¹c od rozwi¹-
zaÒ sprzÍtowych, mikrokontroler naleøy
wyposaøyÊ w†tak zwane wejúcie pomia-
rowe. Oczywiúcie dla wiÍkszoúci zasto-
sowaÒ wystarczaj¹ce jest wejúcie cyfro-
we pozwalaj¹ce stwierdziÊ obecnoúÊ sta-
nu logicznego wysokiego lub niskiego
przy³oøonego do wyprowadzenia.
CzÍsto do sygnalizacji zaniku na-
piÍcia wykorzystuje siÍ wejúcie ze-
wnÍtrznego przerwania. Dla mikrokon-
trolera z†rodziny 8051, wejúcia te
oznaczane s¹ jako INT0 i†INT1. Dos-
konale nadaj¹ siÍ one do takiej syg-
nalizacji, poniewaø kaøde z†wejúÊ po-
siada przerzutnik Schmitta pozwalaj¹-
cy jednoznacznie okreúliÊ stan logicz-
ny. Dodatkowo poziom napiÍcia (lub
jego zmianÍ) na wejúciu ³atwo jest po-
wi¹zaÊ z†odpowiadaj¹cym mu fragmen-
tem programu. Fragment ten moøe za-
wieraÊ na przyk³ad ustalenie stanu
portÛw wyjúciowych oraz wprowadze-
nie mikrokontrolera w†tryb obniøonego
poboru energii. Przyk³ad takiej funkcji
obs³ugi przerwania zewnÍtrznego
przedstawiono na list. 1 .
W†tym miejscu waøna uwaga: czÍs-
to programista wykorzystuj¹c wejúcie
przerwania zewnÍtrznego w†sposÛb ta-
ki, jak opisa³em wyøej (sam rÛwnieø
pope³nia³em taki b³¹d) ustawia bit po-
woduj¹cy wygenerowanie sygna³u prze-
rwania w†momencie pojawienia siÍ
opadaj¹cego zbocza sygna³u na wejúciu
INTx. Funkcja moøe zawieraÊ rozkaz
wprowadzenia mikrokontrolera w†tryb
IDLE w†celu obniøenia poboru energii
z†baterii. PÛüniej pojawia siÍ sygna³
reset generowany przez uk³ad nadzor-
cy napiÍcia zasilaj¹cego. Jeúli uk³ad
ten nie jest zasilany z†baterii (a naj-
czÍúciej w†celu oszczÍdzania energii
tak jest), to aktywny reset zaniknie
wraz z†zanikiem napiÍcia zasilania ca-
³ego obwodu poza mikrokontrolerem.
W†takiej sytuacji, zasilany energi¹
z†baterii mikrokontroler, zaczyna wy-
konywaÊ program pocz¹wszy od adre-
su 0, poniewaø aktywny sygna³ reset
wyprowadzi³ go z†trybu IDLE a†opa-
daj¹ce zbocze sygna³u na wejúciu
przerwania nie pojawi aø do momen-
;Wyłączenie EEPROM
EE_Disable: anl WMCON,#11100111B
ret
;Zapamiętanie bajtu danych w pamięci EEPROM,16-bitowy adres w DPTR, bajt w ACC
;po odczytaniu bajtu wartość DPTR jest zwiększana o 1
EE_SaveByte: orl WMCON,#00011000B ;Włączenie trybu zapisu
movx @DPTR,A
;Zapis bajtu
call EE_BusyTest
;Test zakończenia operacji
inc DPTR
ret
;Odczyt bajtu danych z pamięci EEPROM,16-bitowy adres w DPTR, bajt zwracany w ACC
;po odczytaniu bajtu wartość DPTR jest zwiększana o 1
EE_ReadByte: anl WMCON,#11100111B
orl WMCON,#00001000B
;Tryb odczytu
movx A,@DPTR
;Odczyt bajtu
inc DPTR
ret
tu za³¹czenia i†ponownego wy³¹czenia
zasilania. A†my dziwimy siÍ, gdzie
podziewa siÍ energia z†baterii, ktÛra
powinna wystarczyÊ na co najmniej
pÛ³ roku pracy...
OmÛwiony wyøej problem moøna
rozwi¹zaÊ na szereg rÛønych sposo-
bÛw, zarÛwno programowo jak i†sprzÍ-
towo. Najprostszym jest programowe
testowanie wejúcia pomiarowego lub
ustawienie przerwaÒ aktywowanych
poziomem niskim sygna³u a†nie jego
zboczem. Oczywiúcie zarÛwno czÍúÊ
sprzÍtowa jak i†programowa musz¹ ze
sob¹ wspÛ³graÊ w†celu osi¹gniÍcia jak
najlepszego efektu. PamiÍtajmy, øe mi-
mo wprowadzenie w†stan IDLE mikro-
kontroler nadal jest zasilany! W†przy-
padku niektÛrych aplikacji waønym
moøe byÊ rÛwnieø w³aúciwe ustawie-
nie stanÛw portÛw wejúciowych i†wyj-
úciowych. Praktyka pokazuje, øe mimo
iø porty nie powinny byÊ aktywne
i†dopuszczaÊ do ìwyciekÛwî energii
List. 3. Przykład użycia funkcji do obsługi pamięci EEPROM z list. 2
;Zapamiętanie parametrów ustawionych po kalibracji
EE_SaveParams:
mov DPTR,#EE_PLCSTADDR
mov A,PLCSTATE
;<- nastawy maszyny
call EE_SaveByte
mov A,PRNR
;<- numer aktywnego programu
call EE_SaveByte
mov A,CALSTEPS
call EE_SaveByte
mov A,CALSTEPS+1
;<- liczba kroków kalibracji
call EE_SaveByte
mov A,CALSTEPS+2
call EE_SaveByte
call EE_Disable
ret
;Odczyt parametrów systemowych
EE_RestParams:
mov DPTR,#EE_PLCSTADDR
call EE_ReadByte
mov PLCSTATE,A
call EE_ReadByte
cjne A,#0FFH,EE_RestP1 ;<- numer aktywnego programu
clr A
mov PRNR,A
call EE_ReadByte
mov CALSTEPS,A
call EE_ReadByte
mov CALSTEPS+1,A
;<- liczba kroków kalibracji
call EE_ReadByte
mov CALSTEPS+2,A
call EE_ReadProg
;<- odczyt ostatniego programu
ret
86
Elektronika Praktyczna 10/2003
32651538.006.png
K U  R S
Rys. 4. Również układ popularnego RTC zawiera 240 bajtów pamięci RAM,
którą można wykorzystać do przechowywania danych
zawartoúci moøna uzyskaÊ dostÍp juø
po wykonaniu pojedynczego rozkazu,
o†tyle dostÍp do danych poprzez in-
terfejs SPI czy I 2 C wymaga wykonania
kilku lub kilkunastu rozkazÛw.
Przyk³ad pod³¹czenia zasilania do
uk³adu zewnÍtrznej pamiÍci np. na-
staw przedstawiony jest na rys. 4 .
Wykorzystano tu popularny uk³ad ze-
gara czasu rzeczywistego (RTC)
PCF8583 zawieraj¹cy w†swojej struktu-
rze 240 bajtÛw pamiÍci RAM do wy-
korzystania przez uøytkownika.
W†uk³adzie pokazanym na rys. 4†wy-
korzystano prosty prze³¹cznik diodowy.
Po zaniku g³Ûwnego napiÍcia zasilaj¹-
cego +5 V, samoczynnie za³¹cza on
zasilanie PCF8583 z†baterii litowej 3†V.
A†co w†takiej sytuacji z†zasilaniem
mikrokontrolera? Jeúli zewnÍtrzna pa-
miÍÊ RAM jest jedynie pamiÍci¹ na-
staw, moøna od³¹czyÊ zasilanie awa-
ryjne od mikrokontrolera. Jednak
w†przypadku, gdy zawiera rÛwnieø
zmienne, naleøy wyposaøyÊ mikrokon-
troler w†wejúcie pomiarowe i†wykonaÊ
pewien fragment programu w†celu za-
pamiÍtania zmiennych, po zaniku
g³Ûwnego napiÍcia zasilaj¹cego. Gdy
bÍdzie on sygnalizowany wystarczaj¹-
co szybko a†w†obwodzie zasilania mik-
rokontrolera umieúcimy kondensator
elektrolityczny o†duøej pojemnoúci, nie
jest konieczne doprowadzanie awaryj-
nego napiÍcia zasilania. Mikrokontro-
ler ìzd¹øyî przes³aÊ zmienne. Oczy-
wiúcie nic nie stoi na przeszkodzie
a†nawet jest to rozwi¹zanie bezpiecz-
niejsze, aby mikrokontroler by³ pod³¹-
czony do zasilania awaryjnego wspÛl-
nie z†uk³adem pamiÍci. Moøe on np.
po wykonaniu procedury awaryjnej
przechodziÊ do trybu wy³¹czenia - PO-
WER DOWN lub oszczÍdnego - IDLE
w†celu wyd³uøenia øywotnoúci baterii.
Rozwi¹zania z†zastosowaniem pa-
miÍci zewnÍtrznych SRAM moøna
mnoøyÊ w†nieskoÒczonoúÊ. CzÍsto do
zasilania zamiast baterii stosuje siÍ
akumulator wyposaøony w†uk³ad ³ado-
wania. Moøna uøywaÊ pamiÍci rÛwno-
leg³ych lub szeregowych. Moøna sto-
sowaÊ uk³ady pamiÍci wykonane
w†technologiach Flash i†EEPROM. Wy-
daj¹ siÍ bardzo dobr¹ alternatyw¹
w†porÛwnaniu z†wszelkimi odmianami
RAM. Nie wymagaj¹ bowiem uøycia
øadnych dodatkowych ürÛde³ zasilania.
Ponadto oferta handlowa zwi¹zana
zw³aszcza z†pamiÍciami Flash jest bar-
dzo szeroka. SpotkaÊ moøna pamiÍci
wykonane przy uøyciu rÛønych tech-
nologii o†pojemnoúciach od kilkuset
bitÛw do 2 a†nawet i†wiÍcej Mb. Dla
przeciÍtnych zastosowaÒ czÍsto wystar-
czaj¹c¹ jest pamiÍÊ EEPROM wbudo-
wana w†strukturÍ mikrokontrolera. Ich
wad¹ w†porÛwnaniu z†RAM jest d³ugi
czas konieczny na zapamiÍtanie da-
nych.
Jacek Bogusz, AVT
jacek.bogusz@ep.com.pl
zasilaj¹cej, to bywa z†tym rÛønie
w†przypadku rÛønych mikrokontrolerÛw
od rÛønych producentÛw.
Innym zagadnieniem jest w³aúciwa
inicjalizacja zmiennych znajduj¹cych
siÍ w†pamiÍci RAM. Naleøy bardzo
uwaøaÊ na wszelkiego rodzaju polece-
nia testuj¹ce stan RAM. CzÍsto dzia-
³aj¹ one w†taki sposÛb, øe zapisuj¹ do
i†odczytuj¹ z†pamiÍci pewn¹ wartoúÊ.
Dobrze jest w†pamiÍci mikrokontrolera
wydzieliÊ dla tego celu pewien obszar
a†zawarte w†nim dane opatrzyÊ dodat-
kowo sum¹ kontroln¹.
Inn¹ moøliwoúÊ tworzy dodanie ze-
wnÍtrznej pamiÍci CMOS RAM. Najle-
piej, gdy jest to pamiÍÊ z†interfejsem
szeregowym SPI lub I2C. WÛwczas ca-
³y ciÍøar zwi¹zany z†obs³ug¹ jej spo-
czywa na oprogramowaniu. Nie jest
konieczne projektowanie i†budowa
skomplikowanych dekoderÛw adresu.
Jednak w†przypadku uøycia pamiÍci
zewnÍtrznej, naleøy dobrze przemyúleÊ
zarÛwno budowÍ sprzÍtow¹ jak i†spo-
sÛb funkcjonowania programu. O†ile
bowiem w†przypadku uøycia wewnÍt-
rznego RAM mikrokontrolera do jego
List. 4. Funkcje zapisu i odczytu pamięci EEPROM w języku AVR asembler
wraz z przykładami ich użycia
.def eedata = r23 ;bajt do zapisu w eeprom
.def eeaddr = r24 ;adres zapisu bajtu
;---------------------------------------
;obsługa pamięci eeprom
;---------------------------------------
;zapis bajtu do EEPROM
;adres bajtu w eeaddr, bajt w eedata
ee_write: sbic eecr,EEWE
;czekaj na EEWE = 0
rjmp ee_write
out eear,eeaddr
;podaj adres danych w eeprom
out eedr,eedata
;zapisz dane
sbi eecr,EEMWE
;ustaw bit „master ee write enable”
nop
sbi eecr,EEWE
;ustaw bit „ee write enable”
ret
;odczyt bajtu z EEPROM
;adres bajtu w eeaddr, bajt zwracany w eedata
ee_read: sbic eecr,EEWE
;czekaj na EEWE = 0
rjmp ee_read
out eear,eeaddr
sbi eecr,EERE
;ustaw bit „ee read enable”
in eedata,eedr
;czytaj dane
ret
;zapis danych z bufora w pamięci RAM do EEPROM
;spodziewane: adres danych w eeaddr, koniec oznaczony jako EOD
ee_write_buf: ldi yl,LOW(buffer)
clr yh
ee_write_loop: ld eedata,y
;if (eedata != EOD) goto ee_write_next
brne ee_write_next
rcall ee_write
;zapisz EOD do eeprom
ret
ee_write_next: rcall ee_write ;zapisz bajt do eeprom
inc eeaddr
inc yl
;eeadr = eeaddr+1
rjmp ee_write_loop
;goto ee_write_loop
;odczyt danych z EEPROM do bufora w pamięci RAM
;adres danych w eeaddr, koniec oznaczony jako EOD,
;adres miejsca,do którego przesyłane są dane w rej.Y
ee_read2buf: rcall ee_read
cpi eedata,EOD
;if (eedata != EOD) goto ee_read_next
brne ee_read_next
st y,eedata
;(Y) += EOD
ret
ee_read_next: st y,eedata
inc yl
;Y += 1
inc eeaddr
;eeadr += 1
rjmp ee_read2buf
ret
Elektronika Praktyczna 10/2003
87
;podaj adres w eeprom
cpi eedata,EOD
;sbuf = (Y)
;Y = Y + 1
32651538.007.png 32651538.008.png 32651538.009.png 32651538.010.png
Zgłoś jeśli naruszono regulamin