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 MOVWF BCF BSF BSF BCF BCF perifericos BCF MOVF MOVWF CALL BSF BCF BCF RETURN

DIR_EEPROM,w DATA_EE_ADDR PIR2, EEIF STATUS, RP0 PIE2, EEIE STATUS, RP0 INTCON,PEIE INTCON,GIE DATO_ESCRI,W DATA_EE_DATA ESCRITURA_EEPROM STATUS,RP0 PIE2,EEIE STATUS,RP0

; Registro auxiliar para la direccion de EEPROM ; ; Baja la bandera de interrupción ; Banco 1 ; Habilita la interrupción por EEPROM ; regresa al Banco 0 ; DESActiva interrupciones de ; DESActiva interrupciones ; Registro auxiliar DATO a ESCRIBIR

; Banco1 ; Habiliar Interrupción por EEPROM ; Banco0

EEPROM_16F877_CAPC_SI.LIB
ESCRITURA_EEPROM BSF BCF MOVF MOVWF MOVF MOVWF BSF BCF BSF MOVLW MOVWF MOVLW MOVWF BSF STATUS,RP1 ; STATUS,RP0 ; Banco 2 DATA_EE_ADDR,W ; EEADR ; Direccion de memoria de datos a escribir DATA_EE_DATA,W ; EEDATA ; Valor de memoria de datos a escribir STATUS, RP0 ; Banco 3 EECON1, EEPGD ; Selecciona memoria EEPROM EECON1, WREN ; Activa permiso de escritura 0x55 ; SECUENCIA REQUERIDA POR EL FABRICANTE EECON2 0xAA EECON2 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 EEPROM MOVWF BSF BCF MOVF MOVWF BSF BCF BSF BCF MOVF BCF BCF MOVWF RETURN DIR_EEPROM,w DATA_EE_ADDR STATUS, RP1 STATUS, RP0 DATA_EE_ADDR,W EEADR STATUS, RP0 EECON1, EEPGD EECON1, RD STATUS, RP0 EEDATA, W STATUS, RP1 STATUS, RP0 DATO_LEIDO ; Registro auxiliar para la direccion de ; ; ; Banco 2 ; ; Direccion de memoria de datos a leer ; Banco 3 ; Selecciona memoria EEPROM ; Lee EEPROM ; Banco 2 ; W = EEDATA ; ; Banco 0 ; Mover a Registro Auxiliar

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: ; BACKGROUND DEBUG: DISABLED ; DATA EE READ PROTECT: OFF ; CODE PROTECT: OFF list p=16f877a INCLUDE "P16F877A.Inc"

WRITE PROTECTION OFF

;Tipo de procesador ;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
INICIO ; ; ORG bcf bsf movlw movwf bcf bcf movlw movwf movlw movwf clrf bcf bcf call call 5 STATUS,RP1 STATUS,RP0 b'00000110' ADCON1 ;9f 1,7 TRISE,PSPMODE b'00000010' TRISD b'00000011' TRISC TRISE STATUS,RP0 STATUS,RP1

;configura puerto A y E como E/S digitales ;MUEVE A ADCON1 ;Resistencias pull up ACTIVAS ;Desactiva puerto paralelo esclavo ;Afecta puerta D también ;puerto D como salida y el RD1 para RF ;Configura puerto C para verificar sensores ;puerto E como salida ;Banco 0

RETARDO ;Retardo Antirebotes GUARDAR_REGISTROS

PROGRAMA SIN USAR INTERRUPCION
;RUTINA PARA ESCRIBIR EL DATO 'A' EN LA MEMORIA EEPROM clrf movlw movwf call movf sublw btfsc goto goto PRIMERA movlw movwf movlw movwf call DATO_LEIDO 0x0F DIR_EEPROM LEER_MEM_F877 DATO_LEIDO,W 'A' STATUS,2 SEGUNDA_O_MAS PRIMERA 'A' DATO_ESCRI 0x0F DIR_EEPROM ESCRI_MEM_F877

