Práce s paměti EEPROM

Procesor PIC16F84 obsahuje interní paměť EEPROM, která umožňuje uchování dat i po vypnutí napájení procesoru. K této paměti nelze přistupovat přímo jako k běžné paměti. Pro přístup k EEPROM jsou určeny dva základní registry - registr adresy EEADR paměti a registr dat EEDATA. K nim přibývají dva řídicí registry EECON1 a EECON2.

Čtení dat z EEPROM

Při operaci čtení je potřeba nejdříve do registru EEADR uložit požadovanou adresu. Nastavením bitu RD registru EECON1 se zahájí čtení bajtu z paměti EEPROM. Načtený bajt je k dispozici v registru EEDATA v dalším strojovém cyklu, odkud může být přečten.

	MOVWF	eeadr		;v EEPROM nastavena adresa podle registru W
	BSF	rp0		;prepnuti na banku 1
	BSF	ee_rd		;spusteni cteni z EEPROM
	BCF	rp0		;prepnuti na banku 0
	MOVF	eedata,w	;nactene data z EEPROM do registru W
	

Zápis dat do EEPROM

Zápis do EEPROM je chráněn proti náhodnému přepisu několika stupni ochran. Nejdříve se do registrů EEADR a EEDATA uloží adresa a data k zápisu. Následující sekvence musí být provedena přesně, proto je nutné zakázat všechna přerušení. Nastavením bitu WREN registru EECON1 se povolí zápis do EEPROM. Do registru EECON2 se postupně uloží hodnoty 0x55h a 0xAAh. Následně se nastaví bit WR registru EECON1 a tím se zahájí zápis do EEPROM. Zápis trvá několik milisekund. Jeho dokončení je možné sledovat buď testováním bitu WR registru EECON1 nebo vyvoláním přerušení. Nakonec se opět zakáže zápis do EEPROM nastavením bitu WREN.



	MOVWF	eeadr		;v EEPROM nastavena adresa podle registru W
	BSF	rp0		;prepnuti na banku 1	
	BSF	ee_wren		;povolit zapis do EEPROM

	MOVLW	0x55		;povolovaci sekvence
	MOVWF	eecon2
	MOVLW	0xAA
	MOVWF	eecon2
	BSF	ee_wr		;spustit zapis

zapsano	BTFSC	ee_wr		;pockat na konec zapisu
	GOTO	zapsano		;zapis probehl
	BCF	ee_wren		;zakazat zapis do EEPROM
	BCF	rp0		;prepnuti na banku 0


Ukázkový program práce s paměti EEPROM

Zdrojový kód v asm
Soubor HEX pro programátor
Projekt do programu MPLAB

;*******************************************************************
;prace s EEPROM
;stisk tlacitek delsi nez 1s se zapise do EEPROM
;*******************************************************************
;*******************************************************************
w	equ	0		;parametr instrukci
f	equ	1		;parametr instrukci
c	equ	0		;bit registru SWR
f0	equ	0x00		;registr neprimeho adresovani
swr	equ	0x03		;adresa SWR registru
fsr	equ	0x04		;registr adresy neprimeho adresovani
porta	equ	0x05		;adresa brany A
trisa	equ	0x85		;pouzijeme neprime adresovani
portb	equ	0x06		;adresa brany B
trisb	equ	0x86		;pouzijeme neprime adresovani
cnt1	equ	0x0C		;definice registru cnt1
cnt2	equ	0x0D		;definice registru cnt2
cnt3	equ	0x0E		;definice registru cnt3
temp1	equ	0x0F		;definice registru temp1
eedata	equ	0x08		;data v EEPROM
eeadr	equ	0x09		;adresa v EEPROM
eecon1	equ	0x08		;ovladani EEPROM banka 1
eecon2	equ	0x09		;ridici registr pro zapis do EEPROM banka 1
;*******************************************************************
#define	bit_z	swr,2		;priznak nuloveho vysledku operace
#define rp0	swr,5		;rp0 prepina banky registru
#define	ee_rd	eecon1,0	;cteni z EEPROM
#define	ee_wr	eecon1,1	;zapis do EEPROM
#define	ee_wren	eecon1,2	;bit povolujici zapis do EEPROM
;*******************************************************************
	list 	p = 16F84
	__config 0x3FF1		;nastaveni konfigurace
