проблема в создании класса
- Войдите на сайт для отправки комментариев
Вс, 09/08/2015 - 20:56
Хочу создать клас RFID ридера. Не могу назначить функцию прерывания для элемента класса (функция PCattachInterrupt).
Идея: При обявлении класса нужно зарегестрировать ф-ции прерывания для вывода D0 и D1. Теоретически программа должна для каждого экземпляра класа создать свои две ф-ции прерывания, потому this должен указать на конкретный экземпляр и соответственно на конкретную ф-цию, но не работает.
Гуру С++ помогите решыть проблему!
Ошибка:
error: reference to non-static member function must be called; did you mean to call it with no arguments?
PCattachInterrupt(_D1_pin, this->readerOne, CHANGE);
~~~~~~^~~~~~~~~
libraries/PinChangeInt/PinChangeInt.h:163:78: note: expanded from macro 'PCattachInterrupt'
#define PCattachInterrupt(pin,userFunc,mode) PCintPort::attachInterrupt(pin, userFunc,mode)
^
rdrRFID.cpp:37:29: error: cannot initialize a parameter of type 'PCIntvoidFuncPtr' (aka 'void (*)()') with an rvalue of type 'void'
PCattachInterrupt(_D1_pin, this->readerOne, CHANGE);
^~~~~~~~~~~~~~~
КОД:
/*
ReaderRFID.cpp - библиотека для ридера с интерфейсом WIEGAND 26
Версия 1.0
*/
#include "rdrRFID.h"
#include <PinChangeInt.h>
rdrRFID::rdrRFID(int _D0, int _D1)
{
_D0_pin = _D0;
_D1_pin = _D1;
reader = 0;
_readerCount = 0;
}
void rdrRFID::readerOne(void) {
if(digitalRead(_D1_pin) == LOW){
_readerCount++;
reader = reader << 1;
reader |= 1;
}
}
void rdrRFID::readerZero(void) {
if(digitalRead(_D0_pin) == LOW){
_readerCount++;
reader = reader << 1;
}
}
void rdrRFID::initReader(void){
//инициализация
//установка прерывания на портах контроллера
PCattachInterrupt(_D1_pin, this->readerOne, CHANGE);
PCattachInterrupt(_D0_pin, this->readerZero, CHANGE);
//установка направления порта
int arr_pin_reader[2]={_D0_pin, _D1_pin};
for(int i = 0; i < 2; i++)
{
pinMode(arr_pin_reader[i], OUTPUT);
digitalWrite(arr_pin_reader[i], HIGH);
digitalWrite(arr_pin_reader[i], LOW);
pinMode(arr_pin_reader[i], INPUT);
digitalWrite(arr_pin_reader[i], HIGH);
}
}
Вроде бы все прозрачно, пишет, что функцию член класса нельзя назначить на прерывание, только статическую функцию. Это правильно со всех точек зрения.
Такова себя ви, что поделаешь
<Тыдыщ!>
и на том спасибо, будем искать решение...
об результатах отпишусь!
Так сделайте её статической, а this храните отдельно в каком-нибудь управляющем блоке), а обработчик прерывания его оттуда вытащит и вызовет метод.
да, но откуда обработчик прерывания будет знать какой элемент класса и соответственно его переменные использовать?
Из управляющего блока - это может быть одна переменная в которой адрес экземрляра сидит или структура, если надо больше данных.
все пошло, правда пока не проверял на рабочей железке, но компилятор ошибки не дает
сделал как здесь:
http://forum.arduino.cc/index.php?topic=41713.0
Можно и так. Здесь существенную роль играет тот факт, что переменная foo описана выше функции обработчика fooBar()