Saludos.
Bueno el ejemplo de hoy es el manejo de la interrupciòn por escritura de la EEPROM del PIC16F877, vamos a indicar cuales son los pasos para realizar nuestro programa pero primero una pequeña introducciòn de la memoria EEPROM del pic.
El PIC16F84 tiene solamente 64 posiciones de memoria EEPROM que se puede direcionar solamente con un registro que indica la posiciòn a guardar que va desde la 0 hasta la 63 en décimal con este micro teniamos dos registros el EEDATA y EEADR el primero registro es con el direcionamos el bloque donde queremos guardar el dato de 8 bits y el segundo se carga el valor que queremos guardar en memoria. Por otro lado, el PIC16F877 tiene un direcionamiento de 13 bits y se pueden guardar datos de 14 bits debido a que tiene 8 K de memoria, para poder lograr esto el micro contiene 2 registros màs que el pic16f84 para direcionar el lugar donde se desea guardar como el tamaño del dato a guardar en la EEPROM. Los registros son EEADRH, EEADR, EEDATAH, EEDATA.
Con los dos primero se seleciona el lugar donde se desea escribir pero a que tener en cuenta que el registro EEADRH contiene los 5 bits de mayor peso y el registro EEADR contiene lo 8 bits de menor peso. Para los demás registro pasa lo mismo sólo que en EEDATAH iran los 6 màs significativos y en EEDATA los menos significativos.
Para configurar la interrupción por fin de escritura hay que habilitar la interrupción global, la de perifericos y en el registro PIE2 habilitar el bit EEIF para habilitar la interrupciòn por fin de escritura de la EEPROM. los pasos para iniciar poder escribir son los siguientes.
1. Especificar la direción donde se desea guardar (EEADRH,EEADR)
2. Carga el registro que se desea guardar en el buffer (EEDATAH,EEDATA)
3. Habilitar el bit WREN del registro EECON1 en 1
4. Mandar la secuencia de escritura al registro EENCON2 (0x55 , 0xAA)
5. Inicio de escritura bir WR del registro EECON1
6. Esperar interrupción.
Hay que tener en cuenta que los registro antes mencionados se encuentran en el banco 2 y en el banco 3 de la memoria RAM asì que hay que tener cuidado con el direcionamiento de las páginas.
Como la escritura de la EEPROM dura unos cuantos ms que es una valor muy grande comparado con el ciclo de instrucción por eso es imporatante utilizar la interrupción por fin de escritura en la EEPROM para indicar si todo estuvo bieny cuando termino la escritura el señalizador de interrupciòn se encuentra en el registro PIR2.
Bueno el ejemplo de hoy consiste de programita sencillo tenemos dos pulsadores conectados al puerto B (b1,b2) un pulsador me incrmenta una variable y cuando presionamos el otro pulsador activamos el seceso para guardar en la EEPROM de nuestro pic.
Aca el esquemático
En el simulador de proteus hay una ayuda para mirar como esta la EEPROM y que tiene guardada para utilizarla (al menos en mi simulador funciona así) tiene que esta corriendo el programa, además, hay que seleccionala por la ventana del simulador una vez activada hay que undir pause en el simulador y aparece el mapa de la memoria EEPROM del microcontrolador.
acá una imagén de la ayuda.
Bueno por último el código en el esamblador obviamente.
;**************************************************************
;* Carlos Alberto Henao *
;* Foro de microcontroladores TODOPIC *
;* Manejo de interupción por fin de escritura de la EEPROM *
;* Febrero 13 del 2010 *
;* Pereira - Colombia *
;**************************************************************
;************************** Registro especiales *******************************************
status equ 03h
porta equ 05h
portb equ 06h
portc equ 07h
portd equ 08h
porte equ 09h
intcon equ 0bh
pir2 equ 0dh
trisa equ 85h
trisb equ 86h
trisc equ 87h
trisd equ 88h
trise equ 89h
pie2 equ 8dh
eedata equ 10ch
eeadr equ 10dh
eecon1 equ 18ch
eecon2 equ 18dh
;************************ Registros de usuario ********************************************
conta equ 20h
loop equ 21h
loop1 equ 22h
respuesta equ 23h
;*********************** Va a empezar el programa *****************************************
list p = 16f877
org 00
goto inicio
org 04
goto inter
;************************* Rutina de atención de interrupciones **************************
inter bcf status,6
bcf status,5 ; banco 0
btfsc pir2,4 ; pregunto si ya hubo interrupción por finalización
; de escritura en la EEPROM
goto guarda_s
bcf status,6
bcf status,5 ; me paso al banco 0
retfie ; de lo contrario retorno al programa
guarda_s
bcf pir2,4 ; limpio la bandera de intterupción
movlw b'1'
movwf respuesta ; cargo
retfie
;************************* Rutina de tiempo antirebote **************************
retar movlw d'180'
movwf loop
movlw d'200'
movwf loop1
decfsz loop1,1
goto $-1
decfsz loop,1
goto $-5
return
;*********************** Rurina de configuración para la escritura en la EEMPROM ***********
guardar bsf status,6 ; me paso al banco de memoria 2
bcf status,5
movlw d'0'
movwf eeadr ; especifico en parte de la memoria voy a guardar
; en este caso en posición 0x00H
bcf status,6
bcf status,5 ; banco 0
movf conta,0 ; paso conta a w ya que conta es el valor a guardar
bsf status,6 ; me paso al banco de memoria 2
bcf status,5
movwf eedata ; paso el dato a eedata
bsf status,5 ; me paso al banco 3
bsf eecon1,2 ; permito la escritura en la eemprom
movlw 55h
movwf eecon2
movlw 0xAA
movwf eecon2 ; mando el comando de escritura
bsf eecon1,1 ; empieza la escritura
bcf status,6
bcf status,5
movf respuesta,1 ; paso el valor de escritura a w
xorlw d'1' ; lo comparo con 1
btfss status,2 ; pregunto por el resultado lógico de la operación
goto $-3 ; vuelvo y repito esperando interrupción
clrf respuesta ; limpio la bandera
return
;********************** Empieza el programa ************************************************
inicio bcf status,6
bsf status,5 ; banco 1
movlw b'11111111'
movwf trisa
movwf trisb
movwf trisd
movwf trise ; puertos A,B,D,E como entradas digitales
movlw b'11110000'
movwf trisc ; configuro el puerto C
movlw b'00010000'
movwf pie2
bcf status,5 ; banco 0
movlw b'11000000'
movwf intcon ; activo la interrupción por escritura de la EEPROM
clrf portb
clrf conta
clrf portc
clrf respuesta
vuelve btfss portb,1
goto pulsa_2
call retar
btfsc portb,1
goto pulsa_2
call retar
btfss portb,1 ; rutina que pregunta por los dos pulsadores
goto $-1
incf conta,1
goto vuelve
pulsa_2
btfss portb,2
goto vuelve
call retar
btfsc portb,2
goto vuelve
call retar
call guardar
goto vuelve
end
Bueno esto fue todo por hoy saludos y no vemos.