This procedure is taken from the PIC16/17 Microcontroller
Data Book:
BSF      STATUS, RP0         ; BANK 1
BCF       INTCON, GIE        ; DISABLE INTS
BCF       EECON1, WREN     ;ENABLE WRITE
MOVLW         055H              ;                                ---
MOVWF   EECON2              ;                                   l
MOVLW         0AAH             ;                                   l -- this is obligatorie
MOVWF   EECON2              ;WRITE AAH               l
BSF          EECON1,WR        ;SET WR BIT              l
                                            ; BEGIN WRITE      --
BSF      INTCON, GIE         ; ENABLE INTS

----------
> From: erik <erik@DIGITS.DEMON.CO.UK>
> To: PICLIST@MITVMA.MIT.EDU
> Subject: problems writing to EEPROM data area 16C84
> Date: Domingo 2 de Noviembre de 1997 06:41 AM
>
> Hi,
>
> I'm not having any luck with my attempts to write to the EEPROM data area
> of my 16C84. Can anyone suggest where I'm going wrong...please.
>
> I'm using the MPASM assembler and I get the following error message
> when I try and use the Option, and EECON registers (repeats for every mention
> of these registers)
>
> Warning EEDATA.ASM 77 : Argument out of range: EECON1 (0088).
>                         Least significant bits used.
> Warning EEDATA.ASM 79 : Argument out of range: EECON2 (0089).
>                         Least significant bits used.
> Warning EEDATA.ASM 266 : Argument out of range: OPTION (0081).
>                         Least significant bits used.
>
>
> Heres the relevant section of my code:
>
> ; Target Chip           PIC16C84
> ; DATE                  27/10/1997
> ; ITERATION             1..0
> ; FILE SAVED AS         eedata.asm
> ; CLOCK                 Xtal 32.768KHz (4x30.5uS = 120uS  cycle)
> ; DESCRIPTION           expt with data EEPROM
> ;****************************************************************
> List P=16C84
>
> INTCON  EQU     00BH
> GIE     EQU     7       ;part of intcon regr Global Interrupt Enable
> EEIE    EQU     6       ;part of intcon regr
> TOIE    EQU     5       ;part of intcon regr Timer0 Int Enable
> INTE    EQU     4       ;part of intcon regr
> RBIE    EQU     3       ;part of intcon regr
> TOIF    EQU     2       ;part of intcon regr Timer0 Flag
> INTF    EQU     1       ;part of intcon regr
> RBIF    EQU     0       ;part of intcon regr
> STATUS  EQU     003H
> RP0     EQU     5       ;part of status regr Register bank select bit
> OPTION  EQU     081H
> TEMP    EQU     010H    ;storing a counter here
> W       EQU     0       ; pointer TO W REGISTER
> tempa   EQU     011H
> EECON1  EQU     088H
> EEIF    EQU     004H    ;4 bit of EECON1
> WRERR   EQU     003H    ;3 bit of EECON1
> WREN    EQU     002H    ;2 bit of EECON1
> WR      EQU     001H    ;1 bit of EECON1
> RD      EQU     000H    ;0 bit of EECON1
> EECON2  EQU     089H
> EEDATA  EQU     008H
> EEADR   EQU     009H
>
>
> ; origin vector
>         ORG     00H
>         GOTO    INIT
> ;****** interrupt vector ****************************
>         ORG     04H
>         GOTO    LOOP
>
> ; subroutine declarations
>
> ; write to EEPROM data section, enter with addr to write to in EEADR
> ; and data to be written in EEDATA. Interrupts must be disabled
> ; before writing
> EEWR
>         BCF     INTCON,GIE      ;ensure interrupts disabled
>         BSF     STATUS,RP0      ;bank 1
>         BSF     EECON1,WREN     ;enable a write
>         MOVLW   055H            ;required sequence
>         MOVWF   EECON2   &nbsp;      ;required sequence
>         MOVLW   0AAH            ;required sequence
>         MOVWF   EECON2          ;required sequence
>         BSF     EECON1,WR       ;required sequence, begin write
> WAYT    NOP
>         BTFSC   EECON1,WR       ;see if write is finished
>         GOTO    WAYT            ;wait until it is
>         BCF     STATUS,RP0      ;bank0
>         RETURN
>
> ; read data from EEPROM data section, enter with addr to read in EEADR
> ; exit with data that has been read in EEDATA
> EERD
>         BSF     STATUS,RP0      ;bank 1
>         BSF     EECON1,RD
> HOLT    BTFSC   EECON1,RD
>         GOTO    HOLT            ;wait for read to complete
>         BCF     STATUS,RP0      ;bank0
>         RETURN
>
> ; ********** main program starts here ******************************
> INIT
>         CLRW
>         MOVWF   TEMP
>         MOVWF   EEDATA
>         MOVWF   EEADR
>
>         BSF     STATUS,RP0      ;5 bank 1
>         BCF     OPTION,TOCS     ;5
>         BCF     OPTION,PSA      ;3 assign prescaler to timer
>         BCF     OPTION,PS2      ;2
>         BCF     OPTION,PS1      ;1
>         BCF     OPTION,PS0      ;0
>         BCF     STATUS,RP0      ;5 bank 0 again
>
>         BCF     INTCON,TOIE     ;5 1=enable
>         BCF     INTCON,EEIE     ;6 0=disable
>         BCF     INTCON,INTE     ;4 0=disable
>         BCF     INTCON,RBIE     ;3 0=disable
>         BCF     INTCON,GIE      ;7 1=enable unmasked interrupts
>
> LOOP
>         INCF    TEMP
> ; write, then read something to/from EEPROM data section
>         movfw   TEMP
>         movwf   EEDATA  ;write data thats same as value in TEMP
>         ANDLW   03FH    ;0011 1111 clear top bits
>         movwf   EEADR
>         call    EEWR    ;to addr thats same as value in TEMP
>
>         clrf    EEDATA  ;clear it to see if its really read
>
>         call    EERD    ;read into EEDATA
>
>
> ; display the results here...
>
>         GOTO    LOOP
>
> ; reset vector
>         ORG     01FFH
>         GOTO    INIT
>         END
> ; *************************************************************
>
> Really grateful for any suggestions.
>
> Cheers
> --
> erik