Microcontroladores Microcontroladores
LABORATORIO N° 3 PROGRAMANDO EN LENGUAJE C OBJETIVO Conocer la estructura y las sentencias básicas para programar en lenguaje C el microcontrolador Atmega8. FUNDAMENTO TEORICO #include
Incluimos la librería avr/io que contiene la información de las entradas y salidas del microcontrolador. #include Esta librería es necesaria para poder utilizar los retardos de tiempo int main (void) El main es la función principal, es donde el programa inicia, siempre es necesario declarar la función main.
Funciones y macros útiles de la Librería “AVR“AVR-LIBC” Dentro de la basta cantidad de funciones y macros implementadas en el paquete de librerías, hay funciones funciones y macros que son muy utilizadas para facilitar facilitar la programación en microcontroladores, como operaciones orientadas a bits, bytes y words. Algunas de las más útiles son:
Macro _BV(bit): Macro _BV(bit):
Convierte un numero de bit a un valor de byte, por ejemplo _BV(4) _BV(4) devuelve 0x10 (16 en decimal), lo que hace esta macro es un corrimiento de un 1 a la izquieda “bit” “bit” veces para poner a 1 el “bit” correspondiente en un byte. by te. Es lo mismo que escribir (1 << bit). Esta macro se usa para poner a 0 o a 1 el “bit” especifico “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 los bits 2 y 4 del registro registro PORTA. PORTA. PORTA &= ~(_BV(PA2) | _BV(PA4) ); // Pone a 0 los bits 2 y 4 del registro PORTA.
Ing. Flavio Condor Condor De La Cruz
1
Microcontroladores
Función _delay_ms(milisegundos):
Se encuentra en la librería 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 condición.
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 después 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 dirección de un registro SFR. Estas son algunas de las funciones y macros más usadas en la programación 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
2
Microcontroladores
Programa #include #include int main (void) { DDRB=0xFF; while(1) { PORTB=0xFF; _delay_ms(300); PORTB=0x00; _delay_ms(500); } }
//Librería de entradas y salidas //Librería 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 //Librería de entradas y salidas #include //Librería 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
3
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 //Librería de entradas y salidas de los AVR #include //Librería 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 lógico de dos pines. (Utilizar solo el puerto D). En el informe presentar el programa y la simulación. Ing. Flavio Condor De La Cruz
4