sábado, 21 de mayo de 2011

holaM_tiny.c paso a paso

En la entrada anterior observamos como crear un programa simple para el microcontrolador ATTiny 48/88. La explicación del código fuente del programa viene a continuación:

#define F_CPU 4000000UL

La constante F_CPU sirve para indicarle a la libreria de retardos la frecuencia de operación del microcontrolador. En caso de que no definir la constante F_CPU los retardos generados por la libreria no serán precisos y el compilador mostrará una advertencia.

#include <avr io.h/avr>

Archivo cabecera con todas las definiciones de constantes del microcontrolador. Por ejemplo, DDRD aparece definido como "#define DDRD _SFR_IO8(0x0A)", significa que altera la dirección de memoria 0x0A. En la anterior dirección de memoria configura el modo de entrada o salida del puerto D.

static void init_system(void);

Prototipo de  función, para configurar los osciladores internos del microcontrolador.

int main(void)
{

Inicio de la función principal del programa.

init_system();

Función para configurar el oscilador interno del microcontrolador.

DDRD = (1 << PD3) ;

Corrimiento a la izquierda de 1 hasta la posición de PD3.

for ( ; ; )
{

Inicio del bucle infinito del programa, en otras palabras la sección del programa que siempre se ejecutará.

PORTD = (1 << PD3);

Pone a 1 el bit PD3 en el puerto D. Estrictamente hablando primero se hace un corrimiento a la izquierda de 1 hasta la posición PD3, éste valor pasa a PORTD.

_delay_ms(500);

Función de retardo de 500 milisegundos.

PORTD = (0 << PD3);

Pone a 0 el bit PD3 en el puerto D. Actúa de forma similar a "PORTD = (1 << PD3)" lo único que cambia ahora es que se escribe un 0 en la posición de PD3.

_delay_ms(500);
}

Retardo de 500 milisegundos y fin del bucle infinito.

static void init_system(void)
{

Inicio de la definición de la función init_system. Static indica al compilador que la memoria reservada a la función siempre se mantenga, aún cuando termine la función. El primer void sirve para indicar que la función no retorna ningún valor. Finalmente el último void sirve para decir que la función no necesita ningún parámetro.

asm("ldi r16, 0x80");

Para insertar código en ensamblador en el programa escrito en lenguaje C se usa "asm("");". El nemotecnico ldi carga el valor 0x80 al registro r16.

asm("sts 0x61, r16");

El nemotecnico sts carga el valor contenido en el registro r16 en la dirección de memoria 0x61. La dirección de memoria 0x61 corresponde a la configuración del oscilador interno del microcontrolador, al cargar el valor 0x80 en la dirección de memoria 0x61 le permite al microcontrolador cambiar el valor del divisor para oscilador interno del microcontrolador.

asm("ldi r16, 0x01");

Carga en el registro r16 el valor de 0x01.

asm("sts 0x61, r16");
}

Pasa el valor de r16 a la dirección de memoria 0x61. Al pasar el valor 0x01 a la dirección de memoria 0x61 el microcontrolador pone un divisor de 2 al oscilador interno, con lo cual queda configurado a una frecuencia de 8Mhz/2=4Mhz. Al final aparece el indicador de fin de función.

Queda terminada la explicación del código de programa para holaM_tiny.c, a partir de este post en adelante sólo explicaré código que haga alguna función especial. Por ejemplo, ya no mencionaré que hace "asm("");".

miércoles, 13 de abril de 2011

Páginas con información útil

Hoy vamos a platicar sobre dos sitios en internet con información bastante interesante de microcontroladores AVR y FPGA.

El primer sitio es: www.avrfreaks.net

Contiene un foro de usuarios con excelente información sobre la familia de microntroladores AVR. Lo interesante del foro es que muchos de sus usuarios son gente con experiencia en la industria usando microcontroladores AVR. También se puede encontrar guías de proyectos completos para principiantes, hasta desarrollos profesionales. No dejen de visitar este sitio, y un agradecimiento a mí profesor de microcontroladores en la universidad, M. C. Carlos E. Canto Quintal por la recomendación del sitio avrfreaks.

El segundo sitio es: www.fpga4fun.com

Un sitio con información detallada sobre FPGA. Hay alrededor de 23 proyectos para construir o implementar en una tarjeta de desarrollo para FPGA. También se encuentran tutoriales, algunos mencionan que son los FPGA, como funcionan, tutoriales de lenguajes de descripción de hardware Verilog y VHDL. Sitio muy completo para iniciar con FPGA. La información más interesante son las secciones que explican como implementar puertos de comunicación en un FPGA, entre los puertos hay serie, I2C, SPI y JTAG.

domingo, 20 de marzo de 2011

Guía iniciación AVR ATtiny 48/88

Los microntroladores ATtiny 48/88 son una familia de microcontroladores de 8 bits. Sus características son:
  • Microcontrolador de 8-bit, de bajo consumo y alto rendimiento.
  • Concebido para ser programado en lenguaje C.
  • 123 instrucciones, la mayoría sólo necesitan un 1 ciclo de reloj.
  • 32x8 registros de proposito general.
  • 4K/8K Bytes de memoria flash programable en circuito.
  • 64 bytes de memoria EEPROM.
  • 256/512 bytes de memoria interna SRAM.
  • Un 8-bit Timer/counter  con prescaler separado y modo de comparación.
  • Un 16-bit Timer/counter  con prescaler, modo de comparación y captura.
  • 6 o 8 canales ADC de 8-bit.
  • Interfase serie SPI maestro/esclavo.
  • Interfase serie de 2 hilos (compatible con I2C Philips).
  • Perro guardian con oscilador separado.
  • Sistema de programación en circuito via SPI.
  • Oscilador interno.
  • 24 líneas programables de entrada/salida.
  • Velocidad de reloj de 4 a 12 Mhz. 

Requisitos para entorno de trabajo:

  • Computadora con sistema operativo LINUX, Windows XP o superior.
  • Programa para entorno de trabajo Atmel AVR Studio 4.18 SP3, página de descarga(solo Windows). 
  • Programador AVRISP mkII o similar.
  • Paquete de compilador y librerías WinAVR , página de descarga (sólo Windows).
  • En los sistemas LINUX instalar los siguiente paquetes:  avr-lib, binutils-avr y gcc-avr.
Una de las mejores formas para aprender a manejar microcontrolares es escribir programas. El primer programa es un equivalente al hola mundo de los programas de computadoras, este programa consiste en encender y apagar un led. Como primer paso hay que crear un archivo con el nombre holaM_tiny.c con un editor de texto de su preferencia. El archivo debe contener el siguiente código fuente:


#define F_CPU 4000000UL
 

#include <avr/io.h>
#include <util/delay.h> 

static void init_system(void);


int main(void)
{
     init_system();
     DDRD = (1 << PD3);

     for ( ; ; )
     {
          PORTD = (1 << PD3);
          _delay_ms(500);
          PORTD = (0 << PD3);
          _delay_ms(500);
     }
}


static void init_system(void)
{
     /* configurar oscilador a 4MHz*/
     asm("ldi r16,0x80");
     asm("sts 0x61,r16");
     asm("ldi r16,0x01");
     asm("sts 0x61,r16");
}



El funcionamiento básico del código es encender y apagar un led, dura encendido 500ms y otros 500ms apagado. El siguiente diagrama muestra como hay que conectar el microcontrolador:


El diagrama utiliza el microcontrolador ATtiny 48/88 en encapsulado PDIP, el número de pin de cada puerto cambia de orden según el tipo de encapsulado. 

Método de compilación en LINUX, en una terminal de comandos  escribir:

$ avr-gcc -g -Os -mmcu=attiny88 -c holaM_tiny.c
avr-gcc -g -mmcu=attiny88 -o holaM_tiny.out holaM_tiny.o

Comando para crear archivo hex. 

$ avr-objcopy -j .text -O ihex holaM_tiny.out holaM_tiny.hex 

Todos los comandos anteriores deben lanzarse usando como carpeta de trabajo en la ubicación del archivo holaM_tiny.c .

Método de compilación en sistemas Windows. El primer paso es abrir el programa AVR Studio 4, después dentro del menú "Project", seleccionar  Project Wizard.

 En la ventana emergente que aparece seleccionar "New Project".

 Después, marcar la opcón de "Project type" en AVR GCC, también seleccionar "Create initial file" "Create folder". En el campo "Project name" poner "holaM_tiny" y en "Initial file" colocar "holaM_tiny".

 En el siguiente paso poner "Debug platform" en "AVR Simulator 2" y en "Device" colocar "ATtiny88". Terminar presionando el botón de "Finish".

 Quedará una ventana con un editor de texto, en este editor de texo colocar el código fuente anterior. Para compilar el proyecto y obtener el archivo hex, hay que ir al menú "Build" y seleccionar "Build".



Para terminar el proyecto sólo hay que cargar el archivo holaM_tiny.hex con el programador de nuestra preferencia. En la siguiente entrada vamos a explicar que realizan cada una de las ordenes del programa. Si alguien tiene alguna duda puede ponerla en la sección de comentarios o mandarme un correo electrónico.
  

domingo, 6 de marzo de 2011

Nueva apertura del sitio

Después de algunos años sin publicar nada en el blog, por fin me he decido a realizar una serie de artículos orientados a conocer los microcontroladores AVR.

La familia de microcontroladores AVR no es muy utilizada en México, lo más común es encontrar gente manejando PICs. Como formación sería bueno que se incluyeran más los microntroladores AVR en los planes de estudio de escuelas mexicanas. Tienen algunas ventajas con respecto a los PIC, una de ellas puede ser que un microcontrolador AVR puede realizar una instrucción por ciclo de reloj, mientras que en un PIC son 4 ciclos de reloj por instrucción (no aplica a todos los modelos).

El primer modelo de microcontrolador a estudiar es el ATtiny48/88.

Continuando con el tema del blog, las publicaciones vendrán con referencia bibliográfica. Ya sea libros, artículos de algún investigador de renombre, hojas de datos, etc. para darle más valor formal a la información publicada.

Después de esta breve introducción no queda más que comenzar.