// LED 0 blink every 1 second, LED 1 blink every 3 seconds
int led_status = 0;
int led_status2 = 0;
void timer_init(){
//100ms interrupt
cli(); //clear all interrupt
TCCR1A = 0;
TCCR1B = 0;
TCCR1B = bit(CS12) | bit(CS10); // Set prescalar of timer 1 to 1024
TIMSK1 = bit(OCIE1A);
// Enable compare match A on timer 1
OCR1A = 1562;
//16 000 000 / 1024 = 15625
sei(); // Enable back the interrupts
}
int counter = 0;
int flag = 0;
int counter2 = 0;
int flag2 = 0;
ISR(TIMER1_COMPA_vect){ //change the 0 to 1 for timer1 and 2 for timer2
counter++;
if(counter >= 10){
counter = 0;
flag = 1;
}
counter2++;
if(counter2 >= 30) {
counter2 = 0;
flag2 = 1;
}
TCNT1 = 0; // Reset the counter
}
void setup()
{
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
timer_init();
}
void loop()
{
if (flag == 1) {
flag = 0;
if(led_status == 0){
digitalWrite(0, HIGH);
}else{
digitalWrite(0, LOW);
}
led_status = 1 - led_status;
}
if (flag2 == 1) {
flag2 = 0;
if(led_status2 == 0) {
digitalWrite(1, HIGH);
} else {
digitalWrite(1, LOW);
}
led_status2 = 1 - led_status2;
}
}
// cach 2
// LED 0 blink every 1 second, LED 1 blink every 3 seconds
// Different way
#define MAX 10
int led_status = 0;
int led_status2 = 0;
int counter[MAX];
int flag[MAX];
void timer_init(){
//100ms interrupt
cli(); //clear all interrupt
TCCR1A = 0;
TCCR1B = 0;
TCCR1B = bit(CS12) | bit(CS10); // Set prescalar of timer 1 to 1024
TIMSK1 = bit(OCIE1A);
// Enable compare match A on timer 1
OCR1A = 1562;
//16 000 000 / 1024 = 15625
sei(); // Enable back the interrupts
}
void setTimer(int index, int _counter){
counter[index] = _counter;
flag[index] = 0;
}
void timerRun(){
for(int i = 0; i < MAX; i++){
if(counter[i] > 0){
counter[i] --;
if(counter[i] == 0) flag[i] = 1;
}
}
}
ISR(TIMER1_COMPA_vect){
timerRun();
TCNT1 = 0;
// Reset the counter
}
void setup()
{
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
timer_init();
setTimer(0, 10);
setTimer(1, 20);
}
void task1(){
if(led_status == 0){
digitalWrite(0, HIGH);
}else{
digitalWrite(0, LOW);
}
led_status = 1 - led_status;
}
void task2(){
if(led_status2 == 0){
digitalWrite(1, HIGH);
}else{
digitalWrite(1, LOW);
}
led_status2 = 1 - led_status2;
}
void loop()
{
if(flag[0] == 1){
setTimer(0, 10);
task1();
}
if(flag[1] == 1){
setTimer(1, 20);
task2();
}
}