Vista previa del material en texto
Universidad Autónoma de Occidente Microprocesadores Taller # 2 1. Lenguaje C - Estructuras de control a) Para cada caso, diga cuál es el valor mostrado en el puerto C al ejecutar el siguiente programa (Figura 1). Figura 1. Hardware para el ejercicio 1.a. #include <avr/io.h> int main(void) { unsigned char dato1, dato2, dato3, resultado, op; DDRB = 0x00; DDRD = 0x00; PORTB = 0xFF; PORTD = 0xFF; DDRC = 0xFF; while(1) { dato1 = PINB & 0x0F; dato2 = ( PINB & 0xF0 ) >> 4; PD0 PD1 PD2 PD3 PC0 PC1 PC2 PC3 PC4 PD6 PD7 d at o 1 d at o 2 d at o 3 o p dato3 = PIND & 0x0F; op = (PIND & 0xC0) >> 6; switch( op ) { case 0: resultado = dato1 + dato2; break; case 1: resultado = dato2 + dato3; break; case 2: resultado = dato1 + dato3 ; break; default: resultado = 0; } PORTC = resultado; } } - PINB = 0xFC, PIND = 0x31 - PINB = 0x5E, PIND = 0xCB b) Construya un comparador de 2 datos (A y B) de 4 bits leídos en el Puerto B del microcontrolador, A en PB[3:0] y B en PB[7:4]. El comparador debe generar 3 salidas en el Puerto C para indicar si: A > B (PC0=1), A = B (PC1=1) o A < B (PC2=1). 2. Interrupciones Externas INT0 e INT1 a) El microcontrolador ATmega328P de la Figura 2 ejecuta el programa presentado a continuación. ATmega328P Figura 2. Hardware para el ejercicio 2.a. # include <avr/io.h> # include <avr/interrupt.h> volatile char temp; ISR(INT0_vect){ temp*=2; PORTB = temp; } int main(void){ DDRD = 0x00; PORTD = 1 << PORTD2; DDRB = 0xFF; EICRA = 0B00000010; EIMSK = 0B00000001; sei(); temp = 1; while (1){ asm(“NOP”); } } ¿Cuál es el valor en binario del dato visualizado en el puerto B después de oprimir cinco veces el pulsador? b) Con base en la Figura 3, desarrolle el programa que controle el encendido de un horno para mantenerlo alrededor de una temperatura de referencia. El horno está acondicionado para generar 2 señales (hot y cold), debe encenderse (PB0=’1’) si la temperatura está por debajo del nivel cold y apagarse (PB0=’0’) si está por encima del nivel hot. Figura 3. Control de encendido de un horno. 3. Interrupciones por cambios en los pines a) Diseñe el programa para un contador ascendente con múltiples fuentes, el circuito se muestra en la Figura 5. Las salidas en los Puertos B y D se mostrarán en binario, en el Puerto B se indicará el botón presionado y en el Puerto D el valor del contador. Figura 5. Contador con múltiples fuentes. 4. Temporizadores – Temporizador 0 Para los siguientes ejercicios suponer que el ATMega328P tiene una frecuencia de operación de 1 MHz. a) Determinar el período y la frecuencia de la señal de reloj del bit 0 del puerto B, la cual es generada al ejecutar el siguiente programa. # include <avr/io.h> # include <avr/interrupt.h> ISR(TIMER0_COMPA_vect){ PORTB = PORTB^0x01; } int main(void){ DDRB = 0xFF; PORTB = 0x00; OCR0A = 127; TCCR0A = 1 << WGM01; TCCR0B = 1 << CS00; TIMSK0 = 1 << OCIE0A; sei(); while(1){ asm(“NOP”); } } b) Implemente el ejercicio anterior usando respuesta automática ante coincidencias por comparación y modo CTC (use la salida OC0A, que está en PD6). c) Escriba un programa en C que genere un número aleatorio de 8 bits en el Puerto B cada que se presione un botón conectado en PD2 (INT0). Observe que si se utiliza un temporizador de 8 bits incrementando cada microsegundo, lo “aleatorio” está en el momento en que el usuario presiona el botón. d) Realice un programa que genere una señal de 10 kHz en un terminal donde el temporizador pueda dar una respuesta automática.