目次
前
次
Brainマイコン
Brainマイコンは、R8C/Tinyを利用します。
2005年のトランジスタ技術誌付録として入手し
現在まで使わずにいました。死蔵品とするには
忍びないので、今回利用します。
スタートトリガーを判定し、3つの下位マイコン
に起動信号を送信します。
スタートトリガーは、距離センサーでスタート
ゲートが開いたことで発生すると仮定します。
idel、runの2つのモードを用意し、トリガー
信号で切り換えます。
ファームウエアは、次のシーケンスで
動かします。
- I/O初期化
- トリガー待ち
- モード変更
- 下位マイコンに信号送信
- 2に戻る
スタートトリガーは、外部割込みで入力し
下位マイコンへの信号は、3ビットレベル
トリガーとします。
信号は、ポート1に次のように割当てます。
- モニタLED p1_7
- トリガー入力 p1_5
- BCSトリガー p1_2
- GBCトリガー p1_1
- SubBrainトリガー p1_0
モニタLEDは、ユーザーがマシンの状態を
把握するために利用します。
モニタLEDの点滅 → idel状態
モニタLEDの点灯 → run l状態
ソースコードは、以下です。
#include "sfr_r815.h"
typedef unsigned char UBYTE ;
volatile UBYTE mode ;
#define OFF 0
#define ON OFF+1
#define SW_ON 0
#define SW_OFF SW_ON+1
#define IDLE 0
#define RUN IDLE+1
#define P1 p1
#define PD1 pd1
#define SUB_TRG p1_0
#define GBC_TRG p1_1
#define BCS_TRG p1_2
void user_initilize(void);
void set_trg(UBYTE x);
void main(void)
{
/* initialize */
user_initilize();
/* endless loop */
while ( ON ) {
/* judge switch state */
if ( p1_7 == SW_ON ) {
p1_6 = ON ; /* turn on LED */
if ( mode == IDLE ) { mode = RUN ; }
else { mode = IDLE ; }
} else {
p1_6 = OFF ; /* turn off LED */
}
/* set mode */
if ( mode == RUN ) { set_trg(ON) ; }
else { set_trg(OFF); }
}
}
void user_initilize(void)
{
/* clock */
prc0 = ON ; /* enable CM access */
cm13 = ON ; /* select Xin - Xout */
cm05 = OFF ; /* enable external clock */
cm06 = OFF ; /* not 1/8 */
asm("NOP") ; /* wait stable state */
asm("NOP") ;
asm("NOP") ;
asm("NOP") ;
ocd2 = OFF ; /* select main clock */
prc0 = OFF ; /* disable CM access */
/* initialize port 1 */
P1 = 0x00 ; /* 0000 0000 */
PD1 = 0x7f ; /* iooo oooo */
/* set mode */
mode = IDLE ;
}
void set_trg(UBYTE x)
{
SUB_TRG = x ;
GBC_TRG = x ;
SBC_TRG = x ;
}
ボード全体は、次のようになります。
R8C/Tiny周辺回路は、極力部品が少なく
なるようにしました。
目次
前
次