Autor Tema: Como parar o cancelar el Timer0 o TMR0 ?  (Leído 3225 veces)

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

Desconectado Vangeluz

  • PIC12
  • **
  • Mensajes: 74
    • Vangeluzweb
Como parar o cancelar el Timer0 o TMR0 ?
« en: 07 de Octubre de 2014, 06:17:39 »
Hola que tal tengo hecho un sencillo programa, el cual por medio del TMR0 cuento segundos en un LCD.
Lo que quiero es cancelar el conteo en pantalla, ya sea cortandolo o pausandolo y no lo he logrado.
Les paso a mostrar el codigo:
Código: [Seleccionar]

__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST    P=16F84A
INCLUDE  <P16F84A.INC>

CBLOCK 0x0C
contador2
ENDC

;##########################################################################################################

Contador equ 0x020 ;Variable para la temporización
             
org 0x00 ;Vector de RESET
goto Inicio
org 0x04 ;Vector de interrupción
goto Interrupcion
org 0x05

Interrupcion   
bcf INTCON,T0IF ;Repone flag del TMR0
decfsz Contador,F ;Decrementa el contador. Ha habido 50 interrupciones ??
            goto Seguir ;No, no han pasado los 500 mS

Con_si_0 call LCD_Borra
    incf contador2,f
movf contador2,w
call BIN_a_BCD ; Se debe visualizar en decimal.
call LCD_Byte ;
movlw .100
            movwf Contador    ;Repone el contador nuevamente para contar 50 interrupciones
Seguir   
movlw ~.39
            movwf TMR0      ;Repone el TMR0 con 39
            retfie ;Retorno de interrupción

Inicio        
clrf contador2
clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
bsf PORTA,3
bsf PORTA,4
movlw b'00000111'
movwf OPTION_REG ;Preescaler de 256 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0

call LCD_Inicializa

movlw ~.39
movwf TMR0 ;Carga el TMR0 con 39
movlw .50
movwf Contador ;Nº de veces a repetir la interrupción
movlw b'10100000'
movwf INTCON ;Activa la interrupción del TMR0

Loop
btfsc PORTA,3      ;Testea el estado de RA3
            goto Loop
bsf INTCON,T0IE

btfsc PORTA,4      ;Testea el estado de RA4
            goto Loop
bcf INTCON,T0IE
goto Loop


INCLUDE  <LCD_4BIT2.INC>
INCLUDE  <RETARDOS.INC>
INCLUDE  <BIN_BCD.INC>
end ;Fin del programa fuente


Como ven, al final quise intentar cortar el conteo con con un pulsador PORTA,4 y volverlo a encender con PORTA,3 ...pero no hace absolutamente nada de naditas !!!! sigue contando.
Si alguien me podria decir como hacer para cortarlo agradecido !!!

Y que no sea poniendo un pulsador a reset ni desconectando la corriente !!! :lol:
Saludos !!!!
Vangeluz

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: Como parar o cancelar el Timer0 o TMR0 ?
« Respuesta #1 en: 07 de Octubre de 2014, 12:24:37 »
En su programa esta usando el TMR0 con la señal de reloj interna, si lo quiere pausar cambia la señal de reloj a externa y asegurese que el PIN RA4 este en un estado fijo o pongalo como salida.

Código: ASM
  1. bsf    OPTION_REG, T0CS              ;usamos señal de reloj externa.


Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Como parar o cancelar el Timer0 o TMR0 ?
« Respuesta #2 en: 07 de Octubre de 2014, 13:36:58 »
Si señor Sander, muy buena solucion, porque el TMR0 no hay Dios que lo pare  ((:-)) ((:-)) :shock:

Desconectado Vangeluz

  • PIC12
  • **
  • Mensajes: 74
    • Vangeluzweb
Re: Como parar o cancelar el Timer0 o TMR0 ?
« Respuesta #3 en: 07 de Octubre de 2014, 14:02:44 »
En su programa esta usando el TMR0 con la señal de reloj interna, si lo quiere pausar cambia la señal de reloj a externa y asegurese que el PIN RA4 este en un estado fijo o pongalo como salida.

Código: ASM
  1. bsf    OPTION_REG, T0CS              ;usamos señal de reloj externa.


Saludos
Muchas gracias Sander
Es justamente lo que quería, con tu ejemplo pude pausar el conteo actual, y lograr volver a continuarlo.
Y si resetéo el contador comienza desde cero !!!
Muchisimas gracias  :-/
Vangeluz

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Como parar o cancelar el Timer0 o TMR0 ?
« Respuesta #4 en: 07 de Octubre de 2014, 14:07:54 »
ten en cuenta el concepto y el por qué funciona.
El TMR0 como timer no lo puedes parar pero si re-setear, el solito se incrementa dependiendo del prescaler, la solucion que usaste es cambiarlo a modo contador de pulsos por la entrada en RA4
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Vangeluz

  • PIC12
  • **
  • Mensajes: 74
    • Vangeluzweb
