SSブログ

そういえば生存報告その2 [ds-DCCデコーダ]

 さて、先週はnmraDCCのESP32が動くはずのバージョンで動かないとブツブツと言っていましたが、その後です。
 Yaasanさんアドバイスありがとうございます。ただ、#define ESP32が宣言されてなくって、うまくコンパイルされていないのではないか?については、デバイスをESP32 devに設定していると勝手にESP32が宣言されていることを確認しました。ということで、原因は別でした。
 NmraDccMultiFunctionDecoder_1.inoサンプル内をにらめっこしていて、
void setup()内で
Dcc.pin(0,2,0)があるのですが、これは、NmraDcc.h内で

/*+
* pin() is called from setup() and sets up the pin used to receive DCC packets.
*
* Inputs:
* ExtIntNum - Interrupt number of the pin. Use digitalPinToInterrupt(ExtIntPinNum).
* ExtIntPinNum - Input pin number.
* EnablePullup - Set true to enable the pins pullup resistor.
*
* Returns:
* None.
*/
void pin( uint8_t ExtIntNum, uint8_t ExtIntPinNum, uint8_t EnablePullup);

と説明されています。問題はここでした。
ArduinoUnoではExtPinNum(物理ピン番号)が2の時。ExtIntNum(割り込み番号)が0で、これを記述すると、Dcc.pin(0,2,0)となります。
ESP32では、この物理ピン番号と割り込み番号の組み合わせは成り立ちません。(たぶんピン番号と割り込み番号が同一と思うんだけど、試していない)
で、Pin()の命令のもう一つの形態が2変数バージョンで、

/*+
* pin() is called from setup() and sets up the pin used to receive DCC packets.
* This relies on the internal function: digitalPinToInterrupt() to map the input pin number to the right interrupt
*
* Inputs:
* ExtIntPinNum - Input pin number.
* EnablePullup - Set true to enable the pins pullup resistor.
*
* Returns:
* None.
*/
#ifdef digitalPinToInterrupt
void pin( uint8_t ExtIntPinNum, uint8_t EnablePullup);
#endif

となっており、この2変数関数の内部は、NmraDcc.cppのほうで

#ifdef digitalPinToInterrupt
void NmraDcc::pin( uint8_t ExtIntPinNum, uint8_t EnablePullup)
{
pin(digitalPinToInterrupt(ExtIntPinNum), ExtIntPinNum, EnablePullup);
}
#endif

と3変数バージョンを呼んでいます。第一引数のdigitalPinToInterrupt(ExtIntPinNum)はピン番号から割り込み番号を返す関数のようで、こちらに変えたら、ちゃんと動きました。
つまり、setup()内の割り込みピンの設定関数を、下記例では、どちらも2ピンとしていていますが
Dcc.pin(0,2,0)から
Dcc.pin(2,0)に変更してうごくようになりました。
3日ぐらい、動かずに悩んでしまいました・・・。

現在、Mp3V5の各命令をなんとなくコピーしながら、動作確認を始めて、室内灯、ヘッド、テールライト、前後切り替えぐらいは動くようになりましたが、モーター部分やCVのWriteとかはまだです。ということで写真的には先週とほぼ変わらない状態です。
 この話題、もう少し続けます・・・。
re_DSC02829.jpg



コメント(2) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。