//PROGRAM: TIMER INTERRUPT (WAKTU PENJUMLAHAN 400ms, PENGURANGAN 200ms)
volatile int interruptCtr = 0;
int totalInterruptCtr = 0;
hw_timer_t * timer1 = NULL; //timer untuk penjumlahan tiap 400ms
hw_timer_t * timer2 = NULL; //timer untuk pengurangan tiap 200ms
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR onTimer1() {
portENTER_CRITICAL_ISR(&timerMux);
interruptCtr++;
portEXIT_CRITICAL_ISR(&timerMux);
}
void IRAM_ATTR onTimer2() {
portENTER_CRITICAL_ISR(&timerMux);
interruptCtr--;
portEXIT_CRITICAL_ISR(&timerMux);
}
void setup() {
Serial.begin(115200);
//timer1
timer1 = timerBegin(0, 80, true);
timerAttachInterrupt(timer1, &onTimer1, true);
timerAlarmWrite(timer1, 400000, true);
timerAlarmEnable(timer1);
//timer2
timer2 = timerBegin(1, 80, true);
timerAttachInterrupt(timer2, &onTimer2, true);
timerAlarmWrite(timer2, 200000, true);
timerAlarmEnable(timer2);
}
void loop() {
if (interruptCtr > 0) {
totalInterruptCtr++;
Serial.print("An interrupt has ocourred. Total number: ");
Serial.println(totalInterruptCtr);
interruptCtr = 0;
}
}