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



## metalfox6383 (Abr 1, 2010)

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.


----------



## baterod3 (Dic 29, 2011)

tambien estoy interesado en el tema, al parecer nadie aporta


----------



## biker2k3 (Dic 29, 2011)

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



```
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
```


----------



## baterod3 (Ene 5, 2012)

Qué es eso?...en pic basic debe ser mas sencillo, asembler muy complicado y extenso


----------



## biker2k3 (Ene 6, 2012)

Eso es pic basic pero tiene unas lineas de assembler


----------



## baterod3 (Ene 7, 2012)

Si bueno me iluminaste, ASM y ENDASM....pero sigo pensando, no habrá algo mas sencillo sin usar asembler?....


----------



## reyvilla (Ene 7, 2012)

baterod3 dijo:


> Si bueno me iluminaste, ASM y ENDASM....pero sigo pensando, no habrá algo mas sencillo sin usar asembler?....



Hola te mencione en el post_ https://www.forosdeelectronica.com/posts/598247/ _,como podrías hacer, si me comentas que es lo que quieres hacer con el TMR0 puedo ver si te ayudo, pero si te sigues quejando de que nadie aporta creo que no conseguirás mucho con eso...saludosss


----------



## biker2k3 (Ene 8, 2012)

baterod3 dijo:


> 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


----------



## D@rkbytes (Ene 9, 2012)

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


----------



## biker2k3 (Ene 9, 2012)

Darkbytes dijo:


> 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



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.


----------



## reyvilla (Ene 9, 2012)

Hace tiempo yo comente algo al respecto en el foro, hay un fulano llamado "DARREL TAYLOR" el cual realizo unas librerías para manejar interrupciones, muy sencillas supuestamente yo aun no me he puesto en eso ya que se manejan una cabecera en asm de 3 lineas les dejo la pagina para que vean de que se trata...saludosss

http://darreltaylor.com/DT_INTS-14/intro.html

y

http://darreltaylor.com/DT_INTS-18/home.html


----------



## baterod3 (Ene 10, 2012)

Darkbytes deberías darle precisión a los segundos, o está bien?


----------



## D@rkbytes (Ene 11, 2012)

Darkbytes dijo:


> (Nada preciso pero sirve de ejemplo) 16F877A


Si note que no tenia precisión el ejemplo.



baterod3 dijo:


> 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. 



biker2k3 dijo:


> 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.


----------



## baterod3 (Nov 9, 2012)

alguien tiene un tutorial en español sobre el uso de timer 0 en pic basic, le agradecería mucho si lo comparte


----------



## D@rkbytes (Nov 9, 2012)

baterod3 dijo:


> 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.


----------



## jorgenuviola (Nov 11, 2013)

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?


----------



## ByAxel (Nov 11, 2013)

jorgenuviola dijo:


> 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.


----------



## jorgenuviola (Nov 11, 2013)

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.


```
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


----------



## ByAxel (Nov 11, 2013)

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.


----------



## jorgenuviola (Nov 13, 2013)

hola axel, esoty usando un 16f84.

¿entoces lo que yo contaria serian la cantidad de  interrupciones? ¿no?


----------



## LaElectronicaMeOdia (Nov 13, 2013)

y si te olvidas del timer si no lo comprendes muy bien e intentas hacerlo con la funcion COUNT

COUNT Pin,Period,Var

Count the number of pulses that occur on Pin during the Period and stores the result in Var.


----------



## jorgenuviola (Nov 14, 2013)

LaElectronicaMeOdia dijo:


> y si te olvidas del timer si no lo comprendes muy bien e intentas hacerlo con la funcion COUNT
> 
> COUNT Pin,Period,Var
> 
> Count the number of pulses that occur on Pin during the Period and stores the result in Var.




la funcion count me detiene le programa por el periodo que cuenta, no me sirve.

El funcionamiento del timer lo entiendo objetivamente, lo que necesito saber es como leo lo que cuenta el timer cuando esta entrando una frecuencia externa, que es justamente lo que nadie me a podido responder aun, en todos los manuales dice que se puede leer el TMR0 en cualquier momento pero nadie lo explica en la forma de hacerlo.


----------



## D@rkbytes (Nov 14, 2013)

jorgenuviola dijo:


> El funcionamiento del timer lo entiendo objetivamente, lo que necesito saber es como leo lo que cuenta el timer cuando esta entrando una frecuencia externa, que es justamente lo que nadie me a podido responder aun, en todos los manuales dice que se puede leer el TMR0 en cualquier momento pero nadie lo explica en la forma de hacerlo.


Mira este sencillo ejemplo, te puede servir para lo que deseas entender.

Suerte.


----------



## ByAxel (Nov 14, 2013)

no tiene tanta magia, se lee igual en cualquier lenguaje... igual como configuras puertos, igual se puede leer y escribir el TMR0 que es un registro de 8 bits.

Ejemplo en ProtonBasic

```
Device = 16F84A

