Hola a todos, después de estar liado por las clases durante un par de dias he vuelto para explicaros otro de los módulos que nos podemos encontrar en un microcontrolador, y quizás uno de los que mas vamos a utilizar. Este es el modulo de los Temporizadores, y lo digo en plural ya que los microcontroladores suelen llevar mas de uno, en concreto los microcontroladores que utilizamos (18f4550/18f2550) disponen de 3 temporizadores de 16 bits, y uno de 8 bits. Antes de explicar los registros que debéis configurar y demás, vamos a explicar como funciona el temporizador.
Un temporizador, o mas bien dicho contador, es un modulo que como su nombre indica, cuenta eventos, en el caso del temporizador, cuenta ciclos de instrucción que en los microcontroladores ocurren cada 4 dividido por la frecuencia de oscilación segundos. Es decir, este modulo incrementara su valor con una frecuencia de 4/Fosc. Como nada es infinito, el contador tiene un limite, y es ahí donde entran los 8 o 16 bits. Los temporizadores de 8 bits, pueden contar hasta 255, mientras que los de 16 bits pueden contar hasta 65536 (2^8 y 2^16). Una vez el contador ha llegado a uno de estos valores, hará dos cosas, la primera es que se reiniciará, y la segunda, y la que nos interesa, generará un cambio en un bit de un registro, que será el que mediante programación podremos detectar y actuar en consecuencia. Otra de las caracteristicas que tienen los temporizadores es que no es necesario que empiecen desde 0, sino que nosotros podemos decirle en que valor queremos que empiece a contar. Esto nos sirve para que seamos nosotros los que decidamos cuantas veces tiene que contar de una forma que veremos mas adelante.
En resumen, tenemos un modulo que ira incrementando su valor desde el valor que nosotros digamos cuando pase un determinado tiempo conocido, y cuando este llegue a su límite nos generara un cambio en un bit que leeremos y actuaremos.
Para poder configurar todos estos valores existen los registros de configuración, que en el caso de los temporizadores son los registros TxCON, donde la x nos dice el número de temporizador. Para no hacer esta entrada demasiado larga, vamos a centrarnos en el temporizador numero 0, ya que los demas son bastante parecidos. Lo primero que vamos a ver es el diagrama de bloques del temporizador.
Diagrama de Bloques Temporizador 0 |
Repasando el diagrama de izquierda a derecha, en primer lugar tenemos el tipo de eventos que va a contar nuestro temporizador, que puede ser o pulsos de un pin, o la frecuencia de oscilación dividida entre 4. Esto lo podemos configurar mediante el bit T0CS. a continuación tenemos algo de lo que no hemos hablado hasta ahora pero es igualmente importante, y es el preescalar, en el que simplemente le decimos si queremos que incremente su valor por cada evento, o por cada 2 eventos, 4. . . es decir, multiplicaremos el tiempo que tarda en llegar a su limite por el valor que pongamos en el preescalar. Así pues como veis, este valor del preescalar se selecciona con los bits T0PS2;T0PS0. Siempre podemos elegir si trabajar o no con preescalar, esto lo configuraremos con el bit PSA. Una vez configurado el temporizador, este almacena la configuración y se sincroniza con el reloj interno, y empieza a contar y a almacenar su valor en los registros TMR0H y TMR0L si utilizamos 16 bits, y solo el TMR0L si trabajamos con 8 bits. Hay que recordar que estos registros son de lectura y de escritura. A continuación os muestro el registro que debemos configurar.
Registro T0CON |
En este registro podemos encontrar los bits d elos que hemos hablado antes T0CS, PSA, T0PS2;T0PS0, pero tenemos otros que todavía no conocemos como son el TMR0ON, que como habréis deducido sirve para activar o desactivar el temporizador, T08BIT, con el que elegiremos trabajar con 8 o 16 bits, y el T0CS con el que, si hemos elegido contar los eventos del pin en vez del temporizador, podremos decidir contar en los flancos de subida, o de bajada.
Por último, hemos dicho que cuando el temporizador llega a su límite pone a 1 un bit pero no hemos especificado cual. Para eso hace falta ir al registro INTCON que el el registro de interrupciones, y ahi el bit que cambia su valor es el TMR0IF.
En la próxima entrada pondré un ejemplo de uso del temporizador.
Un saludo
No hay comentarios:
Publicar un comentario