Autor Tema: Retardo en interrupción por escritura en EEPROM  (Leído 3838 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado antareZ

  • PIC10
  • *
  • Mensajes: 3
Retardo en interrupción por escritura en EEPROM
« en: 16 de Octubre de 2016, 15:38:58 »
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 noob.   :D :-)
Código: QBasic/QuickBASIC
  1. LIST p=16f887
  2.    
  3.     #include<p16f887.inc>
  4.     __CONFIG _CONFIG1, _FOSC_INTRC_NOCLKOUT & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_ON & _CPD_OFF & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF
  5.    
  6.    
  7.  
  8.  direc EQU 0x01
  9.  dato EQU 0x0C
  10.          
  11.  ORG 0X00
  12.  
  13.  GOTO inicio
  14.  
  15.  ORG 0X04
  16.  
  17.  GOTO  rut_eeprom
  18.  
  19.  ORG 0X05
  20.  
  21.  
  22. inicio
  23.  bsf STATUS,RP1
  24.  bsf STATUS,RP0
  25.  
  26.  bcf INTCON,GIE
  27.  bsf INTCON,EEIE
  28.  bsf EECON1,WREN
  29.  movlw direc
  30.  bcf STATUS, RP0  
  31.  movwf EEADR
  32.  movlw h'88'
  33.  movwf EEDATA
  34.  
  35.  
  36.  bcf STATUS,RP1  
  37.  bcf STATUS,RP0
  38.  bsf STATUS,RP0
  39.  clrf TRISB
  40.  movlw h'55'
  41.  bsf STATUS,RP1
  42.  
  43.  
  44.  movwf EECON2
  45.  MOVLW h'AA'
  46.  movwf EECON2
  47.  bsf EECON1,WR
  48.  bsf INTCON,GIE
  49.  
  50.  bcf STATUS,RP1
  51.  bcf STATUS,RP0
  52.  clrf PORTB
  53.  
  54.  bsf PORTB,0
  55.  bsf PORTB,1
  56. fin GOTO fin
  57.  
  58. rut_eeprom  ;interrupcion
  59.  
  60.  bsf STATUS,RP1
  61.  bcf STATUS, RP0
  62.  movf EEDATA,W
  63.  bsf STATUS,RP0
  64.  bcf EECON1,EEIF
  65.  bsf EECON1,RD
  66.  bcf STATUS, RP0  
  67.  subwf EEDATA,W
  68.  btfss STATUS,Z
  69.  GOTO erro
  70.  bcf STATUS,RP1
  71.  bcf STATUS,RP0
  72.  
  73.  bsf PORTB,1
  74.  
  75. erro
  76.  Retfie
  77.  #include <RETARDOS.INC>

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Retardo en interrupción por escritura en EEPROM
« Respuesta #1 en: 16 de Octubre de 2016, 16:57:45 »
El tema esta en que es muy rapido. No se cual es tu objetivo, en una interrupcion no es bueno poner retardos/delays.

En tu interrupcion estas haciendo lo mismo que al comienzo, poniendo un 1 en PORTB,1 :

 bsf PORTB,1

Por lo cual siempre va a estar en 1 eso. Y PORTB,0 quedo en 1 desde antes de entrar al loop infinito.

Desconectado antareZ

  • PIC10
  • *
  • Mensajes: 3
Re:Retardo en interrupción por escritura en EEPROM
« Respuesta #2 en: 16 de Octubre de 2016, 17:29:28 »
El tema esta en que es muy rapido. No se cual es tu objetivo, en una interrupcion no es bueno poner retardos/delays.

En tu interrupcion estas haciendo lo mismo que al comienzo, poniendo un 1 en PORTB,1 :

 bsf PORTB,1

Por lo cual siempre va a estar en 1 eso. Y PORTB,0 quedo en 1 desde antes de entrar al loop infinito.

