無料ブログはココログ

« DCCデコーダアドレス | トップページ | C-SizeDCC 改訂版その2 »

2020年9月 3日 (木)

C-SizeDCC 改訂版

C-SizeDCC基板をマスコン化

ミント缶と違い高さに制限がないのでライトアングルのローターリーエンコーダを無改造で実装出来る基板を設計しました。原点出しスイッチの位置決めさえうまくいけばマスコン化が出来そうです。
ターンアウトデコーダをドライブ出来なかったTB67H450は諦め、ロジック出力端子を設けて必要に応じてモータードライバーを外付する事にしましたが、DCC規格のブースター接続仕様ではありません。

Csizedcc_top

IICポートをファンクションボタン基板で占有すると自動運転基板が使えません。私はヘッドライトと室内灯だけでさほど必要性を感じませんが、念のため未使用のアナログ3入力をコネクタ出しにして、アナログボタンを最大15個外付け出来るようにしました。

Csizedcc_sch

スケッチからgetButtonStatus()をコールして、ボタンに変化があるとnotifyGetButton()をコールバックします。

#include "AnaButtons.h"
AnaButtonLib AnBtn;
void loop()
{
if( (millis() - gPreviousL1) > 100) {
...
AnBtn.getButtonStatus();
...
}
}
void notifyGetButton(byte BtNum, byte Stat)
{
...
}

Arduino Nano Every

C-Size DCCコントローラは秋月電子の部品だけで作る事を目指しましたが、Arduino Nano Everyの互換性に問題ありです。ATMega4809はD9、D10のPWM周期にシステムタイマーのTCA0を割り付けています。PWM周波数を31.25KHzにすると millis()やDCCパケット処理を32倍にしないといけないので初期値の976Hzのままです。

  #if defined(__AVR_ATmega4809__)
//TCA0.SINGLE.CTRLA |= TCA_SINGLE_CLKSEL_DIV2_gc; // millis() x 32
TCA0.SINGLE.CTRLA |= TCA_SINGLE_CLKSEL_DIV64_gc; // default
#else
TCCR1B &= B11111000; // clear prescaler
TCCR1B |= B00000001; // set 1/1
#endif

因みにD3とD6はTCBを割り付けていますが、D3はローターリーエンコーダの割り込み入力に使います。またTCBにはプリスケーラが無い様でクロックセレクトCLKDIV2(TCA x 1/2)の選択だけです。

ATMega4809は全ピン割り込みが可能で attachInterruptのピン番号が異なりますので、Arduinoリファレンスの推奨に従い digitalPinToInterrupt()でピン番号を指定しました。

 

« DCCデコーダアドレス | トップページ | C-SizeDCC 改訂版その2 »

コントローラ」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« DCCデコーダアドレス | トップページ | C-SizeDCC 改訂版その2 »