;***************************************************************************************************
;***                                         EEPROM mini driver                                  ***
;***             Ovládač pre čítanie a zápis do EEPROM pamete mikrokontroléra  (256 Byte)        ***
;***                                            c.Niki 5/2016                                    ***
;***************************************************************************************************

;***************************************************************************************************
;Čítanie z EEPROM:                                                              
;Adresa v EEADR, volať RD_EEPROM, data sú vrátené v registri EEDATA a vo W.     
;***************************************************************************************************
;Príkazy:
; RD_EEPROM - prečíta jeden byte z pamäti EEPROM, z adresy EE_ADR, EE_ADRH data vráti v EEDATA a vo W.
; WR_EEPROM - zapíše jeden byte do pamäti EEPROM, byte z W na adresu EE_ADDR.
;***************************************************************************************************
 
  EE_ADR     equ    2Fh ;Tieňový register aby sa nemuseli stále prepínat banky pri nastavovaní.
 
 org h'300'     ;<-- Nastaviť pred kompiláciou, umiesniť do hornej pamete programu. 
              
;Čítanie z EEPROM pameti, adresa v EEADR, EEADRH a data sa vratia v EEDATA a vo W
RD_EEPROM       CLRWDT
                MOVF     EE_ADR,W       ;prenos adresy do registra adresy v inej banke RAM.
                BANKSEL  EEADR
                MOVWF    EEADR
                CLRF     EEADRH         ;horný byte adresy nulujeme, pretože EEPROM má iba 256 byte.
                BANKSEL  EECON1         
                BCF      EECON1,EEPGD   ;prepni na čítanie z EEPROM
                BSF      EECON1,RD      ;spusť čítanie
                BANKSEL  EEDATA         ;prepni banku na EEDATA
                MOVF     EEDATA,W       ; W = EEDATA
                BANKSEL  PORTA
                INCF     EE_ADR,F       ;Inkrementuj adresu
                RETURN                  ;koniec

;Zapíše jeden byte do pamäti EEPROM, byte z W zapíše na adresu EE_ADDR.(doba zápisu asi 4mS)
WR_EEPROM       CLRWDT
                BANKSEL  EEDATA
                MOVWF    EEDATA         ;data z WREG do EEDATA
                BANKSEL  EE_ADR         ;Prenos adresy do pracovných registrov v horných bankách.
                MOVF     EE_ADR,W
                BANKSEL  EEADR
                MOVWF    EEADR
                CLRF     EEADRH
             
                BANKSEL  EECON1        ;výber banky  EECON1
                BCF      EECON1, EEPGD ;Ukazateľ na datovú pamäť 
                BSF      EECON1, WREN  ;Povoľ zápis
                BCF      INTCON, GIE   ;Zákaz prerušení
                MOVLW    55h           ;Odomykacia sekvencia
                MOVWF    EECON2        
                MOVLW    H'AA'  
                MOVWF    EECON2        
                BSF      EECON1, WR    ;spusť zápis 
                CLRWDT
                BTFSC    EECON1, WR    ;čakaj na ukončenie zápisu
                GOTO     $-2           
                BSF      INTCON, GIE   ;Povoľ prerušenie
                BCF      EECON1, WREN  ;zakáž zápis
                banksel  EE_ADR
                INCF     EE_ADR,F      ;Inkrementuj adresu
                RETURN

