Está en la página 1de 46

MICROCONTROLADORES

M.Sc. César Augusto Peña C.

Profesor de planta – Ingeniería mecatrónica


Universidad de Pamplona
MEMORIA EEPROM
El PIC 16F877A tiene 256 x 8 Bits destinados
para almacenar datos NO VOLATILES. El PIC
16F84 tiene 64 x 8.

En otras palabras si se apaga el PIC y se vuelve a


prender, este conserva estos valores.

Principales registros asociados:


EECON1, EECON2, EEDATA, EEADR
REGISTRO EECON1
EEPGD - - - WRERR WREN WR RD

EEPGD: Bit de selección de memorias


1 – Selecciona memoria FLASH
0 – Selecciona memoria EEPROM

WRERR: Bandera de error en la escritura de la memoria


1 – El proceso de escritura ha terminado prematuramente (reset,
WDT)
0 – La escritura se ha realizado con éxito

WREN: Bit de habilitación de la escritura en la EEPROM


1 – Permite los ciclos de escritura
0 – inhabilita la escritura en la EEPROM
REGISTRO EECON1
EEPGD - - - WRERR WREN WR RD

WR: Bit de control de escritura


1 – Inicia Escritura
0 – Se pone automaticamente en 0 al finalizar la escritura

RD: Bit de control de lectura


1 – Inicia Lectura
0 – No Inicia Lectura
REGISTROS EECON2, EEADR y
EEDATA
El registro EECON2 no se encuentra implementado
físicamente y se utiliza únicamente para la operación de
escritura.

Antes de iniciar la escritura se debe cargar el valor 55h en


este registro y posteriormente el AAh.

La dirección de la memoria a escribir o leer se carga en el


registro EEADR mientras que el valor a escribir o el leído
esta en el registro EEDATA.
PASOS PARA LA LECTURA DE
LA EEPROM
• Se carga el valor de la dirección de memoria EEPROM a grabar
en el registro EEADR

• Se pone el bit EEPGD (EECON1) en 0 para seleccionar la


memoria EEPROM

• Se pone el bit RD (EECON1) en 1 para dar la orden de lectura

• Leer el dato de la EEPROM que se cargo en el registro EEDATA


PASOS PARA LA ESCRITURA DE
LA EEPROM
EN CASO DE NO USAR INTERRUPCIONES OMITIR LAS
INSTRUCCIONES EN ROJO

• Baja la bandera de interrupción por escritura de la EEPROM


(PIR2,EEIF)

• Habilita la interrupción por escritura de la EEPROM (PIE2,EEIE)

• Activa interrupción de periféricos

• Activa el permiso global de interrupciones

• Se carga el valor de la dirección de memoria EEPROM a grabar


en el registro EEADR

• Carga el dato a escribir en EEDATA


PASOS PARA LA ESCRITURA DE
LA EEPROM
• Se pone el bit EEPGD (EECON1) en 0 para seleccionar la
memoria EEPROM

• Se pone el bit WREN (EECON1) en 1 para habilitar escritura

• Carga el valor 55h en EECON2

• Carga el valor AAh en EECON2

• Se pone el bit WR (EECON1) en 1 para iniciar escritura

• Dormir el PIC (Sleep)

• Esperara a que ocurra la interrupción por final de escritura EEPROM


o esperar a que la bandera de PIR2<EEIF> se ponga en 1.
(ESCRITURA FINALIZADA)
PASOS PARA LA ESCRITURA DE
LA EEPROM
• Bajar la bandera de PIR2<EEIF>

•Deshabilita la interrupción por escritura de la EEPROM


(PIE2,EEIE)

• Desactiva interrupción de periféricos

• Desactiva el permiso global de interrupciones

•Se pone el bit WREN (EECON1) en 0 para inhabilitar escritura


EEPROM_16F877_CAPC_SI.LIB
;------------------------------------------------------------------------
;LIBRERIAS DE RUTINAS CREADAS O MODIFICADAS POR CÉSAR PEÑA
;TEMA: Escritura y Lectura de EEPROM SIN usar la interrupcion por escritura de EEPROM
;NOTA: No olvidar declarar las variables:
; DATO_ESCRI, DIR_EEPROM, DATO_LEIDO ;VARIABLES PARA LA EEPROM
;------------------------------------------------------------------------

