jueves, 26 de febrero de 2015

Microchip PIC: LED + Timer0

Para empezar esta entrega de programas usando los microcontroladores PIC de la empresa Microchip, hemos decidido dedicarle nuestro particular homenaje a un clásico, el PIC16F84A.

Y como no, vamos a realizar el ejemplo clásico por excelencia, el típico "Hola mundo" que traducido en el mundo de los sistemas embebidos, sería el hacer parpadear un LED. Pero este capítulo tiene el propósito de mostrar como usar el periférico interno del PIC llamado Timer0, en nuestro caso, lo configuraremos como temporizador.

Por lo tanto, el ejemplo consistiría en configurar el Timer0 como temporizador y que al desbordarse genere una interrupción. En dicha interrupción, se cambiará el estado del LED.

Antes que mostrar el código, vamos a explicar muy brevemente la mecánica del Timer0 configurado como temporizador. Bien, dicho timer es de 8-bit y para generar tiempos sigue la siguiente expresión:


Tiempo = 4·( 1/f_Timer0_OSC )·( 256 - TMR0 )·Prescaler


Donde:

· Tiempo ≡  Tiempo que se desea generar
· f_Timer0_OSC ≡ Frecuencia del Timer0
· TMR0 ≡  Carga del registro
· Prescaler ≡ Escala para la frecuencia del Timer0


Llegados a este punto, vamos a profundizar un poco más en la expresión del Timer0, ya que creo que merece la pena, por ejemplo, ¿cuál es el tiempo máximo que podemos generar?

La respuesta a esta cuestión será de vital importancia cada vez que trabajemos con el Timer0, vamos a contestarla. Pero para tal fin, vamos a considerar que dicha frecuencia es fija y se conecta a la frecuencia del reloj principal.


· ¿Cuál es el tiempo máximo que podemos generar?

En este caso, el máximo tiempo que podemos generar con el Timer0 será cuando se den las siguientes condiciones:

· TMR0 =  0 ( valor mínimo ) 
· Prescaler = 256 ( valor máximo ) 

Vamos a considerar la frecuencia del Timer0 de 4 MHz ( simplemente para facilitar los cálculos ).


Comprobamos:


Tiempo = 4·( 1/( 4·10^6 ) )·( 256 - 0 )·256 = 65.536 ms


Con las características anteriormente mencionadas, obtendríamos un tiempo de 65.536 ms.

Por lo tanto, en caso de que esté habilitada el servicio de interrupción del Timer0, esto significa que se producirá una interrupción cada, aproximadamente 65.536 ms.

En caso de necesitar retardos mayores tenemos dos opciones:

1.- Utilizar una variable contador. Por ejemplo, imaginemos que queremos obtener un retardo de 1 segundo usando el Timer0. Como ya hemos visto, no se puede obtener de manera directa, por lo que emplearemos una variable contador.

Para tal fin, se programará el Timer0 a un tiempo conocido y permitido, por ejemplo, a 50 ms, así que para obtener un segundo, simplemente tenemos que hacer lo siguiente:

1s = Variable_Contador·50ms

Despejamos:

· Variable_Contador = 1s/50ms = 20

Como podemos comprobar, cuando la Variable_Contador llegue a 20, significa que habrá transcurrido 1s.


2.- Utilizar una frecuencia del Timer0 más baja posible. Otra forma de obtener tiempos más altos es usar la frecuencia del Timer0 lo más baja posible. Esto lo podemos hacer por dos vías:

2.1. Frecuencia Timer0 interna: Esto significa que la frecuencia del Timer0 es la misma que la del reloj principal de sistema.

Esto tiene un inconveniente, y es que todo el sistema también tendrá una frecuencia más baja y por ende, las instrucciones se procesarán más lentamente, por otro lado, es beneficioso en términos de bajo consumo.

2.2. Frecuencia del Timer0 externa. Usar una fuente de reloj externa lo más bajo posible por los pines indicados para tal fin.

