Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

15/10/2016 #1


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.
Si es algo muy fácil o tonto, no se burlen, soy novato.
Código 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 
16/10/2016 #2

Avatar de Scooter

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.
16/10/2016 #3


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
16/10/2016 #4
Moderador

Avatar de D@rkbytes

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.
16/10/2016 #5


bueno en sii el codigo ya hace eso

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
como decia ya probé todos los retardos posibles en todos los lugares XD y parece ignorarlos
16/10/2016 #6
Moderador

Avatar de D@rkbytes

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.
Archivos Adjuntos
Tipo de Archivo: rar 16F887 Int EEPROM.rar (24,6 KB (Kilobytes), 6 visitas)
16/10/2016 #7


D@rkbytes dijo: Ver Mensaje
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.
bien voy a checar y aviso ,talvez me lo puedan recibir viendo en modo depuracion
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.