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.
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 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
;******************************************************************* ;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