Main:
    OPTION_REG = %00100000
    TRISA = %00010000
    TRISB = 0
    TMR0 = 0
Bucle:    
    DelayMS 100
    PORTB = TMR0
GoTo Bucle
```


----------



## jorgenuviola (Nov 14, 2013)

D@rkbytes dijo:


> Mira este sencillo ejemplo, te puede servir para lo que deseas entender.
> 
> Suerte.



excelente el ejemplo solo que justo ese idioma de asm no lo comprendo, igual mil gracias fue lo mas concreto hasta ahora, voy a ver como puedo interpretarlo y replicarlo en pic basic pro.

muchas gracias





ByAxel dijo:


> no tiene tanta magia, se lee igual en cualquier lenguaje... igual como configuras puertos, igual se puede leer y escribir el TMR0 que es un registro de 8 bits.
> 
> Ejemplo en ProtonBasic
> 
> ...



¿entonces conviene asignar por ejemplo el puerto A4 al tmr0 como lo hago con una variable y despues leer ese puerto asignandole a su vez una variable?

perdon por preguntar, es que quiero comprender su funcionamiento al 100% porque las interrupciones son extremadamente utiles en todo, mas alla que yo quiera hacer un tacometro



darkbytes, aca esta incluyendo una archivo 

INCLUDE	"T0CKI_~1.MAC"

¿ahi esta la configuracion del tmr0? en este tipo de programacion digo en PBP tambien se puede hacer, por eso te pregunto porque podria agregarlo a mi programacion y solamente hacer las cuentas matematicas leyendo el tmr0


----------



## LaElectronicaMeOdia (Nov 14, 2013)

> es que quiero comprender su funcionamiento al 100% porque las interrupciones son extremadamente utiles en todo, mas alla que yo quiera hacer un tacometro



si lo quieres comprender al 100% empieza por diferenciar lo que es un modulo de un pic y una interrupcion. los modulos son como el timer1, timer2, CCP, Comparadores, USART, etc. etc segun cada pic.

esos modulos necesitan configurarse mediante registros y pueden la mayoría, cierto pre-diseñadas situaciones generar una interrrupcion, una interrupcion que genera el modulo significa que "pare" lo que esta haciendo por hacer lo que le digas dentro de la rutina de interrupción, normalmente se tiene que borrar una bandera(flag) que se genera al interrumpirse el programa, para que se vuelva a habilitar la interrupcion.

para leer los registros (que son totalmente independientes y diferentes a una interrupcion), solamente pones en cualquier parte de tu codigo ya sea el bucle principal, una sub-rutina o la rutina de interrupcion:

```
Varia var Byte