ESCRI_MEM_F877
MOVF DIR_EEPROM,w ; Registro auxiliar para la direccion de EEPROM
MOVWF DATA_EE_ADDR ;
BCF PIR2, EEIF ; Baja la bandera de interrupción
BSF STATUS, RP0 ; Banco 1
BSF PIE2, EEIE ; Habilita la interrupción por EEPROM
BCF STATUS, RP0 ; regresa al Banco 0
BCF INTCON,PEIE ; DESActiva interrupciones de
perifericos
BCF INTCON,GIE ; DESActiva interrupciones
MOVF DATO_ESCRI,W ; Registro auxiliar DATO a ESCRIBIR
MOVWF DATA_EE_DATA
CALL ESCRITURA_EEPROM
BSF STATUS,RP0 ; Banco1
BCF PIE2,EEIE ; Habiliar Interrupción por EEPROM
BCF STATUS,RP0 ; Banco0
RETURN
EEPROM_16F877_CAPC_SI.LIB
ESCRITURA_EEPROM

BSF STATUS,RP1 ;
BCF STATUS,RP0 ; Banco 2
MOVF DATA_EE_ADDR,W ;
MOVWF EEADR ; Direccion de memoria de datos a escribir
MOVF DATA_EE_DATA,W ;
MOVWF EEDATA ; Valor de memoria de datos a escribir
BSF STATUS, RP0 ; Banco 3
BCF EECON1, EEPGD ; Selecciona memoria EEPROM
BSF EECON1, WREN ; Activa permiso de escritura
MOVLW 0x55 ; SECUENCIA REQUERIDA POR EL FABRICANTE
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1, WR ; Activa el bit WR para comenzar a escribir
EEPROM_16F877_CAPC_SI.LIB
ESPERA_ESCRITURA_EEPROM
BCF STATUS, RP1 ;
BCF STATUS, RP0 ; Banco 0
BTFSS PIR2,EEIF ; Espera hasta que termine de escribir
GOTO ESPERA_ESCRITURA_EEPROM
BCF PIR2,EEIF ;Borra la bandera de la EEPROM
BSF STATUS, RP0 ; Banco 3
BCF EECON1, WREN ; INActivar permiso de escritura
BCF STATUS, RP0 ; Banco 0
RETURN
EEPROM_16F877_CAPC_SI.LIB
LEER_MEM_F877
MOVF DIR_EEPROM,w ; Registro auxiliar para la direccion de
EEPROM
MOVWF DATA_EE_ADDR ;
BSF STATUS, RP1 ;
BCF STATUS, RP0 ; Banco 2
MOVF DATA_EE_ADDR,W ;
MOVWF EEADR ; Direccion de memoria de datos a leer
BSF STATUS, RP0 ; Banco 3
BCF EECON1, EEPGD ; Selecciona memoria EEPROM
BSF EECON1, RD ; Lee EEPROM
BCF STATUS, RP0 ; Banco 2
MOVF EEDATA, W ; W = EEDATA
BCF STATUS, RP1 ;
BCF STATUS, RP0 ; Banco 0
MOVWF DATO_LEIDO ; Mover a Registro Auxiliar
RETURN
PROGRAMA SIN USAR INTERRUPCION
; AUTOR: CÉSAR AUGUSTO PEÑA C
; PIC: 16F877A
; FUNCION: MANEJO DE LCD Y GRABACIÓN Y ESCRITURA DE LA MEMORIA EEPROM
; EL PIC ES CAPAZ DE DETECTAR LA PRIMERA VEZ QUE SE PRENDE MANEJANDO LA VARIABLE
; 0x0F, UNA VEZ PRENDIDO ALMACENA EN UNA SEGUNDA VARIABLE EL NÚMERO DE VECES QUE
; SE PRENDE EL PIC Y MUESTRA ESTE NÚMEREO EN EL LCD.
; SI SE APAGA EL PIC POR OCTAVA VEZ ESTE VUELVE A MOSTRAR EL NUMERO 1 EN EL LCD

; CARACTERISTICAS:
; OSCILLATOR: XT
; WATCHDOG TIMER: OFF
; POWER UP TIMER: ON
; BROWN OUT DETECT: OFF
; LOW VOLTAGE PROGRAM: DISABLE
; FLASH PROGRAM WRITE: WRITE PROTECTION OFF
; BACKGROUND DEBUG: DISABLED
; DATA EE READ PROTECT: OFF
; CODE PROTECT: OFF

list p=16f877a ;Tipo de procesador


