Autor Tema: Problema con la carga del Valor del TMR0  (Leído 952 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Problema con la carga del Valor del TMR0
« en: 07 de Septiembre de 2023, 04:13:01 »
Hola amigos hacia mucho que no entraba en el foro estoy retomado esto de programar PIC, el problema es el siguiente cuando se carga el valor de TMR0 se cambia el valor del registro OPTION_REG lo que hice fue que despues que cargo el valor del TMR0, recargo el valor del OPTION_REG, pero luego despues entonces cuando aplico clrf al puerto B entonces se modifica el TRISB, creia que era que el archivo se corrompia pues me ha pasado muchas veces y con esto se resolvia pero nada, reinstale MPLAB que es la version 8.92 por ultimo reinstale windows 7 y nada.......el problema persiste
abajo les muestro el codigo

;---------------Encabezado-------------

   #include   "p16f628a.inc"
   LIST      P=PIC16F628A


   CBLOCK   0X20
   Salto_A, Fase, Angulo, E1, Ret_E, W_Temp, S_Temp 
   ENDC

#DEFINE RB0_Sinc   PORTB,   0           ;
#DEFINE G_Der      PORTB,   1   ;
#DEFINE G_Izq      PORTB,   2   ;
#DEFINE Temp_E      E1,      0   ;
#DEFINE Sal_T      E1,      1   ;

;-------Configuración de puertos-------

   org      0x00
   goto   inicio

   org      0X04            ;
   btfss   INTCON,   T0IF      ;
   goto   RB0_Int            ;
   bcf      INTCON,   T0IF      ;
   bsf      INTCON,   INTE
   banksel   OPTION_REG
   bsf      OPTION_REG,   T0CS
   goto   Fin_Int

RB0_Int
   bcf      INTCON,INTF         ;
   bcf      INTCON,INTE
   banksel   OPTION_REG
   bcf      OPTION_REG,   T0CS
   
Fin_Int
   bcf      Sal_T
   retfie                  ;

inicio   
   banksel   OPTION_REG
   MOVLW    b'01100000'         ;
   MOVWF    OPTION_REG          ;
   MOVLW   b'10110000'         ;
   MOVWF   INTCON            ;
   call   TMR0_G
   call   Ret_G
   CLRF   PORTB            ;
   banksel   TRISB            ;
   movlw    b'00000001'         ;
   movwf   TRISB              ;
   bsf      Sal_T
   goto   Nada
   

Nada
   nop   
   goto   Nada            ;

TMR0_G
   movlw   .6            ;
   MOVWF   TMR0
   movwf   Angulo
   movlw   .8            ;
   MOVWF   Salto_A
   movlw   .240            ;
   MOVWF   Fase
   banksel   OPTION_REG
   MOVLW    b'01100000'         ;
   MOVWF    OPTION_REG          ;
   Return

Ret_G
   movlw   .50            ;
   movwf   Ret_E
   Return
;------------------------------------------
   END
;------------------------------------------
este es programa modificado si ven se configura el puerto b al final y se carga el OPTION_REG despues del TMR0

el programa lo que deberia hacer es que espera una interrupcion por el puerto RB,0 esta atiende la interrupcion y activa el TMR0 para hacer una temporizacion y desactiva la interrupcion por RB,0, luego de activar la interrupcion por el TMR0, se desactiva esa y si activa la interrupcion del RB,0
« Última modificación: 07 de Septiembre de 2023, 04:27:58 por akira_ve »
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema con la carga del Valor del TMR0
« Respuesta #1 en: 07 de Septiembre de 2023, 11:25:50 »
Hola amigos hacia mucho que no entraba en el foro estoy retomado esto de programar PIC, el problema es el siguiente cuando se carga el valor de TMR0 se cambia el valor del registro OPTION_REG lo que hice fue que despues que cargo el valor del TMR0, recargo el valor del OPTION_REG, pero luego despues entonces cuando aplico clrf al puerto B entonces se modifica el TRISB, creia que era que el archivo se corrompia pues me ha pasado muchas veces y con esto se resolvia pero nada, reinstale MPLAB que es la version 8.92 por ultimo reinstale windows 7 y nada.......el problema persiste
abajo les muestro el codigo

;---------------Encabezado-------------

   #include   "p16f628a.inc"
   LIST      P=PIC16F628A


   CBLOCK   0X20
   Salto_A, Fase, Angulo, E1, Ret_E, W_Temp, S_Temp 
   ENDC

#DEFINE RB0_Sinc   PORTB,   0           ;
#DEFINE G_Der      PORTB,   1   ;
#DEFINE G_Izq      PORTB,   2   ;
#DEFINE Temp_E      E1,      0   ;
#DEFINE Sal_T      E1,      1   ;

;-------Configuración de puertos-------

   org      0x00
   goto   inicio

   org      0X04            ;
   btfss   INTCON,   T0IF      ;
   goto   RB0_Int            ;
   bcf      INTCON,   T0IF      ;
   bsf      INTCON,   INTE
   banksel   OPTION_REG
   bsf      OPTION_REG,   T0CS
   goto   Fin_Int

RB0_Int
   bcf      INTCON,INTF         ;
   bcf      INTCON,INTE
   banksel   OPTION_REG
   bcf      OPTION_REG,   T0CS
   
Fin_Int
   bcf      Sal_T
   retfie                  ;

inicio   
   banksel   OPTION_REG
   MOVLW    b'01100000'         ;
   MOVWF    OPTION_REG          ;
   MOVLW   b'10110000'         ;
   MOVWF   INTCON            ;
   call   TMR0_G
   call   Ret_G
   CLRF   PORTB            ;
   banksel   TRISB            ;
   movlw    b'00000001'         ;
   movwf   TRISB              ;
   bsf      Sal_T
   goto   Nada
   

Nada
   nop   
   goto   Nada            ;

TMR0_G
   movlw   .6            ;
   MOVWF   TMR0
   movwf   Angulo
   movlw   .8            ;
   MOVWF   Salto_A
   movlw   .240            ;
   MOVWF   Fase
   banksel   OPTION_REG
   MOVLW    b'01100000'         ;
   MOVWF    OPTION_REG          ;
   Return

Ret_G
   movlw   .50            ;
   movwf   Ret_E
   Return
;------------------------------------------
   END
;------------------------------------------
este es programa modificado si ven se configura el puerto b al final y se carga el OPTION_REG despues del TMR0

el programa lo que deberia hacer es que espera una interrupcion por el puerto RB,0 esta atiende la interrupcion y activa el TMR0 para hacer una temporizacion y desactiva la interrupcion por RB,0, luego de activar la interrupcion por el TMR0, se desactiva esa y si activa la interrupcion del RB,0

Me parece que tu problema es que no estás seleccionando el banco correcto antes de modificar un registro:



Esto es, que muchos registros comparten la misma dirección, si no apunto al banco correcto, escribir un dato en un registro puede lo escriba en su espejo
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema con la carga del Valor del TMR0
« Respuesta #2 en: 07 de Septiembre de 2023, 11:32:58 »
Por ejemplo aquí te cambias al banco 1:

Código: ASM
  1. banksel   OPTION_REG   ;Cambias a banco 1
  2.    MOVLW    b'01100000'         ;
  3.    MOVWF    OPTION_REG          ;
  4.    MOVLW   b'10110000'         ;
  5.    MOVWF   INTCON            ;
  6.    call   TMR0_G

y al llamar a call TMR0_G:
Código: ASM
  1. TMR0_G
  2.    movlw   .6            ;
  3.    MOVWF   TMR0  ;// intentas escribir en TMR0 estando en el banco 1, pero al hacer esto, escribes 6 en OPTION
  4.    movwf   Angulo

Intentas modificar TMR0, pero TMR0 está en el banco cero, y antes te cambiaste al 1.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Problema con la carga del Valor del TMR0
« Respuesta #3 en: 07 de Septiembre de 2023, 14:35:38 »
entiendo amigo pero se supone que la instruccion BANKSEL va al banco en que esta el registro y luego regresa en donde estamos........y cuando cargo el valor de TMR0 no estoy cambiando de banco...............disculpenme si estoy equivocado....de hecho probe ir al banci 1 y luego al 0 con OPTION_REG y TRISB y nada todo empeoraba ocurrian mas errores en otras partes como que no se cargaban valores en W no se realizaban sumas o restas............osea el registro W quedaba inoperable
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema con la carga del Valor del TMR0
« Respuesta #4 en: 07 de Septiembre de 2023, 14:48:24 »
entiendo amigo pero se supone que la instruccion BANKSEL va al banco en que esta el registro y luego regresa en donde estamos.

¿Y quién te dijo eso o de dónde lo estás asumiendo?

BANKSEL, cambia el estado de unas banderas o bits, para nuevamente cambiarlas a un estado posterior, hay que nuevamente usar el mismo macro.

En pocas, es una variable en la ram que cuando modificas, permanece en ese valor hasta que reinicias al microcontrolador.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Problema con la carga del Valor del TMR0
« Respuesta #5 en: 07 de Septiembre de 2023, 15:20:47 »
Si disculpa justamente leia eso en otra persona que en un foro tenia un problema como yo...........y justo era banksel, y si por lo que entedi hay que regresarlo.......al banco donde estabamos originalmente..........cambie el codigo y lo simule y al parecer se resolviono use banksel.....en lo persona prefiero usar otra cosa pues veo que es como lo mismo use esto,
#DEFINE Banco1   bsf   STATUS,   RP0 y #DEFINE Banco0   bcf   STATUS,   RP0 y listo probe rapido y parece que funciona....y haria lo mismo que usar banksel, luego pruebo bien y les aviso muchas gracias, abajo les dejo el programa modificado

;---------------Encabezado-------------

   #include   "p16f628a.inc"
   LIST      P=PIC16F628A


   CBLOCK   0X20
   Salto_A, Fase, Angulo, E1, Ret_E, W_Temp, S_Temp 
   ENDC

#DEFINE Banco0   bcf   STATUS,   RP0   ; Salto al banco 0 de la memoria
#DEFINE Banco1   bsf   STATUS,   RP0   ; Salto al banco 1 de la memoria
#DEFINE Temp_E      E1,      0   ;
#DEFINE Sal_T      E1,      1   ;

;-------Configuración de puertos-------

   org      0x00
   goto   inicio

   org      0X04            ;
   btfss   INTCON,   T0IF      ;
   goto   RB0_Int            ;
   bcf      INTCON,   T0IF      ;
   bsf      INTCON,   INTE
   Banco1
   bsf      OPTION_REG,   T0CS
   Banco0
   call   TMR0_G
   goto   Fin_Int

RB0_Int
   bcf      INTCON,INTF         ;
   bcf      INTCON,INTE
   Banco1
   bcf      OPTION_REG,   T0CS
   banco0

Fin_Int
   bcf      Sal_T
   retfie                  ;

inicio   
   Banco1
   MOVLW    b'01100000'         ;
   MOVWF    OPTION_REG          ;
   movlw    b'00000001'         ;
   movwf   TRISB              ;
   Banco0
   MOVLW   b'10110000'         ;
   MOVWF   INTCON            ;
   call   TMR0_G
   call   Ret_G
   CLRF   PORTB            ;
   bsf      Sal_T
   goto   Nada
   

Nada
   nop   
   goto   Nada            ;

TMR0_G
   movlw   .6            ;
   MOVWF   TMR0
   movwf   Angulo
   movlw   .8            ;
   MOVWF   Salto_A
   movlw   .240            ;
   MOVWF   Fase
   Banco1
   MOVLW    b'01100000'         ;
   MOVWF    OPTION_REG          ;
   Banco0
   Return

Ret_G
   movlw   .50            ;
   movwf   Ret_E
   Return
;------------------------------------------
   END
;------------------------------------------
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Problema con la carga del Valor del TMR0
« Respuesta #6 en: 07 de Septiembre de 2023, 15:29:36 »
entiendo amigo pero se supone que la instruccion BANKSEL va al banco en que esta el registro y luego regresa en donde estamos........y cuando cargo el valor de TMR0 no estoy cambiando de banco...............disculpenme si estoy equivocado....de hecho probe ir al banci 1 y luego al 0 con OPTION_REG y TRISB y nada todo empeoraba ocurrian mas errores en otras partes como que no se cargaban valores en W no se realizaban sumas o restas............osea el registro W quedaba inoperable

Craso error,  BANKSEL es una directiva que activa desactiva los bits RP0-1 del registro STATUS  y ahí se queda.

Como mpasmwin te alcahuetea todos los registros usados que no están en el bank0,  un criterio de programación es escribir todo sin seleccionar banco.  Luego que compile, te fijás en el listado de warnings los mensajes 302:
Código: [Seleccionar]
Message[302] R:\NEW2.ASM 28 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] R:\NEW2.ASM 36 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] R:\NEW2.ASM 46 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] R:\NEW2.ASM 56 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] R:\NEW2.ASM 76 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Ahí tenés las líneas de todos los registros que no están en bank0 -->  les insertás  antes un BANKSEL registro  y después un BANKSEL 0 .
Optimizando según el caso, pues no tiene sentido un BANSEL 0 si inmediatamente después se usa otro banco.

Establecer como por defecto otro distinto de BANK0 tiene el inconveniente de la dificultad de revisión, sobre todo cuando a un bloque de código se llega por muchas vías.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Problema con la carga del Valor del TMR0
« Respuesta #7 en: 07 de Septiembre de 2023, 17:28:10 »
Amigo Eduardo2 eso quedo mas que aclarado con los comentarios arriba y la correccion que hice..............gracias de todas maneras
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado chakal

  • PIC10
  • *
  • Mensajes: 1
Re:Problema con la carga del Valor del TMR0
« Respuesta #8 en: 10 de Noviembre de 2023, 17:47:22 »
las 4 instrucciones despues de: org OX04 ,a mi parecer nunca se ejecutan.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Problema con la carga del Valor del TMR0
« Respuesta #9 en: 12 de Noviembre de 2023, 23:33:09 »
estaba usando mal la instruccion BANKSEL pueden cerrar este hilo
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela


 

anything