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

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

Adjuntos

  • 16F628A Contador por T0CKI.rar
    16.5 KB · Visitas: 300
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
Código:
Device = 16F84A

Main:
    OPTION_REG = %00100000
    TRISA = %00010000
    TRISB = 0
    TMR0 = 0
Bucle:    
    DelayMS 100
    PORTB = TMR0
GoTo Bucle
 
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



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
Código:
Device = 16F84A

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

¿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
 
Última edición:
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:
Código:
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. :D
 
Última edición:
¿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.
 
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.
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.
 
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.



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:
Código:
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. :D


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.



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



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

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.

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.

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


Código:
;*************************************************  ******************************
; 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________________________|__
;      \_/__________________________________________________  ___________/
 
Última edición por un moderador:
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. (y)

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.
 
Atrás
Arriba