domingo, 28 de agosto de 2016

Práctica 2: Desplazamiento de LED

Luego de encender un LED y ponerle intermitencia, la siguiente práctica consiste en conectar más LEDs al microcontrolador y hacer que solo uno se encienda a la vez, mostrando un efecto de desplazamiento.

Como vimos en la práctica 1, con el manejo de los puertos podemos realizar fácilmente esta tarea.

jueves, 21 de julio de 2016

Práctica 1: Encender y apagar LED

En el mercado existe una gran variedad de microcontroladores; sin embargo, debido a su facilidad de uso y cantidad de información disponible en la web, los más utilizados son los PIC de Microchip y los AVR de Atmel (adquirida a inicios de 2016 por Microchip). Para esta y futuras prácticas se utilizará el microcontrolador ATmega164P de Atmel, el cual se considera de relativo bajo costo y con varias características que serán utilizadas en próximas prácticas.

La práctica básica para iniciar en el mundo de los microcontroladores es la de encender y apagar un LED; es por ello que en la presente entrada se resumen los aspectos básicos para conseguir dicha tarea.

La programación del microcontrolador se realizará en lenguaje C mediante la herramienta Atmel Studio 7.0. En la siguiente figura se muestra la pantalla inicial del software a utilizarse.

Pantalla inicial de Atmel Studio 7.0.

A continuación se crea el nuevo proyecto, seleccionando el tipo "GCC C Executable Project" y eligiendo el nombre que identifique al proyecto.

Creando nuevo proyecto ejecutable de tipo C

Se elije el microcontrolador de la lista desplegada.

Elección del microcontrolador ATmega164P

Luego de elegir el microcontrolador se desplega la ventana con el cuerpo del programa. La parte en donde escribimos el programa es dentro del bucle while(1), pues la condición indica que lo que se escriba dentro del bucle será ejecutado continuamente.

Ventana inicial para empezar a programar

Previo a programar el microcontrolador se debe indicar que el ATmega164P posee 4 puertos de entrada/salida con 8 pines por cada puerto; dando un total de 32 pines por los cuales se puede generar el voltaje para nuestra práctica inicial.

El puerto A lo componen los pines: PA0, PA1, PA2, PA3, PA4, PA5, PA6 y PA7.
El puerto B lo componen los pines: PB0, PB1, PB2, PB3, PB4, PB5, PB6 y PB7.
El puerto C lo componen los pines: PC0, PC1, PC2, PC3, PC4, PC5, PC6 y PC7.
El puerto D lo componen los pines: PD0, PD1, PD2, PD3, PD4, PD5, PD6 y PD7.

Configuración de pines del microcontrolador ATmega164P

Para consultar todas las características del microcontrolador ATmega164P se puede descargar el datasheet proporcionado por el fabricante.

CONFIGURACIÓN DE PUERTOS

Para nuestra práctica conectaremos el LED al pin PA0, por lo que tenemos que "decirle" al micro que dicho pin debe ser configurado como salida mediante la modificación del registro DDRA escribiendo el código:

DDRA=0b00000001;

El 0 indica que el pin se configura como entrada mientras que el 1 indica que el pin está configurado como salida. El comando anterior se puede escribir también en formato hexadecimal de la siguiente forma:  

DDRA=0x01;

Por facilidad de reconocimiento al inciar en el mundo de los microcontroladores es recomendable utilizar el formato binario, pues de este modo se reconoce con facilidad que pines del puerto son entrada o salida. A continuación se muestra como se deberían escribir los registros DDRA y DDRC si se quiere que sus pines sean entrada/salida de acuerdo a las flechas graficadas en cada pin.

Configuración de los pines del micro como entrada/salida
Otro registro importante para nuestra práctica es PORTx, el cual modificaremos para encender o apagar el LED. La sintaxis utilizada es la misma que para modificar el registro DDRx, es decir para encender el LED conectado al pin PA0 debemos modificar el registro PORTA de la siguiente manera:

PORTA=0b00000001;

si lo queremos apagar escribiremos en el programa:

PORTA=0b00000000;

Si quisiéramos leer los valores lógicos actuales en el puerto x del microcontrolador los encontraremos en el registro PINx, siguiendo el mismo orden de pines mostrado en DDRx y PORTx

En resumen:

DDRx: indica qué pines del puerto x son entrada y cuales salida. (0 entrada, 1 salida).
PORTx: si el pin está configurado como salida indica qué voltaje se le asigna a cada pin del puerto x (0 envía 0V, 1 envía 5V). Si el pin está configurado como entrada indica si está activada o desactivada una resistencia interna o PULL-UP en cada pin (0 deshabilita la pull-up del pin, 1 habilita la pull-up). La resistencia de pull-up que tiene cada pin se puede equiparar a una resistencia de entre 20K a 50K conectada en serie al pin en cuestión.
PINx: lee el valor actual de los pines del puerto x. (0 indica 0V, 1 indica 5V).


RETARDOS

