¿Cómo se usa el módulo TIMER del PIC en PICBasic?

#1
Hola:

Bueno, como lo dice el título del tema: ¿Cómo utilizo el módulo TIMER de cualquier PIC que lo tenga utilizando lenguaje PICBasic?

Gracias.
 
#3
Si necesitas mucha exactitud, no te va a servir en picbasic. Pero sería algo así...


Código:
goto INITIALIZE
DEFINE INTHAND Int_Vector   ' Handler de Interrupcion

;disable
ASM
Int_Vector
    MOVWF wsave             ; Guardamos el registro W
    MOVF STATUS,W
    CLRF STATUS             ; Guardamos el registro STATUS
    MOVWF ssave
    MOVF PCLATH,W           ; Guardamos el registro PCLATH
    MOVWF psave
    CLRF PCLATH
ENDASM
;############ INTERRUPT CODE ###############
if INTCON.2 = 1 then   ;######## TIMER ########
 INTCON.2 = 0           ;Borra la bandera TMR0
 TMR0 = 226             ;(226) cada 100us a 20mhz y con 1/16     227
 ;Hace lo ke kieras
 RESUME
endif

Resume


ASM   ;****** Fin de Interrupcion ***********
End_Int
    CLRF STATUS
    MOVF psave,W
    MOVWF PCLATH                     ; Restauramos el registro PCLATH
    MOVF ssave,W
    MOVWF STATUS                     ; Restauramos el registro STATUS
    SWAPF wsave,F
    SWAPF wsave,W                    ; Restauramos el registro W
    RETFIE
ENDASM

;################ REGISTROS ######################
INITIALIZE:


OPTION_REG = %10000011  ;pull-up off    ;flanco descendente ; temporizador ;inc flanco ascendente
                        ;Divisor TMR0   ;1/16 
INTCON = %10100000      ;Activa interrupcion Global, y TMR0
 
Última edición por un moderador:
#8
Si bueno me iluminaste, ASM y ENDASM....pero sigo pensando, no habrá algo mas sencillo sin usar asembler?....
Si, entra en la carpeta "Samples" de pic basic pro y mira y abri el archivo timer.bas

sino podes buscar en el foro y en google, y si necesitas un buen manejo de interrupciones, pic basic pro no te sirve porque no tiene interrupciones por hardware. Lo mas cercano es poniendo algunas instrucciones en asm
 
#10
Un pequeño ejemplo de interrupción externa por Hardware (PBP) con un 16F628A
Y otro de un reloj usando el TMR0 (Nada preciso pero sirve de ejemplo) 16F877A :apreton:
Esa es una interrupcion por "Hardware" porque se activa con un boton, pero internamente el pic no la realiza por hardware porque por ejemplo si pones una pausa de 5 segundos y apretas el boton de la interrupcion, esta no se va a ejecutar inmediatamente, sino hasta que pasen los 5 segundos de la pausa. En proton o ASM esto no pasa, se ejecuta inmediatamente.
 
#13
(Nada preciso pero sirve de ejemplo) 16F877A :apreton:
Si note que no tenia precisión el ejemplo.

Darkbytes deberías darle precisión a los segundos, o está bien?
No lo escribi yo.
Si te fijas en la cabecera del programa esta el nombre del autor.
Que es mas que nada el nombre de la pagina en donde estaba ese ejemplo.
Yo solo lo edite porque estaba en Ingles. :apreton:

Esa es una interrupcion por "Hardware" porque se activa con un boton, pero internamente el pic no la realiza por hardware porque por ejemplo si pones una pausa de 5 segundos y apretas el boton de la interrupcion, esta no se va a ejecutar inmediatamente, sino hasta que pasen los 5 segundos de la pausa. En proton o ASM esto no pasa, se ejecuta inmediatamente.
Si, efectivamente tienes razón. Yo no suelo trabajar con interrupciones,
por eso no lo habia notado. :D
 
Última edición:
#15
alguien tiene un tutorial en español sobre el uso de timer 0 en pic basic, le agradecería mucho si lo comparte
Saludos.
Espero que estos tutoriales sobre el uso de los timers sean de ayuda.

Nota: La información no está en lenguaje PICBasic. Es solo información de su uso.

Suerte.
 

Adjuntos

Última edición:
#16
hola a todos, me acoplo al tema, estoy tratando de hacer un tacometro, no tiene que ser extremadamente preciso.