INCLUDE "P16F877A.Inc" ;Librerias de registros del PIC
PROGRAMA SIN USAR INTERRUPCION
;**************************** DEFINICION DE REGISTROS ***********************************
CBLOCK .32
DATO_A, DATO_B ;VARIABLES CONTROL LCD
DATO_ESCRI, DIR_EEPROM, DATO_LEIDO ;VARIABLES PARA LA EEPROM
REG1, REG2, REG3 ;VARIABLES RETARDO
;REGISTROS BACKUP
TRISA_BK, TRISB_BK, TRISC_BK, TRISD_BK, TRISE_BK, INTCON_BK, PIE1_BK, PIE2_BK
PIR1_BK, PIR2_BK, STATUS_BK
endc
;**************************** DEFINICION DE DATOS ****************************
DATA_EE_ADDR EQU .112
DATA_EE_DATA EQU .113

;****************************************************************************************
ORG 0
goto INICIO
PROGRAMA SIN USAR INTERRUPCION
ORG 5
INICIO bcf STATUS,RP1
bsf STATUS,RP0
; movlw b'00000110' ;configura puerto A y E como E/S digitales
; movwf ADCON1 ;9f ;MUEVE A ADCON1
bcf 1,7 ;Resistencias pull up ACTIVAS
bcf TRISE,PSPMODE ;Desactiva puerto paralelo esclavo
;Afecta puerta D también
movlw b'00000010'
movwf TRISD ;puerto D como salida y el RD1 para RF
movlw b'00000011' ;Configura puerto C para verificar sensores
movwf TRISC
clrf TRISE ;puerto E como salida
bcf STATUS,RP0 ;Banco 0
bcf STATUS,RP1

call RETARDO ;Retardo Antirebotes


call GUARDAR_REGISTROS
PROGRAMA SIN USAR INTERRUPCION
;RUTINA PARA ESCRIBIR EL DATO 'A' EN LA MEMORIA EEPROM

clrf DATO_LEIDO
movlw 0x0F ;especifica direccion para leer
movwf DIR_EEPROM
call LEER_MEM_F877 ;lee memoria EEPROM de la direccion especificada
movf DATO_LEIDO,W ;Carga W con el ultimo dato leido
sublw 'A' ;Compara
btfsc STATUS,2 ;Si es diferente salta
goto SEGUNDA_O_MAS
goto PRIMERA

PRIMERA movlw 'A' ;Dato a escribir


movwf DATO_ESCRI
movlw 0x0F ;especifica direccion para leer
movwf DIR_EEPROM
call ESCRI_MEM_F877 ;Escribe memoria EEPROM segun la direccion y el
;dato especificado
PROGRAMA SIN USAR INTERRUPCION
movlw '1' ;Dato a escribir
movwf DATO_ESCRI
movlw 0x10 ;especifica direccion para leer
movwf DIR_EEPROM
call ESCRI_MEM_F877 ;Escribe memoria EEPROM segun la direccion y el
;dato especificado

CICLO call CARGAR_REGISTROS


call UP_LCD
call LCD_INI ;Inicia el m¢dulo LCD
call MENSAJE_VEZ
sleep
goto CICLO
PROGRAMA SIN USAR INTERRUPCION
SEGUNDA_O_MAS
clrf DATO_LEIDO
movlw 0x10 ;especifica direccion para leer
movwf DIR_EEPROM
call LEER_MEM_F877 ;lee memoria EEPROM de la direccion especificada
incf DATO_LEIDO,1 ;Incrementa el dato leido

movf DATO_LEIDO,0
xorlw '8'
btfsc STATUS,2 ;SI Z = 0 BRINCA
goto PRIMERA ;Z=1 Y LLAMA

movf DATO_LEIDO,0
movwf DATO_ESCRI ;carga el nuevo valor para grabar
movlw 0x10 ;especifica direccion para leer
movwf DIR_EEPROM
call ESCRI_MEM_F877 ;Escribe memoria EEPROM segun la direccion y el dato especificado

goto CICLO
PROGRAMA SIN USAR INTERRUPCION
MENSAJE_VEZ
;__________________________________________________________
call UP_LCD ;RECONFIGURA DENUEVO EL DISPLAY PARA USARLO OTRA VEZ

clrf DATO_LEIDO
movlw 0x10 ;especifica direccion para leer
movwf DIR_EEPROM
call LEER_MEM_F877 ;lee memoria EEPROM de la direccion especificada
movf DATO_LEIDO,W ;Carga W con el ultimo dato leido

call LCD_DATOS ;Visualiza Valor cargado en W


movlw '' ;2
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'V' ;3
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'E' ;4
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'Z' ;5
call LCD_DATOS ;Visualiza Valor cargado en W
RETURN
PROGRAMA SIN USAR INTERRUPCION
RETARDO movlw .1 ;Retardo de 1/8 s
movwf REG1
movlw .195
movwf REG2
movlw .212
movwf REG3
decfsz REG3
goto $-1
decfsz REG2
goto $-5
decfsz REG1
goto $-9
retlw 0