Re: Como parar o cancelar el Timer0 o TMR0 ?
« Respuesta #5 en: 11 de Octubre de 2014, 18:23:36 »
ten en cuenta el concepto y el por qué funciona.
El TMR0 como timer no lo puedes parar pero si re-setear, el solito se incrementa dependiendo del prescaler, la solucion que usaste es cambiarlo a modo contador de pulsos por la entrada en RA4
Gracias JHOZATE
Tienes razon,se me ha hecho muy dificil pararlo o simular pararlo de esa forma, pero me ha servido ese ejemplo...
Código: ASM
  1. cblock  0x0C
  2. Contador
  3. segundo
  4. endC
  5.         org    0x04                 ;Vector de interrupción
  6.         goto    Interrupcion
  7.         org    0x05
  8.  
  9. Interrupcion      
  10.         bcf       INTCON,T0IF   ;Repone flag del TMR0
  11.         decfsz     Contador,F   ;Decrementa contador. Ha habido 100 interrupciones?
  12.         goto     Seguir            ;No, no han pasado los 1000 mS = 1 SEGUNDO
  13. Con_si_0
  14.         incf      segundo,f        ; INCREMENTA SEGUNDOS
  15.         movlw     .100
  16.         movwf     Contador      ;Repone contador para contar 100 interrupciones
  17. Seguir        
  18.         movlw     ~.39        
  19.         movwf     TMR0           ;Repone el TMR0 con 39
  20.         retfie                         ;Retorno de interrupción
  21.  
  22. ;=================================================================
  23. ; Ejemplo resumido, sin antirebotes ni muchos detalles
  24. ; Se trata de chequear si SEGUNDO llega a 20
  25.  
  26. pulsador1
  27.              PRESIONADO ?
  28.              NO, goto  pulsador1
  29.              SI, ENCIENDE
  30.              goto  pulsador2
  31. pulsador2
  32.              PRESIONADO ?
  33.              SI, goto  cortar          ;Si se presiona, interrumpe la Rutina
  34.              NO, segundo = 20 ?   ; Ejemplo:  Mira si segundo llegó a 20
  35.              SI, goto  cortar          ;Terminó la cuenta programada
  36.              NO, goto  pulsador2     ; Aun no, sigue contando
  37. cortar
  38.              CORTA
  39.              resetea  segundo
  40.              goto  pulsador1
Hasta ahi todo bien, funciona de maravilla, pausa el conteo, o si le reseteo el registro segundo inicia de cero.

Ahora he intentado, hacer lo mismo pero, a la interrupción del TMR0 le agregué una rutina ( MINU ) de 1 minuto y en cada minuto me incrementa un registro.
Luego chequeo un pulsador para cortarlo.
Código: ASM
  1. cblock  0x0C
  2. Contador
  3. MINU     ;Rutina que cuenta de minutos deseados a contar.
  4. endC
  5.         org    0x04                  ;Vector de interrupción
  6.         goto    Interrupcion
  7.         org    0x05
  8.  
  9. Interrupcion      
  10.         bcf       INTCON,T0IF     ;Repone flag del TMR0
  11.         decfsz     Contador,F     ;Decrementa contador. Ha habido 100 interrupciones?
  12.         goto     Seguir              ;No, no han pasado los 1000 mS = 1 SEGUNDO
  13. Con_si_0
  14.         call    minuto               ; LLAMA RUTINA DE MINUTO
  15.         incf    MINU,f               ; REGISTRO QUE INCREMENTA MINUTOS A CONTAR.
  16.         movlw     .100
  17.         movwf     Contador        ;Repone contador para contar 100 interrupciones
  18. Seguir        
  19.         movlw     ~.39        
  20.         movwf     TMR0             ;Repone el TMR0 con 39
  21.         retfie                           ;Retorno de interrupción
  22.  
  23. ;=================================================================
  24.  Ejemplo resumido, sin antirebotes ni muchos detalles
  25.  Se trata de chequear si MINU llega a 20
  26.  
  27. pulsador1
  28.              PRESIONADO ?
  29.              NO, goto  pulsador1
  30.              SI, ENCIENDE
  31.              goto  pulsador2
  32. pulsador2
  33.              PRESIONADO ?
  34.              SI, goto  cortar            ; Si se presiona, interrumpe la Rutina
  35.              NO, MINU = 20 ?         ;Ejemplo:  Mira si MINU llegó a 20
  36.              SI, goto  cortar            ;Terminó la cuenta programada
  37.              NO, goto  pulsador2      ;Aun no, sigue contando
  38. cortar
  39.              CORTA
  40.              resetea  MINU
  41.              goto  pulsador1
Y ahora pareciera que el TMR0 queda pegado en la rutina de 1 MINUTO y no chequea el pulsador2.
Me parece raro, ya que se supone que el TMR0 es independiente al resto del programa .....

Y porque en el primer programa ejemplo funciona y en el segundo no ? ....
Gracias a quien pueda sacarme la dura !!!
Vangeluz

Desconectado Vangeluz

  • PIC12
  • **
  • Mensajes: 74
    • Vangeluzweb
Re: Como parar o cancelar el Timer0 o TMR0 ?
« Respuesta #6 en: 16 de Octubre de 2014, 00:46:54 »
Corregido el problema:
Quería meter una enorme rutina dentro del TMR0 y se colgaba hasta terminar el desborde,
por eso no me reconocía los pulsadores.
Solucion: utilizar la rutina de 10ms y usar registros para llegar a mayores !!!
Vangeluz


 

anything