Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Tarea 1: Timer con ATMEGA328p Nombre: Brigith Lojan Curso: 5to “B” Realizar un programa en ANSI C para un microcontrolador ATmega328p (operando a 16Mhz de clock), que realice el siguiente trabajo: - Como programa principal del microcontrolador, se debe generar una señal en el pin PC0 (400ms en alto y 400ms en bajo, se puede usar la librería delay). - Usar un timer de 8 bit para generar una señal en el pin PB1 con 100ms en alto y 100ms en bajo, con el uso de interrupciones internar. - Usar un timer de 16 bit para generar una señal en el pin PB0 con 100ms en alto y 100ms en bajo, con el uso de interrupciones internar. Fórmula: 65536 − 16000000 ∗ 0.1 1024 65536 − 1562.5 63973.5 = 63974 Código: #define F_CPU 16000000 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char a =0; ISR(TIMER0_OVF_vect){ if (a == 10) { PORTB ^= 0X02; a=0; } a++; TCNT0 = 100; //iniciar el contador en 100 } ISR(TIMER1_OVF_vect){ PORTB ^= 0x01; TCNT1 = 63974; } int main(void) { //Configuraciones generales cli(); //Deshabilitar las interrupciones globales DDRC = 0x01; //PC0 salida DDRB = 0x01; //PB0 salida DDRB = 0x02; //PB1 salida PORTC = 0x00; TCCR0B = (1<<CS02)|(0<<CS01)|(1<<CS00)|(0<<WGM02); //Conf prescaler en 1024 del timer de 8 bits TCCR0A = (0<<WGM01)|(0<<WGM00); //Conf en modo normal TIMSK0 = (1<<TOIE0); TCNT0 = 100; TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10)|(1<<WGM12); //Conf prescaler en 1024 del timer de 16 bits TCCR1A = (0<<WGM01)|(0<<WGM00); //Conf en modo normal TIMSK1 = (1<<TOIE1); TCNT1 = 63974; sei(); /* Replace with your application code */ while (1) { PORTC ^= 0x01; _delay_ms(400); PORTC ^= 0x01; _delay_ms(400); } } Simulación en Proteus:
Compartir