include "LCD_LIB_CAPC_877_F.lib"
include "EEPROM_16F877_CAPC_SI.lib"
include "REGISTROS_BK.lib"

END
EEPROM_16F877_CAPC_CI.LIB
;------------------------------------------------------------------------
;LIBRERIAS DE RUTINAS CREADAS O MODIFICADAS POR CÉSAR PEÑA
;TEMA: Escritura y Lectura de EEPROM Utilizando INTERRUPCION por EEPROM
;NOTA: No olvidar declarar las variables:
; DATO_ESCRI, DIR_EEPROM, DATO_LEIDO ;VARIABLES PARA LA
EEPROM
;NOTA2: No olvidar crear la rutina de interrupcion en el programa

;INT_ESCR_MEN_F
; BCF STATUS, RP1 ;
; BCF STATUS, RP0 ; Banco 0
; BTFSS PIR2,EEIF
; goto SALIR_INT
; BCF PIR2,EEIF ;Borra la bandera de la EEPROM
;
;SALIR_INT RETFIE
;------------------------------------------------------------------------
EEPROM_16F877_CAPC_CI.LIB
ESCRI_MEM_F877
MOVF DIR_EEPROM,w ; Registro auxiliar para la direccion de EEPROM
MOVWF DATA_EE_ADDR ;
BCF PIR2, EEIF ; Baja la bandera de interrupción
BSF STATUS, RP0 ; Banco 1
BSF PIE2, EEIE ; Habilita la interrupción por EEPROM
BCF STATUS, RP0 ; regresa al Banco 0
BSF INTCON,PEIE ; Activa interrupciones de perifericos
BSF INTCON,GIE ; Activa interrupciones
MOVF DATO_ESCRI,W ; Registro auxiliar DATO a ESCRIBIR
MOVWF DATA_EE_DATA
CALL ESCRITURA_EEPROM
BSF STATUS,RP0 ; Banco1
BCF PIE2,EEIE ; Habiliar Interrupción por EEPROM
BCF STATUS,RP0 ; Banco0
BCF INTCON,PEIE ; Desactiva interrupciones de perifericos
BCF INTCON,GIE ; Desactiva interrupciones
RETURN
EEPROM_16F877_CAPC_CI.LIB
ESCRITURA_EEPROM

BSF STATUS,RP1 ;
BCF STATUS,RP0 ; Banco 2
MOVF DATA_EE_ADDR,W ;
MOVWF EEADR ; Direccion de memoria de datos a escribir
MOVF DATA_EE_DATA,W ;
MOVWF EEDATA ; Valor de memoria de datos a escribir
BSF STATUS, RP0 ; Banco 3
BCF EECON1, EEPGD ; Selecciona memoria EEPROM
BSF EECON1, WREN ; Activa permiso de escritura
MOVLW 0x55 ; SECUENCIA REQUERIDA POR EL FABRICANTE
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1, WR ; Activa el bit WR para comenzar a escribir
sleep ; debe dormirlo estando en el banco 3
BSF STATUS, RP0 ; Banco 3
BCF EECON1, WREN ; INActivar permiso de escritura
BCF STATUS, RP0 ; Banco 0
RETURN
EEPROM_16F877_CAPC_CI.LIB
LEER_MEM_F877
MOVF DIR_EEPROM,w ; Registro auxiliar para la direccion de EEPROM
MOVWF DATA_EE_ADDR ;
BSF STATUS, RP1 ;
BCF STATUS, RP0 ; Banco 2
MOVF DATA_EE_ADDR,W ;
MOVWF EEADR ; Direccion de memoria de datos a leer
BSF STATUS, RP0 ; Banco 3
BCF EECON1, EEPGD ; Selecciona memoria EEPROM
BSF EECON1, RD ; Lee EEPROM
BCF STATUS, RP0 ; Banco 2
MOVF EEDATA, W ; W = EEDATA
BCF STATUS, RP1 ;
BCF STATUS, RP0 ; Banco 0
MOVWF DATO_LEIDO ; Mover a Registro Auxiliar
RETURN
PROGRAMA USANDO INTERRUPCION
; AUTOR: CÉSAR AUGUSTO PEÑA C
; PIC: 16F877A
; FUNCION: MANEJO DE LCD Y GRABACIÓN Y ESCRITURA DE LA MEMORIA EEPROM
; EL PIC ES CAPAZ DE DETECTAR LA PRIMERA VEZ QUE SE PRENDE MANEJANDO LA VARIABLE
; 0x0F, UNA VEZ PRENDIDO ALMACENA EN UNA SEGUNDA VARIABLE EL NÚMERO DE VECES QUE
; SE PRENDE EL PIC Y MUESTRA ESTE NÚMEREO EN EL LCD.
; SI SE APAGA EL PIC POR OCTAVA VEZ ESTE VUELVE A MOSTRAR EL NUMERO 1 EN EL LCD