;especifica direccion para leer ;lee memoria EEPROM de la direccion especificada ;Carga W con el ultimo dato leido ;Compara ;Si es diferente salta

;Dato a escribir ;especifica direccion para leer ;Escribe memoria EEPROM segun la direccion y el ;dato especificado

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

CICLO

call call call call sleep goto

CARGAR_REGISTROS UP_LCD LCD_INI ;Inicia el m¢dulo LCD MENSAJE_VEZ CICLO

PROGRAMA SIN USAR INTERRUPCION
SEGUNDA_O_MAS clrf movlw movwf call incf movf xorlw btfsc goto movf movwf movlw movwf call goto DATO_LEIDO 0x10 DIR_EEPROM LEER_MEM_F877 DATO_LEIDO,1 DATO_LEIDO,0 '8' STATUS,2 PRIMERA ;especifica direccion para leer ;lee memoria EEPROM de la direccion especificada ;Incrementa el dato leido

;SI Z = 0 BRINCA ;Z=1 Y LLAMA

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

PROGRAMA SIN USAR INTERRUPCION
MENSAJE_VEZ ;__________________________________________________________ call UP_LCD ;RECONFIGURA DENUEVO EL DISPLAY PARA USARLO OTRA VEZ clrf movlw movwf call movf call movlw call movlw call movlw call movlw call RETURN DATO_LEIDO 0x10 DIR_EEPROM LEER_MEM_F877 DATO_LEIDO,W LCD_DATOS '' LCD_DATOS 'V' LCD_DATOS 'E' LCD_DATOS 'Z' LCD_DATOS

;especifica direccion para leer ;lee memoria EEPROM de la direccion especificada ;Carga W con el ultimo dato leido ;Visualiza Valor cargado en W ;2 ;Visualiza Valor cargado en W ;3 ;Visualiza Valor cargado en W ;4 ;Visualiza Valor cargado en W ;5 ;Visualiza Valor cargado en W

PROGRAMA SIN USAR INTERRUPCION
RETARDO movlw movwf movlw movwf movlw movwf decfsz goto decfsz goto decfsz goto retlw .1 REG1 .195 REG2 .212 REG3 REG3 $-1 REG2 $-5 REG1 $-9 0 ;Retardo de 1/8 s

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

LA

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

EEPROM_16F877_CAPC_CI.LIB
ESCRITURA_EEPROM BSF BCF MOVF MOVWF MOVF MOVWF BSF BCF BSF MOVLW MOVWF MOVLW MOVWF BSF sleep BSF BCF BCF RETURN STATUS,RP1 STATUS,RP0 DATA_EE_ADDR,W EEADR DATA_EE_DATA,W EEDATA STATUS, RP0 EECON1, EEPGD EECON1, WREN 0x55 EECON2 0xAA EECON2 EECON1, WR STATUS, RP0 EECON1, WREN STATUS, RP0 ; ; Banco 2 ; ; Direccion de memoria de datos a escribir ; ; Valor de memoria de datos a escribir ; Banco 3 ; Selecciona memoria EEPROM ; Activa permiso de escritura ; SECUENCIA REQUERIDA POR EL FABRICANTE

; Activa el bit WR para comenzar a escribir ; debe dormirlo estando en el banco 3 ; Banco 3 ; INActivar permiso de escritura ; Banco 0

EEPROM_16F877_CAPC_CI.LIB
LEER_MEM_F877 MOVF MOVWF BSF BCF MOVF MOVWF BSF BCF BSF BCF MOVF BCF BCF MOVWF RETURN DIR_EEPROM,w DATA_EE_ADDR STATUS, RP1 STATUS, RP0 DATA_EE_ADDR,W EEADR STATUS, RP0 EECON1, EEPGD EECON1, RD STATUS, RP0 EEDATA, W STATUS, RP1 STATUS, RP0 DATO_LEIDO ; Registro auxiliar para la direccion de EEPROM ; ; ; Banco 2 ; ; Direccion de memoria de datos a leer ; Banco 3 ; Selecciona memoria EEPROM ; Lee EEPROM ; Banco 2 ; W = EEDATA ; ; Banco 0 ; Mover a Registro Auxiliar

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: ; BACKGROUND DEBUG: DISABLED ; DATA EE READ PROTECT: OFF ; CODE PROTECT: OFF list p=16f877a INCLUDE "P16F877A.Inc"

