Hola que tal, queria saber si alguien me podria poner algun ejemplo basico y facil explicado sobre usar el TMR0 como temporizador, ya que hay muchisimos ejemplos, pero la verdad se me hace lío entenderlo.
Se que alguien puede tener una forma sencilla de explicarlo de tal forma que pueda mi cabeza dura entender.
Por ejemplo lo que yo hago ( por supuesto sin usar el TMR0 )
Un estúpido ejemplo de 1 segundo, muy tonto, pero para que se entienda seria el siguiente:
Con este ejemplo anterior todo bien, pero no puedo hacer nada mas durante ese segundo.
Ni siquiera podría, cancelar la temporización.
Otro ejemplo que yo es el que uso, seria algo parecido, con la diferencia de que para llegar al segundo, cuenta de a 10ms.
Seria algo asi:
Este es el metodo que uso, logico quito la exactitud de los tiempos que pierdo en testear boton y todo eso.
Uso este tipo de rutinas para todo aun para contadores de horas, logre hacer contadores de 6 horas con 5 segundos de diferencia en 1 hora ( que es demasiado ), ademas he hecho temporizadores de 1000 horas y no logro exactidud.
A ver si me pueden dar un ejemplo simple por favor que sea facil de entender.
He visto algunos ejemplos que no se si se adaptan a lo que quiero he visto algo asi pero para el 16f876A y yo quisiera algo con el 16f84a:
Segun el programa anterior si a Contador le agrego 100 contaria un segundo, lo que no entiendo como manejarlo con un boton ( osea con un boton hacer la interrupcion y cancelarla, y de mientras poder hacer otras cosas por ejemplo navegar por un menu en un lcd etc .....
Desde ya muchas gracias a quien me pueda explicar con sus propias palabras que hay en el codigo anterior ya que no entiendo nadita de nada, y ya he leido muchos post y la hoja de datos y no lo llego a entender claramente como usarlo .... Gracias a todos !!! ...
Se que alguien puede tener una forma sencilla de explicarlo de tal forma que pueda mi cabeza dura entender.
Por ejemplo lo que yo hago ( por supuesto sin usar el TMR0 )
Un estúpido ejemplo de 1 segundo, muy tonto, pero para que se entienda seria el siguiente:
Código:
pic 16f84a .... bla bla bla bla !!!!
leoboton
btfsc PORTA,0 ; leo si se presiona
goto leoboton ; NO vuelvo a leer
call retardo_20ms ; miro rebotes
btfsc PORTA,0
goto leoboton
call rutina_1_segundo
goto leoboton
rutina_1_segundo
Por supuesto aca la rutina que tarda un segundo
que no es necesario ya que no es lo que me interesa.
return
Con este ejemplo anterior todo bien, pero no puedo hacer nada mas durante ese segundo.
Ni siquiera podría, cancelar la temporización.
Otro ejemplo que yo es el que uso, seria algo parecido, con la diferencia de que para llegar al segundo, cuenta de a 10ms.
Seria algo asi:
Código:
pic 16f84a .... bla bla bla bla !!!!
Cblock 0x0C
Contador ; Agrego un estúpido contador
Endc
leoboton
btfsc PORTA,0 ; leo si se presiona
goto leoboton ; NO vuelvo a leer
call retardo_20ms ; miro rebotes
btfsc PORTA,0
goto leoboton
call rutina_10_ms
goto leoboton
rutina_10_ms
movl d\'100\'
movwf Contador ; Contador = 100
cuenta
( aca la rutina de 10ms ) ;
btfsc PORTA,0 ; Esta presionado ?
goto $+3
clrf Contador
return ; retorno a leoboton
decfsz Contador,f ; Contador - 1
goto cuenta
clrf Contador
return ; retorno a leoboton
Este es el metodo que uso, logico quito la exactitud de los tiempos que pierdo en testear boton y todo eso.
Uso este tipo de rutinas para todo aun para contadores de horas, logre hacer contadores de 6 horas con 5 segundos de diferencia en 1 hora ( que es demasiado ), ademas he hecho temporizadores de 1000 horas y no logro exactidud.
A ver si me pueden dar un ejemplo simple por favor que sea facil de entender.
He visto algunos ejemplos que no se si se adaptan a lo que quiero he visto algo asi pero para el 16f876A y yo quisiera algo con el 16f84a:
Código:
pic16f876a
Cblock 0x0C
Contador
EndC
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
movlw .50
movwf Contador ;Repone el contador nuevamente para contar 50 interrupciones
movlw b\'10000000\'
xorwf PORTB,F ;RB7 cambia de estado
Seguir
movlw ~.39
movwf TMR0 ;Repone el TMR0 con 39
retfie ;Retorno de interrupción
Inicio
clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw 0x06
movwf ADCON1 ;Puerta A digital
movlw b\'00111111\'
movwf TRISA ;Puerta A se configura como entrada
movlw b\'00000111\'
movwf OPTION_REG ;Preescaler de 256 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0
;====================================================================================
;El TMR0 se carga con 39. Con un preescaler de 256 y a una frecuencia de 4MHz se obtiene una interrupción
;cada 10mS. Se habilita la interrupción del TMR0.
;====================================================================================
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
;================================================================================
;Este es el cuerpo principal del programa. Consiste en leer constantemente el estado de RA0 y RA1 para visualizar
;sobre RB0 y RB1 sin que cambie el estado actual de RB7
;================================================================================
Loop
btfsc PORTA,0 ;Testea el estado de RA0
goto RA0_ES_1
bcf PORTB,0 ;Desactiva RB0
goto TEST_RB1
RA0_ES_1
bsf PORTB,0 ;Activa RB0
TEST_RB1
btfsc PORTA,1 ;Testea el estado de RA1
goto RA1_ES_1
bcf PORTB,1 ;Desactiva RB1
goto Loop
RA1_ES_1 bsf PORTB,1 ;Activa RB1
goto Loop
end ;Fin del programa fuente
Segun el programa anterior si a Contador le agrego 100 contaria un segundo, lo que no entiendo como manejarlo con un boton ( osea con un boton hacer la interrupcion y cancelarla, y de mientras poder hacer otras cosas por ejemplo navegar por un menu en un lcd etc .....
Desde ya muchas gracias a quien me pueda explicar con sus propias palabras que hay en el codigo anterior ya que no entiendo nadita de nada, y ya he leido muchos post y la hoja de datos y no lo llego a entender claramente como usarlo .... Gracias a todos !!! ...
Última edición por un moderador: