void setupTimer0() {
noInterrupts();
TCCR0A = 0;
TCCR0B = 0;
TCNT0 = 0;
// 1 Hz (16000000 / ((62499+1)*256))
OCR0A = 255;
TCCR0B |= (1 << WGM02); // CTC
TCCR0B |= (1 << CS02) ; // Prescaler 256
TIMSK0 |= (1 << OCIE0A); // Output Compare Match A Interrupt Enable
interrupts();
}
void setupTimer1() {
noInterrupts();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// 2 Hz (16000000 / ((7811+1)*1024))
OCR1A = 7811;
TCCR1B |= (1 << WGM12); // CTC
TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler 1024
TIMSK1 |= (1 << OCIE1A); // Output Compare Match A Interrupt Enable
interrupts();
}
void setupTimer2() {
noInterrupts();
TCCR2A = 0; // ล้างค่าของ TCCR2A
TCCR2B = 0; // ล้างค่าของ TCCR2B
TCNT2 = 0; // รีเซ็ตตัวนับ Timer2
// ตั้ง Prescaler เป็น 1024 เพื่อให้ OCR2A อยู่ในช่วงที่อนุญาต
OCR2A = 249; // OCR2A คำนวณจาก Prescaler 1024 และ 5 Hz
TCCR2A |= (1 << WGM21); // ตั้งโหมด CTC
TCCR2B |= (1 << CS22) | (1 << CS20); // Prescaler = 1024
TIMSK2 |= (1 << OCIE2A); // เปิดการขัดจังหวะ
interrupts(); // เปิดการขัดจังหวะ
}
void setupTimer3() {
noInterrupts();
// Clear registers
TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 0;
OCR3A = 1560; // 10 Hz (16000000 / ((1560+1)*1024))
TCCR3B |= (1 << WGM32); // CTC
TCCR3B |= (1 << CS32) | (1 << CS30); // Prescaler 1024
TIMSK3 |= (1 << OCIE3A); // Output Compare Match A Interrupt Enable
interrupts();
}
void setup() {
DDRC = 0xFF;
setupTimer0();
setupTimer1();
setupTimer2();
setupTimer3();
}
void loop() {
}
ISR(TIMER0_COMPA_vect) {
static uint8_t count0 = 0;
count0++;
if (count0 >= 125){
PORTC ^= (1 << PC0) | (1 << PC1);
// เขียวอ่อน ชมพู
}
}
ISR(TIMER1_COMPA_vect) {
PORTC ^= (1 << PC2) | (1 << PC3);
// ม่วง ขาว
}
ISR(TIMER2_COMPA_vect) {
static uint8_t count2 = 0;
count2++;
if (count2 >= 25){
PORTC ^= (1 << PC4) | (1 << PC5);
// ส้ม เหลือง
}
}
ISR(TIMER3_COMPA_vect) {
PORTC ^= (1 << PC6) | (1 << PC7);
// น้ำเงิน เขียว
}