Я пытаюсь создать простую процедуру обслуживания прерываний Arduino, которая использует в ней указатель функции, чтобы он мог эффективно быть изменен с помощью функции main()
. Ниже приведен мой код.Как использовать указатель функции внутри процедуры обработки прерываний arduino для изменения ISR?
#include <stdio.h>
#include <util/delay.h>
#include "gpio.h" // "gpio.h" is my own library that contains the
// definitions of digital_write, digital_read,
// pin_mode, analog_write, etc.
// It also configures all the timer/counter
// circuits to operate in fast-PWM mode
// with an undivided input clock signal.
// This library has been tested.
/* Two interrupt service routines */
void INT_1(void);
void INT_2(void);
/* Function pointer to choose any one of the above defined ISRs */
void (* interrupt)(void) = NULL;
/* main */
int main(void) {
pin_mode(3, OUTPUT);
pin_mode(4, OUTPUT);
cli();
TIMSK0 |= _BV(TOIE0); // Enable Timer0 overflow interrupt
sei();
while(1)
{
interrupt = INT_1; // For 10 ms, INT_1 executes on interrupt
_delay_ms(10);
interrupt = INT_2; // For next 10 ms, INT_2 executes on interrupt
_delay_ms(10);
}
return 0;
}
ISR(TIMER0_OVF_vect) { // Execute the function pointed to by
// "interrupt" on every overflow on timer 0
if(interrupt != NULL)
{
interrupt();
}
}
void INT_1(void) {
digital_write(3, LOW);
digital_write(4, HIGH);
}
void INT_2(void) {
digital_write(3, HIGH);
digital_write(4, LOW);
}
Светодиоды подключены к контактам 3 и 4. Они должны поочередно загораться в течение 10 миллисекунд каждый. Однако при мигании этой программы на Arduino я вижу, что каждый светодиод загорается примерно на 2 секунды. Может ли кто-нибудь сказать мне, почему?
Не работает. Все так же –
@ KennethGoveas Это работает для меня: без изменчивости он не работает, с изменчивым он работает. Проверено. – KIIV
8 Как вы компилируете и загружаете? –