Encender un LED por un puerto del microcontrolador no sería tan interesante si no le agregamos un parpadeo cada cierto tiempo, es por eso que se requiere la utilización de retardos de tiempo entre cada estado del LED (encendido o apagado). Los retardos se generan realizando operaciones "fantasma" de forma repetitiva hasta alcanzar el tiempo requerido de acuerdo a la frecuencia de operación del microcontrolador. En lenguaje C, por el momento nos "ahorraremos" el trabajo de diseñar una función para retardos, agregando un conjunto de funciones ya desarrolladas y compartidas por los usuarios de AVR.

Dentro del directorio donde se genera el proyecto (junto al archivo main.c) se copia el archivo avr_compiler.h como se muestra a continuación.

Copiar el archivo avr_compiler.h dentro del directorio de cada proyecto a utilizar retardos.
Para que el programa pueda utilizar el archivo avr_compiler.h, es necesario agregar la siguiente línea de código al inicio del script:

#include "avr_compiler.h"

El archivo avr_compiler.h permite usar las funciones _delay_us(retardo deseado en microsegundos) y _delay_ms(retardo deseado en milisegundos). Por lo tanto, si deseamos una espera de 50 microsegundos la sentencia necesaria será:

_delay_us(50);


Dada la baja complejidad de nuestra práctica, encenderemos el LED durante 500 milisegundos y lo mantendremos apagado durante otros 500 milisegundos de forma repetitiva finalizando el código de la siguiente manera:

Programa final en C para encender/apagar LED repetitivamente.

El paso final en la programación de cualquier proyecto es compilar el programa, con la finalidad de encontrar errores de sintaxis o tipeo. Si el programa es correcto, al compilar se generan varios archivos, entre ellos el archivo .HEX, el cual es el más importante pues será cargado a la memoria del microcontrolador para que este ejecute las instrucciones de nuestro programa. La compilación en Atmel Studio 7.0 se realiza con los botones mostrados en la siguiente captura:

Boton para compilar en Atmel Studio 7.0 y ventana de errores luego de compilar programas

SIMULACIÓN

La simulación de cualquier proyecto con microcontroladores es esencial pues nos permite detectar errores o verificar el correcto funcionamiento del diseño y del código. Para nuestras prácticas utilizaremos el simulador ISIS de PROTEUS pues contiene una gran variedad de dispositivos electrónicos para elegir; además posee instrumentos de medición analógica y digital. A continuación se presenta una captura de la simulación de nuestro diseño.

Simulación en PROTEUS: osciloscopio conectado al puerto PA0 (onda amarilla).


IMPLEMENTACIÓN

La implementación de proyectos con microcontroladores se realiza luego de verificar con las simulaciones que realmente funcionan. Como lo hemos verificado en esta sencilla práctica, el objetivo se ha conseguido, es hora de poner en práctica lo desarrollado y comprobar que nuestro primer diseño funciona en la vida real.

Placa de pruebas (Protoboard): Esta y todas nuestras prácticas serán implementadas en una placa de pruebas llamada también protoboard.
Fuente de voltaje: Se requiere una fuente estable de 5V para alimentar al microcontrolador en los pines 10 (VCC) y 31 (GND). Si no se dispone de una fuente de laboratorio, se puede recurrir a cargadores de teléfonos celulares que ya no usemos, verificando siempre que el voltaje de salida no supere los 5V ni sea mucho menor a ese valor.
Programador: Para grabar los códigos (.HEX) en nuestro microcontrolador se requiere un programador. Aunque existen varios tipos de programadores, uno de los más utilizados es el de tipo USBasp, el cual permite poner el microcontrolador en un zócalo ZIF y conectarlo mediante USB a la PC.
LED:  aunque la corriente de cada pin del microcontrolador no superará picos de 40mA, se debe calcular la resistencia que se conectará en serie con el LED para evitar sobrecargarlo y dañarlo. Este cálculo dependerá del voltaje de salida en el pin (generalmente 5V) y del color del LED a usarse mediante la siguiente ecuación:

R=(Voltaje de salida - Caída de voltaje en el LED)/Corriente del LED

La caída de voltaje en el LED generalmente es de:

Rojo: 1.8 V
Naranja/amarillo: 2 V
Verde: 2.1 V
Blanco brillante/verde brillante/azul: 3.3 V
Azul brillante: 4.6 V

Respecto a la corriente, generalmente se recomienda de 10 mA (LEDs de mayor voltaje) a 20 mA (LEDs de menor voltaje).


ERRORES COMUNES

Frecuencia de parpadeo del LED no es coherente: revisar que al momento de programar el microcontrolador el fusible lógico CLKDIV8 no esté activo (0 activo, 1 inactivo). Al activar este fusible lógico se ordena al microcontrolador que la frecuencia de operación sea dividida para 8; es decir, si la frecuencia de operación es de 8MHz, al activar CLKDIV8 se trabajaría a solo 1MHz y por ende los retardos se prolongarían 8 veces lo planificado.


TODOS LOS ARCHIVOS DEL PROYECTO

Los archivos escenciales del proyecto son:

01_ENCENDER_LED.c (código generado en C)
01_ENCENDER_LED.hex (código para cargar al microcontrolador)
avr_compiler.h (código para llamar función de retardos)

En el siguiente .RAR se presentan todos los archivos generados luego de compilar y simular todo el proyecto.