; CARACTERISTICAS:
; OSCILLATOR: XT
; WATCHDOG TIMER: OFF
; POWER UP TIMER: ON
; BROWN OUT DETECT: OFF
; LOW VOLTAGE PROGRAM: DISABLE
; FLASH PROGRAM WRITE: WRITE PROTECTION OFF
; BACKGROUND DEBUG: DISABLED
; DATA EE READ PROTECT: OFF
; CODE PROTECT: OFF

list p=16f877a ;Tipo de procesador


INCLUDE "P16F877A.Inc" ;Librerias de registros del PIC
PROGRAMA USANDO INTERRUPCION
;**************************** DEFINICION DE REGISTROS ***********************************
CBLOCK .32
DATO_A, DATO_B ;VARIABLES CONTROL LCD
DATO_ESCRI, DIR_EEPROM, DATO_LEIDO ;VARIABLES PARA LA EEPROM
REG1, REG2, REG3 ;VARIABLES RETARDO
;REGISTROS BACKUP
TRISA_BK, TRISB_BK, TRISC_BK, TRISD_BK, TRISE_BK, INTCON_BK, PIE1_BK, PIE2_BK
PIR1_BK, PIR2_BK, STATUS_BK
endc
;**************************** DEFINICION DE DATOS ****************************
DATA_EE_ADDR EQU .112
DATA_EE_DATA EQU .113
;****************************************************************************************
ORG 0
goto INICIO
ORG 4
INT_ESCR_MEN_F
BCF STATUS, RP1 ;
BCF STATUS, RP0 ; Banco 0
BTFSS PIR2,EEIF
goto SALIR_INT
BCF PIR2,EEIF ;Borra la bandera de la EEPROM
SALIR_INT RETFIE
PROGRAMA USANDO INTERRUPCION
INICIO bcf STATUS,RP1
bsf STATUS,RP0
; movlw b'00000110' ;configura puerto A y E como E/S digitales
; movwf ADCON1 ;9f ;MUEVE A ADCON1
bcf 1,7 ;Resistencias pull up ACTIVAS
bcf TRISE,PSPMODE ;Desactiva puerto paralelo esclavo
;Afecta puerta D también
movlw b'00000010'
movwf TRISD ;puerto D como salida y el RD1 para RF
movlw b'00000011' ;Configura puerto C para verificar sensores
movwf TRISC
clrf TRISE ;puerto E como salida
bcf STATUS,RP0 ;Banco 0
bcf STATUS,RP1

call RETARDO ;Retardo Antirebotes


call GUARDAR_REGISTROS
PROGRAMA USANDO INTERRUPCION
;RUTINA PARA ESCRIBIR EL DATO 'A' EN LA MEMORIA EEPROM
clrf DATO_LEIDO
movlw 0x0F ;especifica direccion para leer
movwf DIR_EEPROM
call LEER_MEM_F877 ;lee memoria EEPROM de la direccion especificada
movf DATO_LEIDO,W ;Carga W con el ultimo dato leido
sublw 'A' ;Compara
btfsc STATUS,2 ;Si es diferente salta
goto SEGUNDA_O_MAS
goto PRIMERA

PRIMERA movlw 'A' ;Dato a escribir


movwf DATO_ESCRI
movlw 0x0F ;especifica direccion para leer
movwf DIR_EEPROM
call ESCRI_MEM_F877 ;Escribe memoria EEPROM segun la direccion y el dato especificado

movlw '1' ;Dato a escribir


movwf DATO_ESCRI
movlw 0x10 ;especifica direccion para leer
movwf DIR_EEPROM
call ESCRI_MEM_F877 ;Escribe memoria EEPROM segun la direccion y el dato especificado
PROGRAMA USANDO INTERRUPCION
CICLO call CARGAR_REGISTROS
call UP_LCD
call LCD_INI ;Inicia el m¢dulo LCD
call MENSAJE_VEZ
sleep
goto CICLO

