На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > получить указатель на функцию внутри класса, нужна помощь чайнику
      Прувет, народ!
      Всю голову сломал, помогите!
      требуется вызвать функцию внутри класса по указателю. при попытке получить указатель компилятор ругается.
      ExpandedWrap disabled
        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 (*)()'
      Сообщение отредактировано: SOY -
        кому интересно сделал так:

        файл _ISR.h

        ExpandedWrap disabled
          #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

        ExpandedWrap disabled
          #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

        ExpandedWrap disabled
          #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");
          }


        код для второй ардуины для теста (просто шлем импульсы на вход прерывания второй ардуины

        ExpandedWrap disabled
          #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);
          }


        тема закрыта!
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0216 ]   [ 14 queries used ]   [ Generated: 24.06.22, 22:05 GMT ]