Varia=tmr0
```

tmr0 es un registro y *varia* es una variable de 8 bits igual que el registro.

Edito:

y yo tambien pienso que no es necesario utilizar la interrupcion del timer0 para hacer un tacometro.


----------



## ByAxel (Nov 14, 2013)

jorgenuviola dijo:


> ¿entonces conviene asignar por ejemplo el puerto A4 al tmr0 como lo hago con una variable y despues leer ese puerto asignandole a su vez una variable?
> 
> perdon por preguntar, es que quiero comprender su funcionamiento al 100% porque las interrupciones son extremadamente utiles en todo, mas alla que yo quiera hacer un tacometro



- Buscas que el Timer0 trabaje como contador de pulsos externos? si, entonces se configura el RA4 como entrada, en OPTION_REG se indica que los pulsos de conteo para el Timer0 provienen del pin RA4.
- Sin pre-divisores, por cada pulso en RA4 se incrementa +1 el valor del *registro TMR0*.
- Se puede leer el valor TMR0 en cualquier momento, sea o no interrupción como el ejemplo que planteo.
- El registro TMR0 se puede leer y escribir en cualquier momento.

En resumen, basta con leer el valor del TMR0 y asignarlo a otra variable para luego hacer operaciones.


----------



## D@rkbytes (Nov 15, 2013)

jorgenuviola dijo:


> excelente el ejemplo solo que justo ese idioma de asm no lo comprendo, igual mil gracias fue lo mas concreto hasta ahora, voy a ver como puedo interpretarlo y replicarlo en pic basic pro.


El ejemplo está escrito en *PICBasic Pro*, No está en lenguaje *ensamblador*.
El archivo del programa en *PBP* se llama *T0CKI_Cnt.pbp* (*.pbp = PIC BASIC PROJECT)
Los otros archivos que están en la carpeta son los que genera el compilador y los de simulación en ISIS.
También se le puede cambiar la extensión a **.bas*. Pero yo Utilicé *MicroCode Studio* para escribir el programa y **.pbp* es la extensión que *MCS* usa por defecto para sus proyectos.


jorgenuviola dijo:


> D@rkbytes, acá está incluyendo un archivo
> 
> INCLUDE    "T0CKI_~1.MAC"
> 
> ¿Ahí esta la configuración del tmr0? en este tipo de programación digo  en PBP también se puede hacer, por eso te pregunto porque podría  agregarlo a mi programación y solamente hacer las cuentas matemáticas  leyendo el tmr0


En el archivo que te mencioné "*T0CKI_Cnt.pbp*" está la configuración de los registros *INTCON* y *OPTION_REG*.
Ese archivo es el del programa en *PICBasic Pro* que debes abrir con *MicroCode Studio*.

Suerte.


----------



## jorgenuviola (Nov 15, 2013)

quiero agradecer a todos el trabajo que se tomaron por responder, voy a hacer tal cual como me dijo axel, que mas o menos en la programación que yo venia haciendo apuntaba a eso y les prometo contarles el resultado asi completamos el post para todo aquel que busque hacer lo mismo.





LaElectronicaMeOdia dijo:


> si lo quieres comprender al 100% empieza por diferenciar lo que es un modulo de un pic y una interrupcion. los modulos son como el timer1, timer2, CCP, Comparadores, USART, etc. etc segun cada pic.
> 
> esos modulos necesitan configurarse mediante registros y pueden la mayoría, cierto pre-diseñadas situaciones generar una interrrupcion, una interrupcion que genera el modulo significa que "pare" lo que esta haciendo por hacer lo que le digas dentro de la rutina de interrupción, normalmente se tiene que borrar una bandera(flag) que se genera al interrumpirse el programa, para que se vuelva a habilitar la interrupcion.
> 
> ...




clarisimo!!! el tema es que se que se puede hacer con count, de hecho hice uno asi, pero me detiene el programa  y no me sirve.  ¿conoces alguna otra manera de hacer uno que no me frene el programa principal para detenerse a contar?

en mi proyecto el tacometros es une elemento escencial que hace al funcionamiento del programa principal, debe existir y no debe molestar al programa principal (no mucho al menos) porque estare trabajando con los tiempos muy acotados.





ByAxel dijo:


> - Buscas que el Timer0 trabaje como contador de pulsos externos? si, entonces se configura el RA4 como entrada, en OPTION_REG se indica que los pulsos de conteo para el Timer0 provienen del pin RA4.
> - Sin pre-divisores, por cada pulso en RA4 se incrementa +1 el valor del *registro TMR0*.
> - Se puede leer el valor TMR0 en cualquier momento, sea o no interrupción como el ejemplo que planteo.
> - El registro TMR0 se puede leer y escribir en cualquier momento.
> ...





venia encaminado a esto y sin lugar a duda respondiste mi duda principal axel, voy a ajustar el programa a esto, prometo contar el resultado



D@rkbytes dijo:


> El ejemplo está escrito en *PICBasic Pro*, No está en lenguaje *ensamblador*.
> El archivo del programa en *PBP* se llama *T0CKI_Cnt.pbp* (*.pbp = PIC BASIC PROJECT)
> Los otros archivos que están en la carpeta son los que genera el compilador y los de simulación en ISIS.
> También se le puede cambiar la extensión a **.bas*. Pero yo Utilicé *MicroCode Studio* para escribir el programa y **.pbp* es la extensión que *MCS* usa por defecto para sus proyectos.
> ...



pucha, no lo abri con el microcode, lo abri con la vista rapida, ahi lo abro y lo leo, muchas gracias!!!!

---------- Actualizado después de 1 hora ----------

Gracias D@rkbytes



```
;*************************************************  ******************************
; Programa: T0CKI_Cnt.pbp
; Versión: 1.0
; Autor: D@rkbytes
; Compañia: Digitek
; Fecha: 08/16/2013
; Hora: 01:34:17 p.m.
; Notas: 
; Contador por T0CKI
;*************************************************  ******************************
@ DEVICE PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,WDT_OFF,MCLR_ON,PWRT_ON,BOD_OFF  ,LVP_OFF
;*************************************************  ******************************
DEFINE OSC 4    ; Definir que se trabajará con 4MHz. (Osc. Interno)
 
