<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427466&amp;view=findpost&amp;p=3867473</guid>
        <pubDate>Sat, 04 Jun 2022 10:17:08 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427466&amp;view=findpost&amp;p=3867473</link>
        <description><![CDATA[SOY: кому интересно сделал так:<br>
<br>
файл _ISR.h<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef _ISR_H</div><div class="code_line">#define _ISR_H</div><div class="code_line">#if ARDUINO &#62;= 100</div><div class="code_line">&nbsp;#include &#60;Arduino.h&#62;</div><div class="code_line">#else</div><div class="code_line">#include &#60;WProgram.h&#62;</div><div class="code_line">#endif</div><div class="code_line">// ============================ КОНСТАНТЫ ==============================</div><div class="code_line">#define ISR_PIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2 //пин(менять перед объявлением библиотеки) </div><div class="code_line">&nbsp;</div><div class="code_line">#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)</div><div class="code_line">&nbsp;&nbsp; &nbsp;#if (ISR_PIN == PB2) || &nbsp;(ISR_PIN == B2) || &nbsp;(ISR_PIN == 2) || (ISR_PIN == 7)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EICRA &nbsp; _SFR_IO8(0x35)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISC00 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISC01 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EIMSK &nbsp; _SFR_IO8(0x3B)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define INT0 &nbsp; &nbsp;6</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EIFR _SFR_IO8(0x3A)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define INTF0 &nbsp; 6</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//OW Pin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PINS &nbsp; &nbsp;PINB</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN &nbsp; &nbsp; PINB2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PORT &nbsp; &nbsp;PORTB//_SFR_IO8(0x18)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define DDR &nbsp; &nbsp; DDRB</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN_INT ISR(INT0_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISR_INIT 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;#endif</div><div class="code_line">#elif defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)</div><div class="code_line">&nbsp;&nbsp; &nbsp;#if (ISR_PIN == PB2) || &nbsp;(ISR_PIN == B2) || &nbsp;(ISR_PIN == 2) || (ISR_PIN == 5)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EICRA &nbsp; _SFR_IO8(0x35)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISC00 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISC01 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EIMSK &nbsp; _SFR_IO8(0x3B)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define INT0 &nbsp; &nbsp;6</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EIFR _SFR_IO8(0x3A)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define INTF0 &nbsp; 6</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//OW Pin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PINS &nbsp; &nbsp;PINB</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN &nbsp; &nbsp; PINB2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PORT &nbsp; &nbsp;PORTB//_SFR_IO8(0x18)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define DDR &nbsp; &nbsp; DDRB</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN_INT ISR(INT0_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISR_INIT 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;#endif</div><div class="code_line">#elif defined (__AVR_ATmega328P__)</div><div class="code_line">&nbsp;&nbsp; &nbsp;#if (ISR_PIN == 2) || (ISR_PIN == D2) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//OW Pin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PINS _SFR_IO8(0x09)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN &nbsp; PIND2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PORT _SFR_IO8(0x0B)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define DDR &nbsp;_SFR_IO8(0x0A)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN_INT ISR(INT0_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISR_INIT 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;#endif</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;#if &nbsp;(ISR_PIN == 3) &nbsp;|| (ISR_PIN == D3) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//OW Pin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PINS _SFR_IO8(0x09)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN &nbsp; PIND3</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PORT _SFR_IO8(0x0B)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define DDR &nbsp;_SFR_IO8(0x0A)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN_INT ISR(INT1_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISR_INIT 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#if defined ISR_INIT</div><div class="code_line">&nbsp;</div><div class="code_line">//OW Pin</div><div class="code_line">#define OW_PORT PORT //1 Wire Port</div><div class="code_line">#define OW_PIN PINS //1 Wire Pin as number</div><div class="code_line">#define OW_PORTN (1&#60;&#60;PIN) &nbsp;//Pin as bit in registers</div><div class="code_line">#define OW_PINN (1&#60;&#60;PIN)</div><div class="code_line">#define OW_DDR DDR &nbsp;//регистр направления</div><div class="code_line">#define SET_LOW {OW_DDR|=OW_PINN;OW_PORT&amp;=~OW_PORTN;} &nbsp;//установить линию 1-Wire на низкий уровень</div><div class="code_line">#define RESET_LOW {OW_DDR&amp;=~OW_PINN;} &nbsp;//установить вывод 1-Wire в качестве входа</div><div class="code_line">&nbsp;</div><div class="code_line">//Pin interrupt</div><div class="code_line">#define EN_INT {EIMSK|=(1&#60;&#60;INT0);EIFR|=(1&#60;&#60;INTF0);} &nbsp;//enable interrupt </div><div class="code_line">#define DIS_INT &nbsp;EIMSK&amp;=~(1&#60;&#60;INT0); &nbsp;//disable interrupt</div><div class="code_line">#define SET_RISING EICRA=(1&#60;&#60;ISC01)|(1&#60;&#60;ISC00); &nbsp;//set interrupt at rising edge</div><div class="code_line">#define SET_FALLING {EICRA &amp;= ~(1 &#60;&#60; ISC00);EICRA|=(1&#60;&#60;ISC01);} //set interrupt at falling edge</div><div class="code_line">#define SET_CHANGE {EICRA &amp;= ~(1 &#60;&#60; ISC01) ;EICRA|=(1&#60;&#60;ISC00);}//set interrupt at change edge</div><div class="code_line">#define CHK_INT_EN (EIMSK&amp;(1&#60;&#60;INT0))==(1&#60;&#60;INT0) //test if interrupt enabled</div><div class="code_line">&nbsp;</div><div class="code_line">class _ISR {</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; void proc();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; void(*CallbackCommand_)(uint8_t retv);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; friend void INTP();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_ISR();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;void begin(void (*callback)(uint8_t retv));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">};</div><div class="code_line">#endif</div><div class="code_line">#endif</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
файл _ISR.cpp<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &quot;Arduino.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">#include &quot;_ISR.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">/* Access variable for ISRs */</div><div class="code_line">static _ISR *instance = NULL;</div><div class="code_line">void (*p_function)(); &nbsp; // указатель на p_function</div><div class="code_line">_ISR::_ISR(){}// конструктор</div><div class="code_line">&nbsp;</div><div class="code_line">PIN_INT {//прерывание</div><div class="code_line">&nbsp;&nbsp;(*p_function)();</div><div class="code_line">}</div><div class="code_line">// спасибо Гайверу за универсальную функцию</div><div class="code_line">void attachFunction(void (*function)()) { // передача указателя на функцию</div><div class="code_line">&nbsp;&nbsp;p_function = *function;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void INTP(){</div><div class="code_line">&nbsp;&nbsp; &nbsp;instance-&#62;proc();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void _ISR::proc(){</div><div class="code_line">&nbsp;&nbsp; &nbsp;CallbackCommand_(0x01);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void _ISR::begin(void (*callback)(uint8_t retv)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;cli();//откл. глоб.прер.</div><div class="code_line">&nbsp;&nbsp; &nbsp;RESET_LOW;//пин на вход</div><div class="code_line">&nbsp;&nbsp; &nbsp;SET_FALLING;</div><div class="code_line">&nbsp;&nbsp; &nbsp;EN_INT;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sei(); // enable interrupts</div><div class="code_line">&nbsp;&nbsp; &nbsp;attachFunction(INTP);</div><div class="code_line">&nbsp;&nbsp; &nbsp;instance = this;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CallbackCommand_ = callback;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
файл tst_ISR_on_CLASS.ino<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;_ISR.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">_ISR tst;</div><div class="code_line">void INT(uint8_t retv);</div><div class="code_line">void setup() {</div><div class="code_line">&nbsp;&nbsp;Serial.begin(9600);</div><div class="code_line">&nbsp;&nbsp;tst.begin(&amp;INT);</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void loop() {</div><div class="code_line">&nbsp;&nbsp;// put your main code here, to run repeatedly:</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void INT(uint8_t retv){</div><div class="code_line">&nbsp;&nbsp;Serial.println(&quot;OK&quot;);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
код для второй ардуины для теста (просто шлем импульсы на вход прерывания второй ардуины<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#define INT 4</div><div class="code_line">void setup() {</div><div class="code_line">&nbsp;pinMode(INT, OUTPUT);</div><div class="code_line">&nbsp;pinMode(LED_BUILTIN, OUTPUT);</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void loop() {</div><div class="code_line">&nbsp;&nbsp;delay(1000);</div><div class="code_line">&nbsp;&nbsp;digitalWrite(INT,1);</div><div class="code_line">&nbsp;&nbsp;digitalWrite(LED_BUILTIN,1);</div><div class="code_line">&nbsp;&nbsp;delay(200);</div><div class="code_line">&nbsp;&nbsp;digitalWrite(INT,0);</div><div class="code_line">&nbsp;&nbsp;digitalWrite(LED_BUILTIN,0);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
тема закрыта&#33;]]></description>
        <author>SOY</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427466&amp;view=findpost&amp;p=3866377</guid>
        <pubDate>Tue, 24 May 2022 15:27:29 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427466&amp;view=findpost&amp;p=3866377</link>
        <description><![CDATA[SOY: Прувет, народ&#33;<br>
Всю голову сломал, помогите&#33;<br>
требуется вызвать функцию внутри класса по указателю. при попытке получить указатель компилятор ругается.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">uint8_t ADDR;</div><div class="code_line">void (*ptrFnc)();</div><div class="code_line">&nbsp;</div><div class="code_line">class OWSlvDevice {</div><div class="code_line">&nbsp;&nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;OWSlvDevice(byte Interrupt_pin){// конструктор</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Itrrpt.Pin(Interrupt_pin);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void begin(uint8_addr) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ADDR = addr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ptrFnc = CreateObject;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;private:</div><div class="code_line">&nbsp;&nbsp; &nbsp;void CreateObject(){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Serial.println(&quot;&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
компилятор выдает ошибку:<br>
<br>
In file included from C:&#092;...&#092;...&#092;T...&#092;TX.ino:1:0:<br>
sketch&#092;OWSlvDevice.h: In member function &#39;void OWSlvDevice::begin(uint8_t)&#39;:<br>
OWSlvDevice.h:63:14: error: cannot convert &#39;OWSlvDevice::CreateObject&#39; from type &#39;void (OWSlvDevice::)()&#39; to type &#39;void (*)()&#39;<br>
       ptrFnc=CreateObject;<br>
              ^~~~~~~~~~~~<br>
exit status 1<br>
cannot convert &#39;OWSlvDevice::CreateObject&#39; from type &#39;void (OWSlvDevice::)()&#39; to type &#39;void (*)()&#39;]]></description>
        <author>SOY</author>
        <category>Микроконтроллеры</category>
      </item>
	
      </channel>
      </rss>
	