mira el objetivo es ver el led que indica la escritura que esta en PORTB,0 ya que por la velocidad del pic  ni siquiera pareciera que prende ,se que funciona porque he bajado hasta los 40 hz en la simulacion con proteus para poder ver prender al led
entonces es por eso que yo queria introducir algo como una interrupcion para que ese led pueda verse al hacer el circuito en fisico intente meter algunos retardos en algunas partes del codigo pero no ocurre nada ,que solucion podria haber si no es bueno meter retardos :(?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Retardo en interrupción por escritura en EEPROM
« Respuesta #3 en: 16 de Octubre de 2016, 17:41:11 »
Tal ves buscas algo asi..

Código: ASM
  1. BSF     PORTB, 0        ;Enciendo Led Sleep
  2.         BCF     PORTB, 1        ;Apago Led Escritura
  3.  
  4. fin
  5.         NOP
  6.         SLEEP
  7.         NOP
  8.         CALL    Delay500ms
  9.         BCF     PORTB, 1        ; Apago led Escritura
  10.         GOTO    fin
  11.  
  12. Delay500ms
  13.                         ;499994 cycles
  14.         movlw   0x03
  15.         movwf   d1
  16.         movlw   0x18
  17.         movwf   d2
  18.         movlw   0x02
  19.         movwf   d3
  20. Delay500ms_0
  21.         decfsz  d1, f
  22.         goto    $+2
  23.         decfsz  d2, f
  24.         goto    $+2
  25.         decfsz  d3, f
  26.         goto    Delay500ms_0
  27.  
  28.                         ;2 cycles
  29.         goto    $+1
  30.  
  31.                         ;4 cycles (including call)
  32.         return

Te faltaria definir los 3 registros d1,d2 y d3 nomas

PD: Al codigo de interrupcion le faltan instrucciones, te recomiendo buscar en el datasheet W_TEMP, ahi tenes el codigo que le falta, Pero que por ahora no vas a tener problema.
PD2: Mientras este en el delay no vas a tener bajo consumo, si queres BAJO consumo, deberias usar otro sistema por ejemplo usar el WDT, que si esta en SLEEP no te resetea el micro sino que continua. Por lo que solo se despertaria en ese momento y luego volveria a dormir. Podes usar un contador y cuando lo realize X veces procedes a cambiar el estado del pin. En ves de usar el delay.
« Última modificación: 16 de Octubre de 2016, 17:48:31 por KILLERJC »

Desconectado antareZ

  • PIC10
  • *
  • Mensajes: 3
Re:Retardo en interrupción por escritura en EEPROM
« Respuesta #4 en: 16 de Octubre de 2016, 18:14:04 »
Tal ves buscas algo asi..

Código: ASM
  1. BSF     PORTB, 0        ;Enciendo Led Sleep
  2.         BCF     PORTB, 1        ;Apago Led Escritura
  3.  
  4. fin
  5.         NOP
  6.         SLEEP
  7.         NOP
  8.         CALL    Delay500ms
  9.         BCF     PORTB, 1        ; Apago led Escritura
  10.         GOTO    fin
  11.  
  12. Delay500ms
  13.                         ;499994 cycles
  14.         movlw   0x03
  15.         movwf   d1
  16.         movlw   0x18
  17.         movwf   d2
  18.         movlw   0x02
  19.         movwf   d3
  20. Delay500ms_0
  21.         decfsz  d1, f
  22.         goto    $+2
  23.         decfsz  d2, f
  24.         goto    $+2
  25.         decfsz  d3, f
  26.         goto    Delay500ms_0
  27.  
  28.                         ;2 cycles
  29.         goto    $+1
  30.  
  31.                         ;4 cycles (including call)
  32.         return

Te faltaria definir los 3 registros d1,d2 y d3 nomas

PD: Al codigo de interrupcion le faltan instrucciones, te recomiendo buscar en el datasheet W_TEMP, ahi tenes el codigo que le falta, Pero que por ahora no vas a tener problema.
PD2: Mientras este en el delay no vas a tener bajo consumo, si queres BAJO consumo, deberias usar otro sistema por ejemplo usar el WDT, que si esta en SLEEP no te resetea el micro sino que continua. Por lo que solo se despertaria en ese momento y luego volveria a dormir. Podes usar un contador y cuando lo realize X veces procedes a cambiar el estado del pin. En ves de usar el delay.
mm suena  bien  buscare en el datasheet el codigo restante y pondre los registros del delay  :) intentare haber que sale ,si queda lo pondre aqui

Desconectado KevinGarcia

  • PIC10
  • *
  • Mensajes: 1
Re:Retardo en interrupción por escritura en EEPROM
« Respuesta #5 en: 30 de Diciembre de 2019, 20:46:50 »
Hola, como te quedo finalmente?


 

anything