Autor Tema: Temporizador de pic16f887  (Leído 136 veces)

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

Desconectado lunago13

  • PIC10
  • *
  • Mensajes: 11
Temporizador de pic16f887
« en: 29 de Noviembre de 2018, 16:56:38 »
Hola, soy nuevo en todo esto, y queria saber que son y como funciona el temporizador interno del pic. O sea las funciones setup_timer_1(), set_timer1(), get_timer(), y en el setup que significa el prescaler. En mi caso estoy tratando de hacer un programa para utilizar un sensor ultrasonico hc-sr04. El programa en que estoy probando es el proteus 8 profesional y el compilador es el CCS C Compiler. Espero que me puedan ayudar y gracias de antemano.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6994
Re:Temporizador de pic16f887
« Respuesta #1 en: 29 de Noviembre de 2018, 23:41:01 »
Creo que informacion por internet vas a tener de sobra... Asi que voy a intentar ser resumido en la explicacion.

El timer en realidad es un contador.. cada pulso en la entrada (por ahora) que se use para contar va a incrementar en 1, hay timers de 8 (cuenta 256 ) y 16 bits (cuenta 65536 )....

Si usamos para contar el oscilador del reloj del PIC te vas a encontrar con que la frencuencia que llega al modulo del Timer es Fosc/4, o mejor aun pensarlo en termino del periodo, uqe es la inversa de la frencuencia 4/Fosc, supongamos que tenes un cristal de 4Mhz eso significa que tenes un periodo de 4/4Mhz = 1us.

El problema de esto es que para un timer de 8 bits, solo podria contar desde 0 a 255 (0xFF) y luego vuelve a 0 (OVERFLOW)... Siendo tan poco tiempo, se incluye ademas un preescaler que vendria a ser un divisor de frecuencia ( o multiplicador de periodo).... Entonces si pones un preescaler de 1:4 por ejemplo... ahora El timer que antes recibia un pulso cada 1us, lo va a hacer cada 4us..
A pesar que se sigue contando de 0 a 255, ahora eso significa mas tiempo..

Lo util del Timer es la interrupcion debido al overflow. Y que ocurre cuando pasa de 255 a 0 (para el caso de los 8 bits ) por eso se carga con lo que le falta para llegar a los 256... Ejemplo... supongamos que quiero contar 400us... Entonces a 4us por pulso de reloj en la entrada que teniamos con cristal de 4Mhz y preescaler 1:4 necesitaria 100 pulsos. entonces cargamos al Timer la cantidad de 256 - 100 = 156, de esa forma al cumplirse los 100 se produjo el OVERFLOW y ya tenemos un indicador para saber que el tiempo ya paso.

Entonces tenes esas 3 funciones:

setup_timer_1()
Esta configura el timer, el Timer 1 puede recibir pulsos externos asi como del reloj, vos aca vas a definir desde donde toma los pulsos a contar, que preescaler queres, etc.

set_timer1()
Con este le das un valor al Timer,, siguiendo el ejemplo que tuvimos antes para cargar los 156 al timer deberia haber realizado set_timer0(156)

get_timer()
Esta funcion te devuelve el valor que lleva el Timer contando...


------------

Para tu aplicacion de ultrasonido podrias:

- Configurar el Timer
- Al momento de responderte el ECHO ponerlo en 0 y activar el timer 1.
- Al momento de detectar que corto, leer el valor del Timer, (tener ojo de que no se produjo un overflow)

Al leer el valor del Timer es el tiempo transcurrido en pulsos de reloj... Obviamente es importante SABER cuanto tarda cada pulso.. Asi de esa forma saber el tiempo que tarda.


Lo bueno del Timer 1 es que es de 16 bits... y con un preescaler medio grande podes capturar un buen pedazo de tiempo.

Desconectado lunago13

  • PIC10
  • *
  • Mensajes: 11
Re:Temporizador de pic16f887
« Respuesta #2 en: 01 de Diciembre de 2018, 16:25:10 »
Creo que informacion por internet vas a tener de sobra... Asi que voy a intentar ser resumido en la explicacion.

El timer en realidad es un contador.. cada pulso en la entrada (por ahora) que se use para contar va a incrementar en 1, hay timers de 8 (cuenta 256 ) y 16 bits (cuenta 65536 )....

Si usamos para contar el oscilador del reloj del PIC te vas a encontrar con que la frencuencia que llega al modulo del Timer es Fosc/4, o mejor aun pensarlo en termino del periodo, uqe es la inversa de la frencuencia 4/Fosc, supongamos que tenes un cristal de 4Mhz eso significa que tenes un periodo de 4/4Mhz = 1us.

El problema de esto es que para un timer de 8 bits, solo podria contar desde 0 a 255 (0xFF) y luego vuelve a 0 (OVERFLOW)... Siendo tan poco tiempo, se incluye ademas un preescaler que vendria a ser un divisor de frecuencia ( o multiplicador de periodo).... Entonces si pones un preescaler de 1:4 por ejemplo... ahora El timer que antes recibia un pulso cada 1us, lo va a hacer cada 4us..
A pesar que se sigue contando de 0 a 255, ahora eso significa mas tiempo..

Lo util del Timer es la interrupcion debido al overflow. Y que ocurre cuando pasa de 255 a 0 (para el caso de los 8 bits ) por eso se carga con lo que le falta para llegar a los 256... Ejemplo... supongamos que quiero contar 400us... Entonces a 4us por pulso de reloj en la entrada que teniamos con cristal de 4Mhz y preescaler 1:4 necesitaria 100 pulsos. entonces cargamos al Timer la cantidad de 256 - 100 = 156, de esa forma al cumplirse los 100 se produjo el OVERFLOW y ya tenemos un indicador para saber que el tiempo ya paso.

Entonces tenes esas 3 funciones:

setup_timer_1()
Esta configura el timer, el Timer 1 puede recibir pulsos externos asi como del reloj, vos aca vas a definir desde donde toma los pulsos a contar, que preescaler queres, etc.

set_timer1()
Con este le das un valor al Timer,, siguiendo el ejemplo que tuvimos antes para cargar los 156 al timer deberia haber realizado set_timer0(156)

get_timer()
Esta funcion te devuelve el valor que lleva el Timer contando...


------------

Para tu aplicacion de ultrasonido podrias:

- Configurar el Timer
- Al momento de responderte el ECHO ponerlo en 0 y activar el timer 1.
- Al momento de detectar que corto, leer el valor del Timer, (tener ojo de que no se produjo un overflow)

Al leer el valor del Timer es el tiempo transcurrido en pulsos de reloj... Obviamente es importante SABER cuanto tarda cada pulso.. Asi de esa forma saber el tiempo que tarda.


Lo bueno del Timer 1 es que es de 16 bits... y con un preescaler medio grande podes capturar un buen pedazo de tiempo.
Muchas gracias, me sirvio de mucho tu ayuda!