AVRからLocoNetに送信

以前、LocoNetにAVRを接続する回路は掲載しました。が、送信禁止期間等の実装がようやくできたので送信だけとりあえず現状を公開します。環境はAVR-GCCと、ATtiny2313で実験しています。
センサーとモボ621

ファイル

利用手順

初期化

uartの初期化をする必要があるので、init_uart(16600);として初期化しておき、割り込み許可しておきます。これは、割り込みを利用したUSART通信を参照してください。

タイマー

送信禁止期間の計測をするために、外部でタイマーを用意する必要があります。具体的には定期的に、loconet_timer関数を引数に㎲単位の経過時間をつけてコールする必要があります。

たとえば、タイマー0を用いて、800㎲ごとの割り込みを利用する場合割り込みの時に、

       loconet_timer(800);

とし、この関数を呼んでください。

LocoNetパケットの送信

パケットの送信にはloconet_send関数を利用します。引数に送信するバイト列の配列へのポインタと、送信するバイト数を渡します。エラーバイトは自動的に計算され送信されるので配列に含める必要はありません。送信時にLocoNetが利用中であったり、送信禁止期間であった場合は送信できる状態になるまで待機します。送信そのものはシリアルの割り込みで送信されますが、送信が開始されるまでは処理が進みません。(これが今後の改善点ですね)。次の例は線路電源をONにするパケットを送信する例です。

uint8_t POWER_ON[] = {0x82};
loconet_send(POWER_ON,1);

利用例

以下は1秒ごとにセンサー検出のON,OFFを送出する例です。

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "uart.h"
#include "loconet.h"

void delay_ms(uint16_t ms){
	while(ms--){
		_delay_ms(1);
	}
}

ISR(TIMER0_COMPB_vect){
	loconet_timer(800);
}

int main(){

	init_uart(16600);

	//800us割り込み
	TCCR0A = 0b00000010;
	TCCR0B = 0b00000011;
	OCR0A = 100;
	OCR0B = 50;
	TIMSK |= 0b100; //COMPB割り込み

	sei();

	uint8_t BDL_ON[] = {0xB2,0x00,0x50};
	uint8_t BDL_OFF[] = {0xB2,0x00,0x40};

	while(1){
		loconet_send(BDL_ON,3);
		wait_ms(1000);
		loconet_send(BDL_OFF,3);
		wait_ms(1000);
	}

return 0;
}

プロジェクトファイル

AVR StudioとWinAVR用のプロジェクトファイルをおいておきます。
こちらは一秒ごとにレール電源をオンオフします。
loconet-test.lzh

この記事はDCC機器の自作に投稿されました タグ: , , , , , . このパーマリンクをブックマークする。 コメントを投稿するか、トラックバックをどうぞ: トラックバック URL.

17 コメント