;*******************************************************************
	org	0x0000		;adresa zacatku programu
	GOTO	main		;skoci na zacatek hlavniho programu
;*******************************************************************
;cekaci smycka

cekat	MOVWF	cnt3		;naplneni registru 3.smycky z regisru W
cekej_a	MOVLW	d'50'		;naplneni registru W
	MOVWF	cnt2		;naplneni registru 2.smycky
cekej_b	MOVLW	d'50'		;naplneni registru W
	MOVWF	cnt1		;naplneni registru 1.smycky
cekej_c	DECFSZ	cnt1,f		;odecte od registru 1.smycky 1
	GOTO	cekej_c		;skoci, je-li registr roven 0
	DECFSZ	cnt2,f		;odecte od registru 2.smycky 1
	GOTO	cekej_b		;skoci, je-li registr roven 0
	DECFSZ	cnt3,f		;odecte od registru 3.smycky 1
	GOTO	cekej_a		;skoci, je-li registr roven 0

	RETURN			;navrat do hlavniho programu

;*******************************************************************
;prepnuti portu na cteni tlacitek

cteni	MOVLW	trisa		;naplneni registru W
	MOVWF	fsr		;presun do registru FSR - neprima adresa
	MOVLW	B'11111111'	;naplneni registru W - vsechny piny jako vstupy
	MOVWF	f0		;presun do registru neprimeho adresovani
	MOVLW	trisb		;naplneni registru W
	MOVWF	fsr		;presun do registru FSR - neprima adresa
	MOVLW	B'11111111'	;naplneni registru W - vsechny piny jako vstupy
	MOVWF	f0		;presun do registru neprimeho adresovani

	RETURN			;navrat

;*******************************************************************
;prepnuti portu na vystup, aktivni rada LED
	
zapis	MOVLW	trisa		;naplneni registru W				
	MOVWF	fsr		;presun do registru FSR - neprima adresa
	MOVLW	B'11111011'	;naplneni registru W - rada LED jako vystup
	MOVWF	f0		;presun do registru neprimeho adresovani
	MOVLW	B'11111011'	;naplneni registru - aktivni rada LED
	MOVWF	porta		;presun do portu A
	MOVLW	trisb		;naplneni registru W
	MOVWF	fsr		;presun do registru FSR - neprima adresa
	MOVLW	B'00000000'	;port b jako vystupy
	MOVWF	f0		;presun do registru neprimeho adresovani

	RETURN			;navrat

;*******************************************************************
;hlavni program

main	CALL	cteni		;prepnuti portu na cteni tlacitek
	MOVF	portb,w		;nacteni negovaneho stavu portu B
	MOVWF	temp1		;hodnota z W do registru temp1
	BCF	bit_z		;vynulovani priznaku nuloveho vysledku
	COMF	temp1,f		;uschovani negovaneho stavu portu B do registru temp1
	BTFSC	bit_z		;je bit z = 0  , bylo stisknuto tlacitko ?
	GOTO	eecteni		;ne , skok na cteni EEPROM a zobrazeni

	CLRF	eeadr		;v EEPROM nastavena adresa 0
