Autor Tema: Entendiendo el TIMER0 en CCS  (Leído 38727 veces)

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

Desconectado orlandodz09

  • PIC10
  • *
  • Mensajes: 1
Re:Entendiendo el TIMER0 en CCS
« Respuesta #30 en: 24 de Noviembre de 2016, 19:57:05 »
Saludos a todos, soy novato en programación CCS, necesito saber como activar un temporizador que cada vez que se ejecute un "metodo" este salga al inicio del programa después de no recibir ninguna instrucción (un tiempo de 30 segundos), esto necesito ya que mi programa tiene 5 metodos que se ejecutan por usuarios, pero algunos usuarios llegan hasta el tercer metodo (por ejemplo) y lo dejan ahi colgado, entonces necesito que el programa tras 30 segundos de no recibir ninguna ejecucion, este se salga al inicio del programa, es decir realice un rest_cpu 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Entendiendo el TIMER0 en CCS
« Respuesta #31 en: 24 de Noviembre de 2016, 23:20:29 »
Hola orlandodz09

No se que son los "metodos" a cuales te referis.

El TMR0 siempre esta activo, por lo cual no vas a poder activarlo. Siempre esta contando, lo unico que podes llegar a hacer es activar su interrupcion (previo limpiado de su flag y setup al inicio del programa). De esa forma contar la cantidad de interrupciones que ocurren y si superan cierta cantidad ejecutar un reset o plantear que el programa se haga de otra forma.

Desconectado trucksbear

  • PIC10
  • *
  • Mensajes: 10
Re:Entendiendo el TIMER0 en CCS
« Respuesta #32 en: 09 de Diciembre de 2016, 02:05:21 »
Hola, agradecerpía mucho una ayuda para poder entender mejor el TIMER0 como contador, yo necesito contar pulso de bajo a alto, entiendo que selia low_to_high la configuración, y utilizando el prescaler de 1:2 tendría que contar un pulso de 70uS en el pin T0CKI, que al prescaler 1:2 esto serían 140uS, eso es errado o es cierto?
y usar ese conteo si el pulso alto duró 140uS(70uS) para rellenar un vector con un 1 o un 0

como sería el código entonces?
for(i=1, i<41, i++){
if (timer0=140uS){vector ==1}
else{vector ==0}}
eso sería correcto?
lo que no sé bien es como configurar el pin T0CKI para que cuente el ancho de los flancos ascendentes hasta que descienden otra vez a 0
gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Entendiendo el TIMER0 en CCS
« Respuesta #33 en: 09 de Diciembre de 2016, 12:22:18 »
Citar
Hola, agradecerpía mucho una ayuda para poder entender mejor el TIMER0 como contador, yo necesito contar pulso de bajo a alto, entiendo que selia low_to_high la configuración, y utilizando el prescaler de 1:2 tendría que contar un pulso de 70uS en el pin T0CKI, que al prescaler 1:2 esto serían 140uS, eso es errado o es cierto?

Voy a explicarte un poco, pero todo lo demas lo vas a tener que aprender del datasheet del micro. En el datasheet esta TODO.

el LOW_TO_HIGH es para que ingrese un pulso al timer cuando la señal EXTERNA pasa de bajo a alto. Como bien dije, es una señal EXTERNA que entraria por un pin.
Si vos queres saber el tiempo que paso. Usaria mejor el reloj interno, en ves de tomar pulsos de afuera, los tome del mismo reloj que usa el procesador ( Fosc / 4 )
El contador/timer, es un timer de 8 bits, asi que el maximo que puede almacenar es 255 (0xFF), siempre es ascendente, cuando suma 1 mas ocurre que produce un overflow y pasa a 0x00. Es en ese momento que uno debe recargarlo de vuelta y que sabe que paso ya el tiempo cargado.

Supongamos que queres 140us, y tenes un micro con un cristal de 4Mhz, al tener un cristal de 4Mhz el reloj que entra al procesador y al timer es de 4Mhz / 4 = 1Mhz, esto te da un periodo de 1 / 1Mhz = 1us. Entonces el PIC va a sumar 1, cada 1us, si quisieramos que pasen 140us, deberiamos contar 140. Ahora viene la parte "tramposa" de esto.
Como dije antes el timer/contador es siempre ascendente. Por lo cual si quisieramos cargar un valor y que a los 140 llegue a 0, deberiamos cargar 256 - 140 = 116, Cargando 116, cuando cuente 140 va a estar en 0x00 y es ahi donde vamos a tener que cargarlo de nuevo. Esto con preescaler en 1:1, si fuera 1:2 serian 70 pulsos

Citar
lo que no sé bien es como configurar el pin T0CKI para que cuente el ancho de los flancos ascendentes hasta que descienden otra vez a 0

Lo que explique arriba es el funcionamiento del Timer como contador/timer.

Si quisieras hacer eso con el TMR0, deberias leer el pin. Supongamos que queres leer el pulso en alto. Usando el timer y siguiendo el ejemplo de arriba, tenes que cada pulso es 1us.
Leo el pin y espero que se ponga a 1. Al momento que se pone en uno, leo el valor del timer y lo guardo en una variable. Ahora espero el 0, cuando leo cero, guardo ese valor en otra variable.

El ancho va a estar dado por la diferencia de esas 2 variables. Si el timer va a tener "cuentas" de pulsos, pero vos sabes exactamente cuanto tarda cada pulso de reloj, en el ejemplo de 4Mhz el cristal y preescaler 1:1, teniamos que eran 1us por pulso o cuenta del timer, si teniamos preescaler 1:2 son 2us cada cuenta.

Asi podes determinar el ancho de tu pulso con el TMR0