domingo, 7 de noviembre de 2010

Ejemplo Timer0

Hola a todos! como os dije en la entrada anterior, aquí tenéis un ejemplo de utilización del temporizador 0. El ejemplo que he propuesto es muy parecido a nuestro primer Hola Mundo, de trata de un led parpadeando cada segundo.
Lo más complicado de proyectos con temporizador es el cálculo del valor de recarga, pero su cálculo es bastante sencillo siguiendo estos pasos:

  1. Calculamos el tiempo de instrucción, para ello hacemos la operación 4/Fosc. En nuestro ejemplo seria 4/20000000 que da un tiempo de instrucción de 0,2 microsegundos.
  2. Dividimos el tiempo que queremos temporizar, entre el valor del tiempo de instrucción, en nuestro caso que queremos temporizar un segundo, la operación sera 1/0.0000002, que nos da un resultado de 5000000. Esto quiere decir que para temporizar un segundo, es necesario que pasen 5 millones de instrucciones.
  3. A continuación dividimos el numero de instrucciones entre el valor de preescalar, en nuestro caso 256, asi pues 5000000/256 = 19531.25, este valor sera el que tendrá que contar el temporizador.
  4. En el caso de que este valor sea mayor a 65536, deberemos dividirlo entre 65536, y el cociente de esta división nos dará el numero de desbordes que tiene que hacer el temporizador, y el resto, el valor de la primera recarga, es decir, tendrá que hacer x veces 65536, y luego otro mas en el que solo cuente el resto.
  5. Una vez obtenido lo que tiene que contar el temporizador, bien el resto si hay mas desbordes, o bien el numero como es nuestro caso, hay que inicializar el contador para que cuente esa cantidad, para ello restamos el valor nuestro a 65536, con lo que nos queda un valor de recarga de 65536-19531=46005. 
Una vez explicado esto, hay que hacer otra aclaración del programa. Cuando declaramos un puerto como salida, hay ciertos problemas con algunos microcontroladores en leer su estado, para evitar estos problemas, no hay que leer directamente el puerto, sino su LATCH, que si que es completamente legible. Este registro tiene el mismo valor que el puerto, pero no tiene salida al exterior, con lo que podemos hacer todo lo que haríamos con el puerto. Dicho todo esto, aquí va el programa.

#----------------------------------------------------------------
#include <p18F2550.h>

// Bits de configuración
#pragma config WDT=OFF
#pragma config FOSC=HS
#pragma config DEBUG=OFF
#pragma config LVP=OFF
#pragma config MCLRE = OFF            


void main (void)
{
TRISB=0X00; //Configuramos el puerto A como salida
T0CON=0x87; //Activamos temp0, 16bits, preesclar 1:256
PORTB=0X00;

TMR0H=46005>>8; //cogemos los 8 MSB del valor de recarga
TMR0L=46005;    //cogemos los 8 LSB del valor de recarga
while (1){
if(INTCONbits.TMR0IF){   //conprobamos si el temporizador ha llegado al final
INTCONbits.TMR0IF=0; //reiniciamos el flag

if(LATBbits.LATB0==1) //si la salida estaba a 1 la ponemos a 0
PORTBbits.RB0=0;
else //si la salida estaba a 0, la ponemos a 1
PORTBbits.RB0=1;

TMR0H=46005>>8;//volvemos a recargas el temporizador y salimos
TMR0L=46005;
}
}
}
#----------------------------------------------------------------

Espero que os haya sido de ayuda como siempre.

Un saludo

No hay comentarios:

Publicar un comentario