На главную Наши проекты:
Журнал   ·   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,0176 ]   [ 14 queries used ]   [ Generated: 9.08.22, 17:38 GMT ]