WRITE PROTECTION OFF

;Tipo de procesador ;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 bsf movlw movwf bcf bcf movlw movwf movlw movwf clrf bcf bcf call call STATUS,RP1 STATUS,RP0 b'00000110' ADCON1 ;9f 1,7 TRISE,PSPMODE b'00000010' TRISD b'00000011' TRISC TRISE STATUS,RP0 STATUS,RP1 ;configura puerto A y E como E/S digitales ;MUEVE A ADCON1 ;Resistencias pull up ACTIVAS ;Desactiva puerto paralelo esclavo ;Afecta puerta D también ;puerto D como salida y el RD1 para RF ;Configura puerto C para verificar sensores ;puerto E como salida ;Banco 0

RETARDO ;Retardo Antirebotes 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 movwf movlw movwf call movlw movwf movlw movwf call 'A' DATO_ESCRI 0x0F DIR_EEPROM ESCRI_MEM_F877 '1' DATO_ESCRI 0x10 DIR_EEPROM ESCRI_MEM_F877 ;Dato a escribir ;especifica direccion para leer ;Escribe memoria EEPROM segun la direccion y el dato especificado ;Dato a escribir ;especifica direccion para leer ;Escribe memoria EEPROM segun la direccion y el dato especificado

PROGRAMA USANDO INTERRUPCION
CICLO call call call call sleep goto CARGAR_REGISTROS UP_LCD LCD_INI MENSAJE_VEZ CICLO ;Inicia el m¢dulo LCD

SEGUNDA_O_MAS clrf movlw movwf call incf movf xorlw btfsc goto movf movwf movlw movwf call goto

DATO_LEIDO 0x10 DIR_EEPROM LEER_MEM_F877 DATO_LEIDO,1 DATO_LEIDO,0 '8' STATUS,2 PRIMERA

;especifica direccion para leer ;lee memoria EEPROM de la direccion especificada ;Incrementa el dato leido

;SI Z = 0 BRINCA ;Z=1 Y LLAMA

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

PROGRAMA USANDO INTERRUPCION
MENSAJE_VEZ ;__________________________________________________________ call clrf movlw movwf call movf call movlw call movlw call movlw call movlw call RETURN UP_LCD ;RECONFIGURA DENUEVO EL DISPLAY PARA USARLO OTRA VEZ

DATO_LEIDO 0x10 DIR_EEPROM LEER_MEM_F877 DATO_LEIDO,W LCD_DATOS '' LCD_DATOS 'V' LCD_DATOS 'E' LCD_DATOS 'Z' LCD_DATOS

;especifica direccion para leer ;lee memoria EEPROM de la direccion especificada ;Carga W con el ultimo dato leido ;Visualiza Valor cargado en W ;2 ;Visualiza Valor cargado en W ;3 ;Visualiza Valor cargado en W ;4 ;Visualiza Valor cargado en W ;5 ;Visualiza Valor cargado en W

PROGRAMA USANDO INTERRUPCION
RETARDO movlw movwf movlw movwf movlw movwf decfsz goto decfsz goto decfsz goto retlw .1 REG1 .195 REG2 .212 REG3 REG3 $-1 REG2 $-5 REG1 $-9 0 ;Retardo de 1/8 s

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 bcf bcf movwf bsf movf bcf movwf bsf movf bcf movwf STATUS,w STATUS, RP1 STATUS, RP0 STATUS_BK STATUS, RP0 TRISA,w STATUS, RP0 TRISA_BK STATUS, RP0 TRISB,w STATUS, RP0 TRISB_BK