SEGUNDA_O_MAS
clrf DATO_LEIDO
movlw 0x10 ;especifica direccion para leer
movwf DIR_EEPROM
call LEER_MEM_F877 ;lee memoria EEPROM de la direccion especificada
incf DATO_LEIDO,1 ;Incrementa el dato leido

movf DATO_LEIDO,0
xorlw '8'
btfsc STATUS,2 ;SI Z = 0 BRINCA
goto PRIMERA ;Z=1 Y LLAMA

movf DATO_LEIDO,0
movwf DATO_ESCRI ;carga el nuevo valor para grabar
movlw 0x10 ;especifica direccion para leer
movwf DIR_EEPROM
call ESCRI_MEM_F877 ;Escribe memoria EEPROM segun la direccion y el dato especificado

goto CICLO
PROGRAMA USANDO INTERRUPCION
MENSAJE_VEZ
;__________________________________________________________

call UP_LCD ;RECONFIGURA DENUEVO EL DISPLAY PARA USARLO OTRA VEZ

clrf DATO_LEIDO
movlw 0x10 ;especifica direccion para leer
movwf DIR_EEPROM
call LEER_MEM_F877 ;lee memoria EEPROM de la direccion especificada
movf DATO_LEIDO,W ;Carga W con el ultimo dato leido

call LCD_DATOS ;Visualiza Valor cargado en W


movlw '' ;2
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'V' ;3
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'E' ;4
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'Z' ;5
call LCD_DATOS ;Visualiza Valor cargado en W
RETURN
PROGRAMA USANDO INTERRUPCION
RETARDO movlw .1 ;Retardo de 1/8 s
movwf REG1
movlw .195
movwf REG2
movlw .212
movwf REG3
decfsz REG3
goto $-1
decfsz REG2
goto $-5
decfsz REG1
goto $-9
retlw 0

include "LCD_LIB_CAPC_877_F.lib"
include "EEPROM_16F877_CAPC_CI.lib"
include "REGISTROS_BK.lib"

END
EJEMPLO GRABADO Y
BORRADO DE EEPROM
REGISTROS_BK.LIB
;AUTOR: CÉSAR AUGUSTO PEÑA C
;PIC: 16F877A
;FUNCION: Libreria que guarda el estado de algunos registros y los restaura
;si es necesario

;NOTA: Es necesario declarar las siguientes variable


;TRISA_BK, TRISB_BK, TRISC_BK, TRISD_BK, TRISE_BK, INTCON_BK, PIE1_BK, PIE2_BK
;PIR1_BK, PIR2_BK, STATUS_BK

GUARDAR_REGISTROS

movf STATUS,w
bcf STATUS, RP1
bcf STATUS, RP0
movwf STATUS_BK

bsf STATUS, RP0


movf TRISA,w
bcf STATUS, RP0
movwf TRISA_BK

bsf STATUS, RP0


movf TRISB,w
bcf STATUS, RP0
movwf TRISB_BK
REGISTROS_BK.LIB
bsf STATUS, RP0
movf TRISC,w
bcf STATUS, RP0
movwf TRISC_BK

bsf STATUS, RP0


movf TRISD,w
bcf STATUS, RP0
movwf TRISD_BK

bsf STATUS, RP0


movf TRISE,w
bcf STATUS, RP0
movwf TRISE_BK

bsf STATUS, RP0


movf PIE1,w
bcf STATUS, RP0
movwf PIE1_BK

bsf STATUS, RP0


movf PIE2,w
bcf STATUS, RP0
movwf PIE2_BK
REGISTROS_BK.LIB
movf INTCON,w
movwf INTCON_BK

movf PIR1,w
movwf PIR1_BK

movf PIR2,w
movwf PIR2_BK

movf STATUS_BK, STATUS

RETURN

CARGAR_REGISTROS

bcf STATUS, RP1


bcf STATUS, RP0

movf TRISA_BK,w
bsf STATUS, RP0
movwf TRISA
bcf STATUS, RP0
REGISTROS_BK.LIB
movf TRISB_BK,w
bsf STATUS, RP0
movwf TRISB
bcf STATUS, RP0

movf TRISC_BK,w
bsf STATUS, RP0
movwf TRISC
bcf STATUS, RP0

movf TRISD_BK,w
bsf STATUS, RP0
movwf TRISD
bcf STATUS, RP0

movf TRISE_BK,w
bsf STATUS, RP0
movwf TRISE
bcf STATUS, RP0

movf PIE1_BK,w
bsf STATUS, RP0
movwf PIE1
bcf STATUS, RP0
REGISTROS_BK.LIB
movf PIE2_BK,w
bsf STATUS, RP0
movwf PIE2
bcf STATUS, RP0