; Definición de pines para la pantalla.
Define LCD_DREG PORTB        ; Puerto de datos.
Define LCD_DBIT     4        ; Bit de inicio de datos.
Define LCD_RSREG PORTA        ; Puerto de RS (Register Select)
Define LCD_RSBIT    1        ; Pin para RS
Define LCD_EREG PORTA        ; Puerto de E (Enable)
Define LCD_EBIT     0        ; Pin para E
 
CMCON = 7                   ; Comparadores analógicos OFF
 
; Declaración de variables
Contador    Var Word
 
Inicio:
    INTCON      = %11100000 ; Habilitar interrupciones
    OPTION_REG  = %10100011 ; Habilitar conteo por T0CKI (Div/16)
    TMR0 = 0                ; Limpiar TMR0
 
    LCDOut $FE,1," Contador T0CKI"
 
 
Programa:
    Contador = TMR0         ; Cargar el valor de TM0 en Contador
    Contador = Contador *100
    LCDOut $FE,$C0,"Frec: ",Dec Contador
    TMR0 = 0                ; Resetear el TMR0
    Pause 160               ; Contar durante 160Ms.(Prescaler 1:16)
    GoTo Programa           ; Crear un bucle infinito
 
    End
 
 
 
 
 
 
 
;      __________________________________________________  ____________
;    /\  Código generado con PIC16F628A Config v1.4 - By D@rkbytes  \
;    \_|            ****************************************         |
;      |           / Descárgalo gratuitamente desde...    /          |
;      |          /     [URL="http://www.galeon.com/exodusklient"]www.galeon.com/exodusklient[/URL]      /           |
;      |         ****************************************            |
;      |                                                             |
;      |             Visita: [URL="http://www.forosdeelectronica.com"]www.forosdeelectronica.com[/URL]              |
;      |                                                             |
;      |                             \|||/                           |
;      |                             (o o)                           |
;      |  ________________________ooO-(_)-Ooo________________________|__
;      \_/__________________________________________________  ___________/
```


----------



## D@rkbytes (Nov 15, 2013)

jorgenuviola dijo:


> pucha, no lo abri con el microcode, lo abri con la vista rapida, ahi lo abro y lo leo, muchas gracias!!!!
> 
> ---------- Actualizado después de 1 hora ----------
> 
> Gracias D@rkbytes


De nada. 

Estoy viendo que en este programa no es necesaria la configuración del registro INTCON.
Por lo tanto la puedes omitir y tan solo dejar la configuración del registro OPTION_REG que es donde se configura el incremento del TMR0 por el pin RA4 (T0CKI) ya sea por flanco ascendente o flanco descendente y también la configuración del prescaler asignado al TMR0.

Saludos.


----------

