Logo Studenta
¡Estudia con miles de materiales!

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.