Por ejemplo, digamos que la frecuencia del Timer0 es de 32 kHz, vamos a calcular el tiempo máximo que podemos generar:


Tiempo = 4·( 1/( 32·10^3 ) )·( 256 - 0 )·256 = 8.192 s


Como se puede observar, si la frecuencia del Timer0 es de 32 kHz, podremos alcanzar tiempos hasta, aproximadamente 8.192 segundos.


Y bueno, vamos a entrar ya en faena, la idea de este programa es hacer parpadear un LED conectado al pin RB3 del microcontrolador PIC16F84A cada aproximadamente 0.5s. El reloj del microcontrolador es de 4 MHz.


El material que vamos a necesitar y su función, es la que se muestra a continuación:

· PIC16F84A: Microcontrolador para este programa.

· Protoboard: Donde insertaremos nuestros componentes.

· PICKIT 3: Programador y depurador necesario para programar el código.

· Cristal 4 MHz: Necesario para la frecuencia del reloj principal y fuente del reloj del Timer0.

· Condensador 16 - 68 pF: Un par para estabilizar la señal del cristal.

· Resistor 220 Ω: Un resistor que irá en serie al LED y conectado al pin RB3 para limitar la corriente.

· Resistor 4.7 kΩ: Un resistor que irá conectado entre los pins #MCLR y VDD.


El firmware es el que se muestra a continuación:


/**
* @file        main.c
* @author      Manuel Caballero
* @date        25/2/2015
* @brief       Archivo principal.
* \copyright
*    AqueronteBlog@gmail.com
*
* Este archivo es propiedad intelectual del blog Aqueronte,
* cuya direccion web, es la siguiente:
*
*  http://unbarquero.blogspot.com/
*
* Se permite cualquier modificacion del archivo siempre y cuando
* se mantenga la autoria del autor.
*/
#include < xc.h >
#include < stdint.h >
#include "variables.h"
#include "functions.h"
#include "interrupts.h"

/**
 *  \brief     void main( void )
 *  \details   Este programa consiste en hacer parpadear un LED cada,
 *             aproximadamente 0.5 s.
 *
 *             Para tal fin, se usará el Timer 0.
 *
 *
 *  \author    Manuel Caballero
 *  \version   0.0
 *  \date      25/2/2015
 *  \pre       Este firmware está probado para el PIC16F84A.
 *  \pre       El LED estará conectado al pin RB3
 *             ( un resistor de 220 Ohms en serie ).
 *  \pre       El reloj externo es de 4 MHz.
 *
 *  \pre       MPLAB X IDE v2.30.
 *  \pre       Compiler XC8 v1.33.
 */
void main( void ) {

  conf_IO    ();    // Configura Pins
  conf_TA0   ();    // Configura Timer0

  ei  ();           // enable interrupts
    
  while ( 1 );      // Espera a que se produzca interrupción Timer0
}

Como vemos, el ejemplo es bastante simple, se recomienda bajar los archivos disponibles más abajo para indagar entre sus librerías y leer sus funciones de manera más detallada.

Un vídeo que demuestra lo explicado anteriormente se presenta a continuación:



Os pongo a vuestra disposición el programa en lenguaje C (XC8 y CCS) para que lo podáis descargar y probar:

Microchip PIC: PIC16F84A + LED + Timer0
Compilador XC8Compilador CCS
CC
PIC16F84A: LED + Timer0 
PIC16F84A: LED + Timer0 
PIC16F84A: LED + Timer0
PIC16F84A: LED + Timer0


Podéis encontrar el código completo en nuestro repositorio GitHub

·AqueronteBlog GitHub.


· NOTA 1Lo comentarios están en formato doxygen. Aunque no se entrega dicha documentación ya que el MPLAB X no tiene ningún pulgin capaz de trabajar con dicho formato.

· NOTA 2: Se incluye la simulación en PROTEUS del programa. La versión entregada de PROTEUS es v7.10 SP0.

0 comentarios: