У меня небольшая ошибка с моим последним кодом проекта Arduino, который использует библиотеку TimerOne для отображения чисел на 4-значном 7-сегментном дисплее. Я использую прерывание, чтобы микропроцессор постоянно переключался между каждой цифрой, поскольку они по существу связаны друг с другом.
У меня отлично работает код, если я храню все это в основном файле PDE, но я подумал, что было бы лучше изолировать дисплей в своем собственном классе.
Мой компилятор испытывает проблемы со второй строкой следующего кода в PDE:
Timer1.initialize(500);
Timer1.attachInterrupt(digitDisplay.flashDigit,500);
Второй аргумент в attachInterrupt должен быть необязательным,
Я пробовал с и без этого! В любом случае я получаю следующую ошибку:
DigitDisplayTest.cpp: In function 'void setup()':
DigitDisplayTest:29: error: no matching function for call to 'TimerOne::attachInterrupt(<unresolved overloaded function type>)'
C:\Program Files (x86)\arduino-0022\arduino-0022\libraries\Timer1/TimerOne.h:62: note: candidates are: void TimerOne::attachInterrupt(void (*)(), long int)
В DigitDisplay (экземпляром digitDisplay) я определяю flashDigit следующим образом:
class DigitDisplay
{
private:
/*...*/
public:
/*...*/
void flashDigit();
}
void DigitDisplay::flashDigit()
{
wipeDisplay();
for (int i = 0; i < _digitCount ; i++)
{
if ( i == _digit ) digitalWrite( _digitPins[i], HIGH );
else digitalWrite( _digitPins[i], LOW );
}
displayNumber(_digits[_digit]);
_digit++ ;
_digit %= _digitCount;
}
Если вам требуется больше кода, пожалуйста, дайте мне знать, но я почти уверен, что с потрохами метода flashDigit () нет ничего плохого - он, безусловно, работал, прежде чем поместить его в свой собственный класс.
Очевидно, что я могу обойти эту ошибку, добавив
void Interrupt()
{
digitDisplay.flashDigit();
}
к основному PDE и присоединению этой функции, но это всего лишь обходной путь, было бы неплохо, если бы я мог вызвать его напрямую.
Я вижу, что ошибка связана с созданием указателя на функцию (которого нет, следовательно, и ошибка), но указатели не являются моей сильной стороной, поэтому я действительно мог бы сделать это с помощью ручной сортировки.