
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.197.111.121] |
![]() |
|
![]() |
|
|
Прувет, народ!
Всю голову сломал, помогите! требуется вызвать функцию внутри класса по указателю. при попытке получить указатель компилятор ругается. ![]() ![]() uint8_t ADDR; void (*ptrFnc)(); class OWSlvDevice { public: OWSlvDevice(byte Interrupt_pin){// конструктор Itrrpt.Pin(Interrupt_pin); } void begin(uint8_addr) { ADDR = addr; ptrFnc = CreateObject; } private: void CreateObject(){ Serial.println(""); } }; компилятор выдает ошибку: In file included from C:\...\...\T...\TX.ino:1:0: sketch\OWSlvDevice.h: In member function 'void OWSlvDevice::begin(uint8_t)': OWSlvDevice.h:63:14: error: cannot convert 'OWSlvDevice::CreateObject' from type 'void (OWSlvDevice::)()' to type 'void (*)()' ptrFnc=CreateObject; ^~~~~~~~~~~~ exit status 1 cannot convert 'OWSlvDevice::CreateObject' from type 'void (OWSlvDevice::)()' to type 'void (*)()' |
Сообщ.
#2
,
|
|
|
кому интересно сделал так:
файл _ISR.h ![]() ![]() #ifndef _ISR_H #define _ISR_H #if ARDUINO >= 100 #include <Arduino.h> #else #include <WProgram.h> #endif // ============================ КОНСТАНТЫ ============================== #define ISR_PIN 2 //пин(менять перед объявлением библиотеки) #if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) #if (ISR_PIN == PB2) || (ISR_PIN == B2) || (ISR_PIN == 2) || (ISR_PIN == 7) #define EICRA _SFR_IO8(0x35) #define ISC00 0 #define ISC01 1 #define EIMSK _SFR_IO8(0x3B) #define INT0 6 #define EIFR _SFR_IO8(0x3A) #define INTF0 6 //OW Pin #define PINS PINB #define PIN PINB2 #define PORT PORTB//_SFR_IO8(0x18) #define DDR DDRB #define PIN_INT ISR(INT0_vect) // the interrupt service routine #define ISR_INIT 1 #endif #elif defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) #if (ISR_PIN == PB2) || (ISR_PIN == B2) || (ISR_PIN == 2) || (ISR_PIN == 5) #define EICRA _SFR_IO8(0x35) #define ISC00 0 #define ISC01 1 #define EIMSK _SFR_IO8(0x3B) #define INT0 6 #define EIFR _SFR_IO8(0x3A) #define INTF0 6 //OW Pin #define PINS PINB #define PIN PINB2 #define PORT PORTB//_SFR_IO8(0x18) #define DDR DDRB #define PIN_INT ISR(INT0_vect) // the interrupt service routine #define ISR_INIT 1 #endif #elif defined (__AVR_ATmega328P__) #if (ISR_PIN == 2) || (ISR_PIN == D2) //OW Pin #define PINS _SFR_IO8(0x09) #define PIN PIND2 #define PORT _SFR_IO8(0x0B) #define DDR _SFR_IO8(0x0A) #define PIN_INT ISR(INT0_vect) // the interrupt service routine #define ISR_INIT 1 #endif #if (ISR_PIN == 3) || (ISR_PIN == D3) //OW Pin #define PINS _SFR_IO8(0x09) #define PIN PIND3 #define PORT _SFR_IO8(0x0B) #define DDR _SFR_IO8(0x0A) #define PIN_INT ISR(INT1_vect) // the interrupt service routine #define ISR_INIT 1 #endif #endif #if defined ISR_INIT //OW Pin #define OW_PORT PORT //1 Wire Port #define OW_PIN PINS //1 Wire Pin as number #define OW_PORTN (1<<PIN) //Pin as bit in registers #define OW_PINN (1<<PIN) #define OW_DDR DDR //регистр направления #define SET_LOW {OW_DDR|=OW_PINN;OW_PORT&=~OW_PORTN;} //установить линию 1-Wire на низкий уровень #define RESET_LOW {OW_DDR&=~OW_PINN;} //установить вывод 1-Wire в качестве входа //Pin interrupt #define EN_INT {EIMSK|=(1<<INT0);EIFR|=(1<<INTF0);} //enable interrupt #define DIS_INT EIMSK&=~(1<<INT0); //disable interrupt #define SET_RISING EICRA=(1<<ISC01)|(1<<ISC00); //set interrupt at rising edge #define SET_FALLING {EICRA &= ~(1 << ISC00);EICRA|=(1<<ISC01);} //set interrupt at falling edge #define SET_CHANGE {EICRA &= ~(1 << ISC01) ;EICRA|=(1<<ISC00);}//set interrupt at change edge #define CHK_INT_EN (EIMSK&(1<<INT0))==(1<<INT0) //test if interrupt enabled class _ISR { private: void proc(); void(*CallbackCommand_)(uint8_t retv); friend void INTP(); ; public: _ISR(); void begin(void (*callback)(uint8_t retv)); }; #endif #endif файл _ISR.cpp ![]() ![]() #include "Arduino.h" #include "_ISR.h" /* Access variable for ISRs */ static _ISR *instance = NULL; void (*p_function)(); // указатель на p_function _ISR::_ISR(){}// конструктор PIN_INT {//прерывание (*p_function)(); } // спасибо Гайверу за универсальную функцию void attachFunction(void (*function)()) { // передача указателя на функцию p_function = *function; } void INTP(){ instance->proc(); } void _ISR::proc(){ CallbackCommand_(0x01); } void _ISR::begin(void (*callback)(uint8_t retv)) { cli();//откл. глоб.прер. RESET_LOW;//пин на вход SET_FALLING; EN_INT; sei(); // enable interrupts attachFunction(INTP); instance = this; CallbackCommand_ = callback; } файл tst_ISR_on_CLASS.ino ![]() ![]() #include <_ISR.h> _ISR tst; void INT(uint8_t retv); void setup() { Serial.begin(9600); tst.begin(&INT); } void loop() { // put your main code here, to run repeatedly: } void INT(uint8_t retv){ Serial.println("OK"); } код для второй ардуины для теста (просто шлем импульсы на вход прерывания второй ардуины ![]() ![]() #define INT 4 void setup() { pinMode(INT, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); } void loop() { delay(1000); digitalWrite(INT,1); digitalWrite(LED_BUILTIN,1); delay(200); digitalWrite(INT,0); digitalWrite(LED_BUILTIN,0); } тема закрыта! |