ahora necesitaria saber lo siguiente que explica este texto

Para que el TMR0 funcione como contador de impulsos aplicados a la patita
T0CKI hay que poner a 1 el bit T0CS, que es el que ocupa la posición 5 del
registro OPTION. En esta situación, el registro TMR0, que es el ubicado en la
dirección 1 del banco 0 de la memoria de datos, se incrementa con cada flanco
activo aplicado en la patita T0CKI
. El tipo de flanco activo se elige programando
el bit T0SE, que es el que ocupa la posición 4 del registro OPTION. Si T0SE =
1, el flanco activo es el descendente, y si T0SE=0, es el ascendente. Cuando
se desea que TMR0 funcione como temporizador el bit T0CS=0.


pregunto de ignorante, ¿ese registro de la memoria lo guarda en al eprom y lo puedo leer con el comando READ?
 
#17
pregunto de ignorante, ¿ese registro de la memoria lo guarda en al eprom y lo puedo leer con el comando READ?
El registro TMR0 almacena el conteo, este registro está en la memoria RAM y no tiene ninguna relación con la EEPROM. El TMR0 es un registro de 8 bits por lo que la cuenta va de 0 a 255 y vuelve a empezar.
Para un tacómetro es necesario iniciar este registro en cero e iniciar una base de tiempo de por ejemplo 1 segundo/minuto, de ese modo cuenta los pulsos en 1 segundo/minuto y luego calculas la velocidad... en rpm por ejemplo.
Más recomendable es hacer el conteo manualmente mientraz dura la base de tiempo ya que puede que el registro no alcance puesto que solo es hasta 255.
El TMR0 es un registro de conteo y en OPTION_REG se configura.
 
#18
Axel, diste en el clavo de lo que estoy tratando de hacer hace varios días, entiendo perfectamente el funcionamiento del TMR0 según los manuales y alguna prueba con el timer interno en proteus, mi pregunta que no la hice en este post pero la vengo haciendo en distintos lugares hace bastante tiempo y nadie me la sabe responder, es......


¿como leo el conteo del TMR0 y lo paso a una variable en pic basic pro? Así puedo hacer lo que yo quiera con esos datos, sea multiplicar, restar etc.

te muestro mi programación que no tengo lista la rutina de interrupción porque no se como hacerla y no logro encontrar un solo ejemplo en pic basic que me permita conocer la mecánica de esta técnica.

Mi intención con el siguiente programa es mostrar lo que sea que lee del TMR0 pero no funciona.

use un prescaler 1:256 para que desborde en el conteo y active el TOCK para que el port A4 tome la señal de pulsos.

Código:
define osc 10
define lcd_dreg porta
define lcd_bits 4
define lcd_dbit 0
define lcd_rsreg portb
define lcd_rsbit 1
define lcd_ereg portb
define lcd_ebit 3
TOCK var byte
X var byte
on interrupt goto rpm
symbol toif = intcon.2
symbol gie = intcon.7
symbol B = tmr0
option_reg = %00110111
intcon = %10100100
a:
high porta.2
pause 500 
low porta.2
pause 500
goto a
rpm:
disable

lcdout $fe,1
lcdout $fe,2
lcdout B
toif = 0
gie = 1
tmr0 = 0
enable
resume
end

¿alguna ayuda?



y si es necesario hacerlo mas facil se lo asiganmos al perro guardian en modod 1:1 para hacer numeros redondos, pero necesito aprender como hacer para leer la informacion almacenada en TMR0
 
Última edición por un moderador:
#19
bueno...
que PIC estas usando?
1ro. Si el bit 6 del INTCON dice PEIE, entonces falta activar. Con eso permites las interrupciones de periféricos como el Timer0.

cuanto seria la velocidad máxima que deberia medir el PIC?
2do. El Timer0 solo produce una interrupción cuando el registro TMR0 se desborda (de 255 a 0), si haces 1:256 y el conteo desde cero, va a necesitar 65535 pulsos para que proboque la interrupción... Solo como prueba, configura que use el reloj interno y verifica que se produzca la interrupción junto con la respectiva lectura del conteo del TMR0.

- Solo como sugerencia, el TMR0 solo es contador y se supone que el que manda es el tiempo de 1s o 1minuto, es decir que va a contar pulsos durante 1 segundo para luego determinar la velocidad, así que usar el Timer0 en modo interrupción no lo veo práctico para el tacómetro.
 

Temas similares

Arriba