void setupTimers() {
// Timer0 - 1 Hz (LED สีเขียวอ่อนและชมพู)
noInterrupts();
TCCR0A = 0;
TCCR0B = 0;
TCNT0 = 0;
OCR0A = 249; // 1 Hz: (16000000 / (64 * (249 + 1))) = 1 Hz
TCCR0A |= (1 << WGM01); // CTC Mode
TCCR0B |= (1 << CS01) | (1 << CS00); // Prescaler 64
TIMSK0 |= (1 << OCIE0A); // Enable Timer0 interrupt
// Timer1 - 2 Hz (LED สีม่วงและขาว)
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 7812; // 2 Hz: (16000000 / (1024 * (7812 + 1)))
TCCR1B |= (1 << WGM12); // CTC Mode
TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler 1024
TIMSK1 |= (1 << OCIE1A); // Enable Timer1 interrupt
// Timer2 - 5 Hz (LED สีส้มและเหลือง)
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
OCR2A = 155; // 5 Hz: (16000000 / (1024 * (155 + 1)))
TCCR2A |= (1 << WGM21); // CTC Mode
TCCR2B |= (1 << CS22) | (1 << CS21); // Prescaler 256
TIMSK2 |= (1 << OCIE2A); // Enable Timer2 interrupt
// Timer3 - 10 Hz (LED สีน้ำเงินและเขียว)
TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 0;
OCR3A = 15624; // 10 Hz: (16000000 / (1024 * (15624 + 1)))
TCCR3B |= (1 << WGM32); // CTC Mode
TCCR3B |= (1 << CS32); // Prescaler 256
TIMSK3 |= (1 << OCIE3A); // Enable Timer3 interrupt
interrupts();
}
void setup() {
DDRC = 0xFF; // Set PORTC as output
setupTimers();
}
void loop() {
// Main loop does nothing; all work is handled in ISRs
}
// Timer0 Interrupt - 1 Hz (LED สีเขียวอ่อนและชมพู)
ISR(TIMER0_COMPA_vect) {
PORTC ^= (1 << PC0) | (1 << PC1); // Toggle PC0 and PC1
}
// Timer1 Interrupt - 2 Hz (LED สีม่วงและขาว)
ISR(TIMER1_COMPA_vect) {
PORTC ^= (1 << PC2) | (1 << PC3); // Toggle PC2 and PC3
}
// Timer2 Interrupt - 5 Hz (LED สีส้มและเหลือง)
ISR(TIMER2_COMPA_vect) {
PORTC ^= (1 << PC4) | (1 << PC5); // Toggle PC4 and PC5
}
// Timer3 Interrupt - 10 Hz (LED สีน้ำเงินและเขียว)
ISR(TIMER3_COMPA_vect) {
PORTC ^= (1 << PC6) | (1 << PC7); // Toggle PC6 and PC7
}