movf INTCON_BK,w
movwf INTCON

movf PIR1_BK,w
movwf PIR1

movf PIR2_BK,w
movwf PIR2

movf STATUS_BK, STATUS

RETURN
PROGRAMA DE VARIAS PAGINAS
En el PIC16F877 se pueden escribir hasta aproximadamente 8000
líneas de programa (4 Paginas), sin embargo las instrucciones GOTO y
CALL solo pueden direccionar hasta 2000 (1 Pagina).

Por lo tanto si se desea utilizar estos comandos para llamar o ir hacia


una subrutina que se encuentre en otra pagina es necesario usar los
bits <3:4> del registro PCLATH.

Ejemplo acceder a la pagina 1 de programación desde la pagina 0

BCF PCLATH,4
BSF PCLATH,3 ;Selecciona pagina 1 PAGINA PCLATH,3 PCLATH,4º
call Subrutina
0 0 0
BCF PCLATH,3 ;Selecciona pagina 1
1 1 0
2 0 1
3 1 1
PROGRAMA DE VARIAS PAGINAS
;AUTOR: CÉSAR AUGUSTO PEÑA C
;PIC: 16F877A
;FUNCION:Visualiza un mesaje por un LCD conectado a RB<0:7> (datos) y RBD<5:7>
; donde RS, R/W y #E (LCD) se conectan respectivamente a RD5, RD6 y RD7
;utiliza la 2 página para alojar la parte de visualización de mensajes

;CARACTERISTICAS:
;OSCILLATOR: XT
;WATCHDOG TIMER: OFF
;POWER UP TIMER: ON
;BROWN OUT DETECT: OFF
;LOW VOLTAGE PROGRAM: DISABLE
;FLASH PROGRAM WRITE: WRITE PROTECTION OFF
;BACKGROUND DEBUG: DISABLED
;DATA EE READ PROTECT: OFF
;CODE PROTECT: OFF

list p=16f877a ;Tipo de procesador


INCLUDE "P16F877A.Inc" ;Librerias de registros del PIC
PROGRAMA DE VARIAS PAGINAS
CBLOCK .32
DATO_A, DATO_B ;VARIABLES CONTROL LCD
endc

INICIO bcf STATUS,RP1


bsf STATUS,RP0
; movlw b'00000110' ;configura puerto A y E como E/S digitales
; movwf ADCON1 ;9f ;MUEVE A ADCON1
bcf 1,7 ;Resistencias pull up ACTIVAS
bcf TRISE,PSPMODE ;Desactiva puerto paralelo esclavo
;Afecta puerta D también
movlw b'00000010'
movwf TRISD ;puerto D como salida y el RD1 para RF
movlw b'00000011' ;Configura puerto C para verificar sensores
movwf TRISC
clrf TRISE ;puerto E como salida
bcf STATUS,RP0 ;Banco 0
bcf STATUS,RP1
PROGRAMA DE VARIAS PAGINAS
bsf PCLATH,3 ;Cambiar de pagina
call MENSAJE_CESAR_UNIPAMPLONA
;Mensaje: "CESAR P. C." SEGUNDA LINEA "UNIPAMPLONA"
bcf PCLATH,3 ;Cambiar de pagina

CICLO nop
goto CICLO

;P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P2P
ORG d'2100' ;Pagina 2

MENSAJE_CESAR_UNIPAMPLONA
call UP_LCD_2P ;RECONFIGURA DENUEVO EL DISPLAY PARA USARLO OTRA VEZ
call LCD_INI_2P ;subrutina que inicia el modulo, apaga el cursor y borra el
display
movlw ‘U' ;1
call LCD_DATOS_2P ;Visualiza Valor cargado en W
movlw ‘P' ;2
call LCD_DATOS_2P ;Visualiza Valor cargado en W
RETURN

include "LCD_LIB_CAPC_877_F_2P.lib"

END
LIBRERÍA EN 2 PAGINA
;------------------------------------------------------------------------
;LIBRERIAS DE RUTINAS CREADAS O MODIFICADAS POR CÉSAR PEÑA
;TEMA: CONTROL LCD
;FUNCION: Controlar LCD conectado a RB<0:7> (datos) y RBD<5:7>
; donde RS, R/W y #E (LCD) se conectan respectivamente a RD5, RD6 y RD7
;------------------------------------------------------------------------

;------------------------------------------------------------------------
;UP_LCD: CONFIGURACION PIC PARA EL LCD.

UP_LCD_2P bsf STATUS,5 ;BANCO 1


