You are on page 1of 4

Microcontroladores

LABORATORIO N 3
PROGRAMANDO EN LENGUAJE C
OBJETIVO
Conocer la estructura y las sentencias bsicas para programar en lenguaje C el
microcontrolador Atmega8.
FUNDAMENTO TEORICO
#include <avr/io.h>
Incluimos la librera avr/io que contiene la informacin de las entradas y salidas del
microcontrolador.
#include <util/delay.h>
Esta librera es necesaria para poder utilizar los retardos de tiempo
int main (void)
El main es la funcin principal, es donde el programa inicia, siempre es necesario declarar la
funcin main.
Funciones y macros tiles de la Librera AVR-LIBC
Dentro de la basta cantidad de funciones y macros implementadas en el paquete
de libreras, hay funciones y macros que son muy utilizadas para facilitar la programacin
en microcontroladores, como operaciones orientadas a bits, bytes y words. Algunas de las
ms tiles son:
Macro _BV(bit):
Convierte un numero de bit a un valor de byte, por ejemplo _BV(4) devuelve 0x10 (16 en
decimal), lo que hace esta macro es un corrimiento de un 1 a la izquieda bit veces para
poner a 1 el bit correspondiente en un byte. Es lo mismo que escribir
(1 << bit).
Esta macro se usa para poner a 0 o a 1 el bit especifico de un registro.
Uso:
DDRB |= _BV(PB0) | _BV(PB7) ; // Pone a 1 los bits 0 y 7 del registro DDRB.
PORTA |= _BV(PA2) | _BV(PA4) ; // Pone a 1 los bits 2 y 4 del registro PORTA.
PORTA &= ~(_BV(PA2) | _BV(PA4) ); // Pone a 0 los bits 2 y 4 del registro PORTA.

Ing. Flavio Condor De La Cruz

Microcontroladores
Funcin _delay_ms(milisegundos):
Se encuentra en la librera <util/delay.h> y sirve para hacer retardo en milisegundos.
Macros bit_is_set(sfr,bit) y bit_is_clear(sfr,bit):
Verifican si el bit en el registro sfr es un 1 para bit_is_set() o un 0 para bit_is_clear(),
devolviendo verdadero (1) si se cumple la condicin.
Macros loop_until_bit_is_set(sfr,bit) y loop_until_bit_is_clear(sfr,bit):
La primer macro espera a que el bit en sfr se ponga a 1 para despus continuar con el
programa, por el contrario la segunda macro espera a que el valor del bit en sfr sea 0.
Macros _SFR_IO_ADDR(sfr):
Devuelve un apuntador al registro especificado por sfr. Sirve para obtener la direccin de
un registro SFR.
Estas son algunas de las funciones y macros ms usadas en la programacin de
microcontroladores AVR con el compilador GN avr-gcc y la avr-libc.

PROCEDIMIENTO
Simular e implementar lo siguiente

Ejercicio 1. Programa que enciende y apaga 8 leds conectados al puerto B, con un


tiempo en alto de 0.3 seg. y un tiempo en bajo de 0.5 seg.

Esquema

Ing. Flavio Condor De La Cruz

Microcontroladores

Programa
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRB=0xFF;
while(1)
{
PORTB=0xFF;
_delay_ms(300);
PORTB=0x00;
_delay_ms(500);
}
}

//Librera de entradas y salidas


//Librera de retardos
//Inicio del programa
//Configura puerto B como salida
//Iniciar bucle infinito
//Saca por
//Pausa de
//Puerto B
//Pausa de

el Puerto B el dato 11111111


300 milisegundos
= 00000000
500 milisegundos

Ejercicio 2. Programa que enciende y apaga un led conectado al pin B0 del puerto
B, con un tiempo en alto de 200ms y un tiempo en bajo de 400ms.
Esquema

Programa
#include <avr/io.h>
//Librera de entradas y salidas
#include <util/delay.h>
//Librera de retardos
int main (void)
//Inicio del programa
{
DDRB|=_BV(PB0); //Configura B0 como salida, el resto no se altera
while(1)
//Iniciar bucle infinito
{
PORTB|=_BV(PB0);
//Saca un 1 por el pin B0
_delay_ms(200);
//Pausa de 200 milisegundos
PORTB&=~(_BV(PB0));
//Saca un 0 por el pin B0
_delay_ms(400);
//Pausa de 400 milisegundos
}
}

Ing. Flavio Condor De La Cruz

Microcontroladores

Ejercicio 3. Programa que desplaza a la izquierda y a la derecha un dato por el


puerto D, este dato es el numero binario 00000001.

Esquema

Programa
#include <avr/io.h>
//Librera de entradas y salidas de los AVR
#include <util/delay.h>
//Librera para usar los retardos "_delay_ms()"
int main(void)
//Inicio del programa
{
DDRD=0xFF;
//Configura el registro del puerto D como salidas
PORTD=0x01;
//Asignarle el valor de 0x01 (Hexadecimal) al puerto D
while(1){
//Iniciar un ciclo while infinito
while( PORTD < 0x80)
//Si dato es menor que 0x80 continua
{
PORTD=PORTD<<1;
//Recorrer el Puerto D un lugar a la izquierda
_delay_ms(200);
//Esperar 200 milisegundos
}
while( PORTD > 0x01 )
// Si dato es mayor que 0x01 continua
{
PORTD=PORTD>>1;
//Recorrer el Puerto D un lugar a la derecha
_delay_ms(200);
//Esperar 200 milisegundos
}
}
//Terminar el while infinito
}

TRABAJO
Presentar un circuito implementado que haga 4 juegos de luces diferentes cada
juego de luces debe ser activado por el estado lgico de dos pines. (Utilizar solo el
puerto D). En el informe presentar el programa y la simulacin.
Ing. Flavio Condor De La Cruz