REGISTROS_BK.LIB
bsf movf bcf movwf bsf movf bcf movwf bsf movf bcf movwf bsf movf bcf movwf bsf movf bcf movwf STATUS, RP0 TRISC,w STATUS, RP0 TRISC_BK STATUS, RP0 TRISD,w STATUS, RP0 TRISD_BK STATUS, RP0 TRISE,w STATUS, RP0 TRISE_BK STATUS, RP0 PIE1,w STATUS, RP0 PIE1_BK STATUS, RP0 PIE2,w STATUS, RP0 PIE2_BK

REGISTROS_BK.LIB
movf movwf movf movwf movf movwf movf RETURN CARGAR_REGISTROS bcf bcf movf bsf movwf bcf STATUS, RP1 STATUS, RP0 TRISA_BK,w STATUS, RP0 TRISA STATUS, RP0 INTCON,w INTCON_BK PIR1,w PIR1_BK PIR2,w PIR2_BK STATUS_BK, STATUS

REGISTROS_BK.LIB
movf bsf movwf bcf movf bsf movwf bcf movf bsf movwf bcf movf bsf movwf bcf movf bsf movwf bcf TRISB_BK,w STATUS, RP0 TRISB STATUS, RP0 TRISC_BK,w STATUS, RP0 TRISC STATUS, RP0 TRISD_BK,w STATUS, RP0 TRISD STATUS, RP0 TRISE_BK,w STATUS, RP0 TRISE STATUS, RP0 PIE1_BK,w STATUS, RP0 PIE1 STATUS, RP0

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

movf movwf movf movwf movf movwf movf

INTCON_BK,w INTCON PIR1_BK,w PIR1 PIR2_BK,w PIR2 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 call Subrutina BCF PCLATH,3 ;Selecciona pagina 1

PAGINA 0 1 2 3

PCLATH,3 0 1 0 1

PCLATH,4º 0 0 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: ;LOW VOLTAGE PROGRAM: ;FLASH PROGRAM WRITE: ;BACKGROUND DEBUG: ;DATA EE READ PROTECT: ;CODE PROTECT: OFF

OFF DISABLE WRITE PROTECTION OFF DISABLED OFF

list p=16f877a INCLUDE "P16F877A.Inc"

;Tipo de procesador ;Librerias de registros del PIC

PROGRAMA DE VARIAS PAGINAS
CBLOCK .32 DATO_A, DATO_B ;VARIABLES CONTROL LCD endc INICIO ; ; bcf bsf movlw movwf bcf bcf movlw movwf movlw movwf clrf bcf bcf STATUS,RP1 STATUS,RP0 b'00000110' ADCON1 ;9f 1,7 TRISE,PSPMODE b'00000010' TRISD b'00000011' TRISC TRISE STATUS,RP0 STATUS,RP1

;configura puerto A y E como E/S digitales ;MUEVE A ADCON1 ;Resistencias pull up ACTIVAS ;Desactiva puerto paralelo esclavo ;Afecta puerta D también ;puerto D como salida y el RD1 para RF ;Configura puerto C para verificar sensores ;puerto E como salida ;Banco 0

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 bcf bcf bcf bcf clrf bcf clrf bcf bcf return STATUS,5 ;BANCO 1 TRISE,PSPMODE ;DESACTIVA PUERTO PARALELO ESCLAVO ;AFECTA TAMBIEN EL PUERTO D PORTD,5 ;RD5 COMO SALIDA PORTD,6 ;RD6 COMO SALIDA PORTD,7 ;RD7 COMO SALIDA TRISB ;PUERTO B COMO SALIDA STATUS,5 ;BANCO 0 INTCON ;DESACTIVA INTERRUPCIONES PORTD,5 ;RS = 0 SELECCION DE REGISTRO DE CONTROL PORTD,7 ;E = 0 LCD INABILITADO

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