smycka	MOVF	portb,w		;nacteni negovaneho stavu portu B
	MOVWF	temp1		;hodnota z W do registru temp1
	BCF	bit_z		;vynulovani priznaku nuloveho vysledku
	COMF	temp1,f		;uschovani negovaneho stavu portu B do registru temp1
	BTFSC	bit_z		;je bit z = 0  , bylo stisknuto tlacitko ?
	GOTO	smycka		;ne , skok na cteni EEPROM a zobrazeni

	MOVF	portb,w		;stav portu B do registru W
	MOVWF	temp1		;hodnota z W do registru temp1
	CALL	zapis		;prepnuti portu na vystup, aktivni rada LED
	MOVF	temp1,w		;hodnota z W do registru temp1
	MOVWF	portb		;nastaveni hodnoty portu B
	MOVLW 	0x1F		;delka cekaci smycky do W
	CALL 	cekat		;cekaci smycka, hodnota v registru W
	CALL	cteni		;prepnuti portu na cteni tlacitek
	MOVF	portb,w		;stav portu B do registru W
	BCF	bit_z		;vynulovani priznaku nuloveho vysledku
	SUBWF	temp1,f		;odecteni W od temp1, pokud jsou stejne je vysledek 0
	BTFSS	bit_z		;je bit z = 1  , stale stejne tlacitka stisknute ?
	GOTO	smycka		;ne , skok na zacatek smycky
	MOVWF	eedata		;ano, pokracovat v zapisu
		
	BSF	rp0		;prepnuti na banku 1	
	BSF	ee_wren		;povolit zapis do EEPROM

	MOVLW	0x55		;povolovaci sekvence
	MOVWF	eecon2
	MOVLW	0xAA
	MOVWF	eecon2
	BSF	ee_wr		;spustit zapis

zapsano	BTFSC	ee_wr		;pockat na konec zapisu
	GOTO	zapsano		;zapis probehl
	BCF	ee_wren		;zakazat zapis do EEPROM
	BCF	rp0		;prepnuti na banku 0
	BTFSC	eeadr,3		;je nastaven bit 3 registru EEADR
	GOTO	konec		;ano, zapsano 8 bajtu
	INCF	eeadr,f		;ne, zvysit o 1 a zpet na zacatek smycky

potvrz	CALL	zapis		;prepnuti portu na vystup, aktivni rada LED
	CLRF	portb		;vynulovani portu B - LED sviti
	MOVLW	0x0F		;delka cekaci smycky do W
	CALL	cekat		;cekaci smycka, hodnota v registru W
	CALL	cteni		;prepnuti portu na cteni tlacitek
	MOVF	portb,w		;nacteni negovaneho stavu portu B
	MOVWF	temp1		;hodnota z W do registru temp1
	BCF	bit_z		;vynulovani priznaku nuloveho vysledku
	COMF	temp1,f		;uschovani stavu portu B do registru temp1
	BTFSC	bit_z		;je bit z = 0  , bylo stisknuto tlacitko ?
	GOTO	smycka		;ne , skok na dalsi zapis
	GOTO	potvrz		;ano, tlacitko je stale stisknute

konec	CALL	zapis		;prepnuti portu na vystup, aktivni rada LED
blik	CLRF	portb		;vynulovani portu B - LED sviti
	MOVLW	0x05		;delka cekaci smycky do W
	CALL	cekat		;cekaci smycka, hodnota v registru W
	MOVLW	0xFF		;nastaveni vsech bitu brany B - LED nesviti
	MOVWF	portb		;nastaveni hodnoty portu B
	MOVLW	0x05		;delka cekaci smycky do W
	CALL	cekat		;cekaci smycka, hodnota v registru W
	GOTO	blik		;zpet na smycku blikat

;**********************************************************************
;cteni EEPROM

eecteni	CALL	zapis		;prepnuti portu na vystup, aktivni rada LED
znova	CLRF	eeadr		;v EEPROM nastavena adresa 0
dalsi	BSF	rp0		;prepnuti na banku 1
	BSF	ee_rd		;spusteni cteni z EEPROM
	BCF	rp0		;prepnuti na banku 0
	MOVF	eedata,w	;nactene data z EEPROM do registru W
	MOVWF	portb		;nastaveni hodnoty portu B
	MOVLW	0x1F		;delka cekaci smycky do W
	CALL	cekat		;cekaci smycka, hodnota v registru W
	BTFSC	eeadr,3		;je nastaven bit 3 registru EEADR
	GOTO	znova		;ano, precteno 8 bajtu
	INCF	eeadr,f		;ne, zvysit o 1 a zpet na adresu v EEPROM
	GOTO 	dalsi		;skok na zacatek smycky
	end