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("");".