Autor Tema: Duda Timers 8051  (Leído 4357 veces)

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

Desconectado NiponWar

  • PIC10
  • *
  • Mensajes: 13
Duda Timers 8051
« en: 09 de Julio de 2009, 12:05:14 »
Hola a todos.

Estoy iniciandome en la programación C para los micros y he comenzado con el 8051 y me ha surgido una duda con los timers y las interrupciones de estos.

Mi duda es una vez entre en la interrupcion si dentro de ella hay que inicializar o finalizar la cuenta de los timers, es decir, poner a 0 o 1 el bit TRn. Se que esto tiene que ser una tonteria pero tengo varios codigos de ejemplo y alguno lo hacen y otros no, y no me aclaro mucho. Creo que al ser los Timers 0 y 1 y al estar en el Modo 0 o 1, se hace siempre ya que hay que hacer de forma manual la recarga de la cuenta, pero y en los demas modos y en los demas timers?

Saludos.

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: Duda Timers 8051
« Respuesta #1 en: 09 de Julio de 2009, 15:49:32 »

Dentro de la interrupción se debe ó no reiniciar la cuenta del contador, dependiendo del módo de trabajo del timer.

Los modos de trabajo se configuran en el registro TMOD, y son :

Modo 0: 13-bit Timer.
Modo 1: 16-bit Timer
Modo 2: 8-bit auto-reload
Modo 3: Split timer mode

Si estas usando el modo auto-reload (autorecargable) no tenes que volver a inicializar dentro de la interrupción, ya que el timer recarga el registro automáticamente copiando el valor de TH0 a TL0 ( éste ultimo es el registro de cuenta).
En todos los demás modos de trabajo del timer debes reiniciar la cuenta, de lo contrario inicia en 0.

Otra cosa que debes  tener en cuenta,  para que se produzca la interrupción en el overflow ( desborde del timer), es setear en el registro TMOD el bit de GATE.

Todo esto parece difícil, pero en realidad es muy facil, se aclara con el siguiente ejemplo:

Código: [Seleccionar]
/*
Este ejemplo configura el timer 0 como contador autorecargable. Una vez iniciado el timer se bloquea el programa porque no hay nada que hacer.
De todas formas el timer continua contando. En el overflow se produce un salto al handler de interrupción
del timer, que lo unico que hace es cambiar el estado del pin P1_0. Luego vuelve al programa principal, donde continua bloqueado.
La cuenta del timer se recarga en AA luego del overflow, ya que funciona como contador de 8 bits autorecargable.
*/

#include "reg_c51.h"
void main(void)
{
TMOD &= 0xF0; /*Timer 0 en modo 2: Contador autorecargable */
TMOD |= 0x0A; /* GATE0=1; C/T0#=0; T0M1=1; T0M0=0; */

TH0 = 0xAA;        /* Valor inicial de autorecarga */
TL0 = 0xAA; /* Valor inicial del contador
ET0=1; /* Configura interrupción de timer 0 */
EA=1;                       /* Habilita interrupciones */
TR0=1; /* Inicia timer0 */
while(1); /* Bloquea programa, pero aqui podrica hacer lo que desee */
}  


/**
Handler de atención a interrupción
 */
void it_timer0(void) interrupt 1 /* interrupt address is 0x000b */
{
TF0 = 0;                   /* Pone a 0 el flag de interrupción */
P1_0 = ~P1_0; /* Invierte el estado de P1.0  */
}

« Última modificación: 09 de Julio de 2009, 16:08:10 por alexysar »

Desconectado NiponWar

  • PIC10
  • *
  • Mensajes: 13
Re: Duda Timers 8051
« Respuesta #2 en: 18 de Julio de 2009, 15:09:56 »
Muchas gracias.

Me ha surgido otra duda sobre los Timers, que yo haya entendido los Timers estan activo el tiempo de cuenta que tu le des, por lo que aqui mi duda, la planteo con un ejemplo.

Tenemos un Timers de 16 bits, es decir, la maxima cuenta que podemos hacer con el es de 65535 Tics. Supongamos que queremos que cuente 10 ms. Lo configuramos con una frecuencia de Timer igual a 1 Mhz, por lo que hacemos que 1 microseg. sea igual a 1 Tic.

Ok, todo listo, ahora aqui mi duda, que diferencia hay entre meterle el valor de cuenta directamente igual a 10.000 o hacerlo como 65.535 - 10.000?, es que en la mayor parte de los ejemplos que he visto lo hace de la segunda forma y no se si seria igual hacerlo de la primera.

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: Duda Timers 8051
« Respuesta #3 en: 19 de Julio de 2009, 00:50:30 »
Es que el timer salta al Handler ( rutina de atención) cuando llega al máximo(overflow), en este caso cuando pasa los  65535. Por lo tanto se debe cargar en 65535-Valor deseado.

Si lo cargas con 10000 saltaría al handler a los 65536-10000=55536, que en tu caso representan 55,5ms.

Como vos decís se puede hacer de muchas formas distintas pero la más directa es esta.