Retardo en interrupción por escritura en EEPROM

Hola. Tengo una duda y espero que me puedan ayudar.
Hice un código en ensamblador que pone en estado de bajo consumo a un PIC, en este caso el PIC16F887.
Cuando está en éste estado debe entrar la interrupción escribiendo un dato en la memoria EEPROM, sacando del estado de bajo consumo al PIC.

El código funciona, lo tengo simulado en proteus.
El problema es al llevarlo a la practica en físico a los 4Mhz del PIC.
En el código puse dos LED en el puerto B, uno que me indica que el PIC esté en sleep y otro que me indica cuando se realizó la escritura.

Debido a la velocidad con que guarda el dato, el LED que está en RB0 que me indica la escritura, no se llega a apreciar cuando prende y es ahí donde necesito meter un retardo.
Usé una librería y probé en todos lados un retardo de 500 milisegundos y de 1 segundo, pero no funciona. Ayúdenme por favor.

Recien comienzo en el lenguaje ensamblador y hay muchas cosas que no entiendo. :cry:
Si es algo muy fácil o tonto, no se burlen, soy novato. :LOL:
PHP:
list p=16f887
    
    #include<p16f887.inc>
    __CONFIG _CONFIG1, _FOSC_INTRC_NOCLKOUT & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_ON & _CPD_OFF & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF
    
   

 direc EQU 0x01
 dato EQU 0x0C
          
 ORG 0X00
 
 goto inicio
 
 ORG 0X04
 
 goto  rut_eeprom
 
 ORG 0X05
 
 
inicio
 bsf STATUS,RP1 
 bsf STATUS,RP0 
 
 bcf INTCON,GIE
 bsf INTCON,EEIE
 bsf EECON1,WREN
 movlw direc
 bcf STATUS, RP0  
 movwf EEADR
 movlw h'88'
 movwf EEDATA
 

 bcf STATUS,RP1  
 bcf STATUS,RP0 
 bsf STATUS,RP0
 clrf TRISB
 movlw h'55'
 bsf STATUS,RP1 
 
 
 movwf EECON2
 MOVLW h'AA'
 movwf EECON2
 bsf EECON1,WR
 bsf INTCON,GIE
 
 bcf STATUS,RP1 
 bcf STATUS,RP0 
 clrf PORTB
 
 bsf PORTB,0
 bsf PORTB,1
 sleep
fin goto fin
 
rut_eeprom  ;interrupcion
 
 bsf STATUS,RP1
 bcf STATUS, RP0 
 movf EEDATA,W
 bsf STATUS,RP0 
 bcf EECON1,EEIF
 bsf EECON1,RD
 bcf STATUS, RP0  
 subwf EEDATA,W
 btfss STATUS,Z
 goto erro
 bcf STATUS,RP1 
 bcf STATUS,RP0 
 
 bsf PORTB,1
 
erro
 Retfie
 #include <RETARDOS.INC>
END
 
Última edición por un moderador:
No programo pics porque nunca me gustaron pero creo que...
Los includes van al principio, son una directiva del ensamblador, no parte del programa, solo se llaman una vez para agregar parte de código
las etiquetas suelen acabar con dos puntos, es dicir
inicio:
no
inicio
Esto puede que no sea así en ese ensamblador, el los que he usado si que lo era.

Te faltará el pause de turno para que pare, pones el include pero no llamas a la función.

Por cierto borra esa librería y usa algo menos malo que los pauses, sleeps o como diablo se llamen; timers preferentemente.
Acostumbrate desde el principio a no usar esa absurda forma de perder tiempo y malgastar CPU.
 
mmmm no bro ya no llevan los dos puntos y respecto ala libreria me explicaron que no debe ir al comienzo si no al final al parecer puede alterar el funcionamiento si va arriba
 
Después de una escritura en la EEPROM y cuando el microcontrolador se encuentra en estado de bajo consumo, una interrupción es lo que hará cambiar de estado el bit EEIF (EE Write Operation Interrupt Flag) del registro PIR2.
Ese cambio de estado es lo que indicará una escritura completa.

Entonces debes leer ese bit durante el servicio de interrupción para determinar si ha ocurrido una interrupción por escritura en la EEPROM y después debes ponerlo en cero nuevamente.
 
bueno en sii el codigo ya hace eso:unsure:

cuando lo simulo en proteus el led en rB1 que me indica el estado de bajo consumo se encuentra apagado entonces entra la interrupción y el led en RB0 se enciende cuando finaliza la escritura y a continuación se apaga, por ultimo el led RB1 se enciende indicando que el pic salio del estado de bajo consumo

el problema es que el led en RB0 enciende y apaga demasiado rápido y no logro verlo por la velocidad de escritura yo necesito poner un retardo o algo que me deje verlo :cry:
como decia ya probé todos los retardos posibles en todos los lugares XD y parece ignorarlos
 
No es necesario que pongas un retardo, lo puedes hacer viendo la ejecución del programa en modo de depuración.

Mira el ejemplo adjunto. Ya está preparado para actuar ante las interrupciones.
 

Adjuntos

  • 16F887 Int EEPROM.rar
    24.6 KB · Visitas: 13
Atrás
Arriba