bcf TRISE,PSPMODE ;DESACTIVA PUERTO PARALELO ESCLAVO
;AFECTA TAMBIEN EL PUERTO D
bcf PORTD,5 ;RD5 COMO SALIDA
bcf PORTD,6 ;RD6 COMO SALIDA
bcf PORTD,7 ;RD7 COMO SALIDA
clrf TRISB ;PUERTO B COMO SALIDA
bcf STATUS,5 ;BANCO 0
clrf INTCON ;DESACTIVA INTERRUPCIONES
bcf PORTD,5 ;RS = 0 SELECCION DE REGISTRO DE CONTROL
bcf PORTD,7 ;E = 0 LCD INABILITADO
return
LIBRERÍA EN 2 PAGINA
;LCD_INI: INICIALIZACION LCD.
;
LCD_INI_2P movlw b'00111000' ;ENVIA COMANDO FUNCTION SET
call LCD_REG_2P ;(BUS DE 8 BITS, 2 LINEAL, CARACTER 5X7)
call DELAY_5MS_2P ;5mS.(ESPECIFICACIÓN DE FABRICANTE)
movlw b'00001100' ;LCD ON, CURSOR OFF, PARPADEO CURSOR OFF
call LCD_REG_2P ;ENVIA COMANDO
call DELAY_5MS_2P ;5ms.(Especificación de Fabricante)
movlw b'00000001' ;BORRA PANTALLA
call LCD_REG_2P ;ENVIA COMANDO
call DELAY_5MS_2P ;5ms.(Especificación de Fabricante)
return
;-------------------------------------------------------------------------
;LCD_DATO: ESCRITURA DE DATOS EN DDRAM o CGRAM

LCD_DATOS_2P bcf PORTD,5 ;RS = 0 SELECCION DE REGISTRO DE CONTROL


movwf PORTB ;VALOR ASCII A SACAR POR RB
call LCD_BUSY_2P ;ESPERA A QUE SE LIBERE EL LCD
bsf PORTD,5 ;RS = 1 SELECCION DE REGISTRO DE DATOS
goto LCD_E_2P ;GENERA PULSO EN LA SEÑAL E (HABLILITACIÓN LCD)
LIBRERÍA EN 2 PAGINA
;LCD_REG: ESCRITURA DE COMANDOS LCD.
;
LCD_REG_2P bcf PORTD,5 ;RS = 0 SELECCION DE REGISTRO DE CONTROL
movwf PORTB ;SACA EL CODIGO DE LA INSTRUCCION
call LCD_BUSY_2P ;ESPERA A QUE SE LIBERE EL LCD
goto LCD_E_2P ;GENERA PULSO EN LA SEÑAL E (HABLILITACIÓN LCD)
;-------------------------------------------------------------------------
;LCD_E: PULSO DE HABILITACION
;
LCD_E_2P bsf PORTD,7 ;E = 1 LCD HABILITADO
nop ;ESPERA 1 uS
bcf PORTD,7 ;E = 0 LCD INABILITADO
return
;------------------------------------------------------------------------
;LCD_BUSY: VERIFICACION QUE EL LCD ESTE NO ESTE OCUPADO.
;
LCD_BUSY_2P bsf PORTD,6 ;R/W = 1 MODO LECTURA
bsf STATUS,5 ;BANCO 1
movlw b'11111111'
movwf TRISB ;PUERTO B COMO ENTRADA
bcf STATUS,5 ;BANCO 0
bsf PORTD,7 ;E = 1 LCD HABILITADO
nop
LIBRERÍA EN 2 PAGINA
L_BUSY_2P btfsc PORTB,7 ;CHEQUEA BIT DE BUSY
goto L_BUSY_2P
bcf PORTD,7 ;E = 0 LCD INABILITADO
bsf STATUS,5 ;BANCO 1
clrf TRISB ;PUERTO B COMO SALIDA
bcf STATUS,5 ;BANCO 0
bcf PORTD,6 ;R/W = 0 MODO ESCRITURA
return
;------------------------------------------------------------------------
;DELAY_5MS: Genera una temporizaci¢n de 5 mS
;
DELAY_5MS_2P movlw 0x1a
movwf DATO_B ;Carga la variable DATO_B
clrf DATO_A ;Carga la variable DATO_A
DELAY_1_2P decfsz DATO_A,1 ;Decrementa la variable DATO_A
goto DELAY_1_2P
decfsz DATO_B,1 ;Decrementa la variable DATO_B
goto DELAY_1_2P
return

También podría gustarte