Este es mi intento de realizar multitareas (bueno, casi) a través de interrupciones. En este ejemplo, la Tarea 1 es: el LED de alternancia conectado a PB1 a 2Hz (se usa el temporizador 1, OCR1 puede contener valores hasta 65535), la tarea 2 es: el LED de alternancia se conectó a PB3 a 61Hz (ya que el Timer2 OCR2 es de 8 bits). Parece que también está funcionando.
- ¿Entendí el concepto de multitarea, verdad?
- ¿Cómo puedo asignar segmentos de tiempo para una "Tarea" o no es posible en este caso?
- ¿Puedo reemplazar la "Tarea" de cambiar el LED al ADC medir o recibir bytes en USART? ¿O sería eso realizado de manera diferente?
Aquí está mi programa:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define COMP_REG_VAL 61250
void timer1_init()
{
DDRB |= 1<<PB1; // Set PortB Pin1 as output
TIFR1 |= 1<<OCF1A; // Clear Output compare flag
TIMSK1 |= 1<<OCIE1A; // Enable Interrupt on Output compare match
TCCR1B |= ( (1<<CS12) | (1<<WGM12) ); // Prescaler Fosc/256 ===> 62500
}
void timer2_init()
{
DDRB |= 1<<PB3; // Set Port B pin3 as Output
TIFR2 |= 1<<OCF2A; // Clear Output compare flag
TIMSK2 |= 1<<OCIE2A; // Enable Interrupt on Output compare match
TCCR2A |= ( (1<<WGM20) | (1<<WGM21) ); //FAST PWM mode
TCCR2B |= ( (1<<WGM22) | (1<<CS22) | (1<<CS21) | (1<<CS20) ); //Fast PWM MOde, Prescaler=fosc/1024
}
int main (void)
{
sei();
timer1_init();
timer2_init();
OCR1A = COMP_REG_VAL/2;
OCR2A = 255;
while(1)
{
}
}
ISR(TIMER1_COMPA_vect)
{
PORTB ^= (1<<PB1); // Toggle Pin when overflow occurs
}
ISR(TIMER2_COMPA_vect)
{
PORTB ^= (1<<PB3); // Toggle Pin when overflow occurs
}