UTB
Fac. de Ingeniería
U NIVERSIDAD TECNOLÓGICA ECNOLÓGICA DE BOLÍVAR Facultad de ingeniería
T alle ller #3
P r esenta sentad do po por : Daniel Hernando Pájaro T00042043 Luis Guillermo Mulford T00040959
Clase: Microcontroladores
D ocente ocente:: Oscar Acevedo Patiño
Cartagena, Bol. D.T. y C. - Colombia Marzo de 2018 Ing. Mecatrónica
1
Microcontroladores
UTB
Fac. de Ingeniería
Objetivo Incorporar lo aprendido teóricamente en clase sobre los timers/contadores del ATMega328p y ponerlo de forma práctica en un circuito, utilizando interrupciones en el microcontrolador, para crear un temporizador.
Enunciado Modificar el programa “p05” para que realice lo siguiente:
Agregar un segundo display, de forma que pueda visualizar números de 2 cifras. Agregue un pulsador (START), que cuando se oprima, el microcontrolador muestre en los displays los números desde el 59 hasta el 00, con decremento de 1 por cada segundo (1 minuto). No puede utilizar las funciones de delay para el retardo de un segundo. Debe utilizar un timer del microcontrolador para generar este retardo.
Ing. Mecatrónica
2
Microcontroladores
UTB
Fac. de Ingeniería
Código C 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
#define F_CPU 16000000UL #include
#include int numero_mostrado int main(void)
= 0;
{
// set up DDRB = 0 B00001111; //port B as output DDRC = 0 B00001111; //port C as output DDRD &= ~(1 << PD2); // PD2 as input (for INT0) PORTD |= (1 << PD2); // pull-up resistor // timer1 configuration TCCR1A = 0 B00000000; //Normal mode TCCR1C = 0; TIMSK1 = 0 B00000111; //all interrupts enabled OCR1A = 15625; // 1s OCR1B = 0; // TCNT1 = 0; // initialize counter EIMSK = 0 B00000001; //enable INT 0 EICRA = 0 B00000010; //falling edge generates an interrupt sei(); //enable interrupts while (1)
{ PORTB = numero_mostrado / 10; //primer digito PORTC = numero_mostrado % 10; //segundo digito
} return 0;
} // interrupt routine for TMR1 compare A ISR(TIMER1_COMPA_vect) { numero_mostrado = numero_mostrado - 1; TCNT1 = 0; // Reset counter if (numero_mostrado == 0) { TCCR1B = 0 B00000000; //Si el conteo terminó, detener timer }; } // interrupt routine for TMR1 compare B ISR(TIMER1_COMPB_vect) {; } // interrupt routine for TMR1 overflow (timer resets) ISR(TIMER1_OVF_vect) {; } // INT0 subroutine ISR(INT0_vect) { numero_mostrado = 59; TCCR1B = 0 B00000101; // Reloj interno/1024 }
Ing. Mecatrónica
3
Microcontroladores
UTB
Fac. de Ingeniería
Montaje
Fig. 1 Montaje del circuito
Video de funcionamiento:
Ing. Mecatrónica
https://goo.gl/ZXVkH8
4
Microcontroladores