デビアンな生活 MCU

デビアンな生活

日本語コンソールベースのDebianTIPS集として始めたが、結局LXDEになってしまった。

Nuttx

nuttxを使って、stm32f4discoveryをいじり始めることにしたので、久々にサイトをチェックすると、順調にバージョンアップを続けている。

1.ホスト環境
手元にある仮想環境のubuntu 10.04 LTSを使う。当然、とっくにサポートが終了しているいるので、/etc/apt/sources.listを編集して、リポジトリをold-releases.ubuntu.comに変更したあと、Synapticでpackage update。

2.Gnu ARM Embedded Toolchain
https://developer.arm.com/open-source/gnu-toolchain/gnu-rmからダウンロードすればよいのだが、linux版のバイナリは64bitしかない。手元のubuntuは32bitなので、仕方なくソースをダウンロードして自力でビルド。
ファイルを展開した後に、srcのサブディレクトリにあるアーカイブも全部展開。
ビルドに不足しているパッケージを追加。
sudo apt-get install p7zip-full gawk gzip perl autoconf m4 automake libtool libncurses5-dev gettext gperf dejagnu expect tcl autogen flex flip bison tofrodos texinfo gcc-multilib libgmp3-dev libmpfr-dev debhelper texlive texlive-extra-utils g++
実際のコンパイルは以下のスクリプトで行うが、かなり時間がかかる上、容量も15GB以上必要なので要注意。
./build-prerequisites.sh --skip_steps=mingw32
./build-toolchain.sh --skip_steps=mingw32
結局、ドキュメントの作成で異常終了したが、バイナリはできたのでよしとした。
install-nativeにバイナリがあるので、
mv install-native $HOME
cd
ln -s install-native/bin bin
一度log outすれば、.profileのスクリプトでPATHが設定される。

3.nuttxビルドと書込み
http://nuttx.org/から、nuttx-7.19, appa-7.19、toolsをダウンロード。
toolsを展開したら、必要なパッケージを導入して、kconfig-frontendsをコンパイル。
sudo apt-get install libncurses5-dev
cd kconfig-frontends
./configure --enable-mconf --disable-nconf --disable-gconf --disable-qconf --prefix=/usr
make
sudo make install
nuttx-7.19とappa-7.19を展開して、リンク作成。
ln -s nuttx-7.19 nuttx
ln -s apps-7.19 apps

4.nshビルドと実行
UART2コンソールのnshに加えて、USBコンソールのusbnshがあるので、今回こちらをビルド。
cd nuttx/tools
./configure.sh stm32f4discovery/usbnsh
標準のホストはwindowsなので、Linuxに変更して、ビルド。
make menuconfig
Build Host Platform: Linux
make
nuttx.binをWindows環境に移す。
http://www.st.com/ja/embedded-software/stsw-link004.htmから、ST-Link Utilityをダウンロードして導入。
ST-Link Utilityを実行して、stm32f4discoveryをUSBでCN1(Mini B)に繋ぎ、データを書き込む。
Target/Connect
File/open file - nuttx.bin
Target/Program & Verify

5.起動
一度CN1(Mini B)を抜いて電源を切った後、USBでCN5(Micro B)を繋ぐ。
CN1(Mini B)を再度繋いで起動すると、CN5側に仮想COMポートができるので、tera termで、115200bps 8bin 1stop bitで接続する。
数回ENTERを入力すると起動メッセージが表示される。
NuttShell (NSH) NuttX-7.19
nsh> ?
help usage: help [-v] []

[ cmp false mkdir rm true
? dirname free mh rmdir uname
basename dd help mount set umount
break df hexdump mv sh unset
cat echo kill mw sleep usleep
cd exec ls ps test xd
cp exit mb pwd time

Builtin Apps:
nsh>
上記のように表示され、めでたし、めでたし。




スポンサーサイト

STM32F4 Discoveryの拡張ボード

nuttxは昔のlinuxを思わせ、STM32F4 Discoveryをいろいろ触ってみる気にさせる。でも、LANポートがほしい。
Etherportを付けるためは、LAN9820AやDP83848などのPHY ICを接続することが必要だ。
自作は難しそうだが、拡張ボードSTM32F4DIS-BBが発売されている。これはnuttxでサポートされているうえに、microSDカードスロットやシリアルのコネクタもあるので便利がよさそうだが、element14で25.54ポンド(約4700円)と少し高い。
alibabaのaliexpressを見てみると、LCD付きで50ドルの拡張ボードがあるので、人柱でこれに挑戦してみるのも良いかもしれない。

STM32F4 Discovery再び

しばらく眠っていたSTM32F4を再びいじってみた。以前触ってみたnuttxがバージョンアップしていたので、とりあえずコンパイル。
まずは、いつものubuntu11.04がサポート切れになっていたので、/etc/apt/surces.listを編集して、リポジトリをold-releases.ubuntu.comに変更。
https://bitbucket.org/patacongo/から、nuttx-7.12.tar.gz、apps-7.12.tar.gz、buildroot-1.14.tar.gzをwindowsでダウンロード。
root権限で、/media/sf_tempを経由してファイルをubuntuの/home/user/nuttx-srcに移動して、所有者を変更。
tar xvf *でファイルを展開すると、nuttx-7.12、apps-7.12、miscができる。
ln -s nuttx-7.12 nuttx、ln -s apps-7.12 appsでリンクを作成。
cd nuttx/tools
./configure.sh stm32f4discovery/nshでnutshellを設定
cd ../../misc/buildroot-1.14
make menuconfigで以下の設定
Target Architecture: arm
Target Architecture Variant: Cortex-M4F
Target ABI: EABI
Toolchain Options –>
Binutils Version: binutils 2.22
Build GCC cross-compiler: *
GCC compiler Version: 4.8.2
Build C++ compiler?: *
Build gdb for the Host: *
GDB debugger Version: 7.4.1
makeで、misc/buildroot-1.14/build_arm_hf/staging_dir/binに準備ができるので、
export $PATH:/home/user/nuttx-src/misc/buildroot-1.14/build_arm_hf/staging_dir/bin
パスを追加。
cd ../../nuttx
make menuconfigでnuttxの設定
Build Setup, Build Host Platform (Linux)
System Type, FPU support: *
System Type, Toolchain Selection (Buildroot (Cygwin or Linux)
保存したら、make
nuttx.binができるので、windowsに移動して、
USBで接続して、stm32 ST-LINK Utilityでボードに書き込み。
USART2をRS232変換し、シリアル接続すると、無事、以下のように表示される。

NuttShell (NSH) NuttX-7.12
nsh> help
help usage: help [-v] []

[ dd hexdump mh set usleep
? echo kill mv sh xd
break exec losetup mw sleep
cat exit ls ps test
cd false mb pwd true
cp free mkdir rm uname
cmp help mkfifo rmdir unset

Builtin Apps:
nsh>

DHCPサーバ

節電のため、夜間にサーバをシャットダウンしている。その為、DHCPサーバを働かず、ネットワークプリンタを使用するにも、サーバの起動が必要となる。DHCPサーバを独立させようとしたが、無線LANルータのDHCPサーバでは、gatewayやDNSサーバを指定できない。そこで、H8でDHCPサーバを作ってみました。
マシンはAKI H8-3069LANで、OSはMES2.3r17を使用しました。MESは既に開発が終了していますが、UDP、TCPをサポートして、マルチタスクの上、gccの開発環境が快適です。
MES2.3の制約のため、ブロードキャストを受信する場合、宛先のIPがわからないので、矛盾のない限り、自局宛として処理しています。また、時間の処理が面倒なので、リースタイムの処理はすべて、クライアント任せで、自分ではIPをリリースしません。DHCPサーバの状況確認は、共有メモリでパラメータを受け渡して、簡易WWWサーバで表示しています。EEPROMにコピーし、起動時にRUN.BATを走らせればOKです。
20MZの上、解析のためパケットを常にシリアルに出力しているので、即座にパケットを打ち返されると間に合いませんが、十分快適に動作しています。これで、Debianサーバがなくても、家庭内のLANは動作するようになりました。それにしても、AKI H8-3069LANはとても使いやすい素材です。
お試しにバイナリを置いておきます。管理IPを最大40個、WWWはポート3000でアクセスします。
dhcps.zip

STM32F4 Discoveryも買いました

H8-3069Fが面白かったので、ついSTM32F4 Discoveryも買ってしまいました。Floatユニットがあるなんて、PC9801に8087を載せた時以来の感激です。
でも、使い古された3069Fと違って、ハードルが高そう。
とりあえず、audio_playback_and_recordのsampleをEWARMでコンパイルして、ST-LINKで書き込んでみた。イヤホンを差し込むとちゃんとループの音楽が聞こえて感激。
次はOSだ。サンプルにもFreeRTOSが含まれているが、組込み目的のミニマルセットで面白くない。OSにはシェルがなければ。BeRTOSはいろいろ揃っていて面白そうだが、まだF4用はなさそう。ChibiOS/RTはFreeRTOSと同じようだし。
といううわけで、探しているとnuttxが面白そう。STM32F4 Discoveryに対応しているし、nshというシェルも載っている。FreeRTOSより必要なリソースが多そうだが、STM32F4 Discoveryでは気にならない。
コンパイルするには、UNIX環境が必要そうなので、気は進まなかったが、Cygwinをインストールしてみた。何とか、努力したがnuttxのコンパイルができず、STM32F4 DiscoveryについてのREADMEを読むと、Cygwin環境はお勧めではなさそう。
結局、VirtualBoxをインストールして、実績のあるubuntu 11.04をセットアップした。debianと環境はほとんど同じだが、rootでないので、sudoがうっとおしい。
まず、arm-gccのセットアップからだが、以下の必要なパッケージをインストール。
git zlib1g-dev libtool flex bison libgmp3-dev libmpfr-dev 
libncurses5-dev libmpc-dev texinfo libftdi-dev autoconf
gperf

よく引用されているhttps://github.com/MikeSmith/summon-arm-toolchain.gitのレポジトリーはもうないようなので、以下からダウンロードしてコンパイル。
git clone git://github.com/esden/summon-arm-toolchain
cd summon-arm-toolchain
./summon-arm-toolchain

newlibのダウンロードに失敗するので、別にダウンロードしたnewlib-1.19.0.tar.gzをあらかじめsourcesディレクトリに置き、stampsディレクトリにnewlib-1.19.0.fetchファイルを作っておく。
かなり時間はかかったが、親ディレクトリーにsatができるので、.profileを編集して、PATH=$PATH:$HOME/sat/binでPATHを通しておく。
次に、nuttxの設定メニューを使うために、kconfig-frontendsをダウンロードする。最新は、kconfig-*にコマンド名が変わっているので、nuttxのレポジトリーから、kconfig-frontends-3.3.0-1.tar.gzをダウンロードしてインストール。
cd kconfig-frontends-3.3.0-1
./configure
sudo make install
ldconfig

最後に、本体nuttx-6.22.tar.gzとapps-6.22.tar.gzをダウンロードして、コンパイル。
tar xvf nuttx*
tar xvf apps*
ln -s nuttx-6.22 nuttx
ln -s apps-6.22 spps
cd nuttx
cd tools
./configure.sh stm32f4discovery/nsh
cd ..
make menuconfig
. ./setenv.sh
make

これで、nuttx.binができるので、windows7に移してボードに書き込み。
USART2がコンソールになるので、冗長になるが、下記の回路でレベル変換して、シリアル接続したのちUSB変換ケーブルでwindows7に接続。材料は秋月電子通商でICセットI-03030の300円とDサブ9ピンK-05406の150円。
USART2レベル変換
teraterm-4.75でシリアル接続(115200bps8n1)して、リセットするとnshが動いた。
NuttShell (NSH) NuttX-6.22
nsh> help
help usage: help [-v] []

[ dd help mkfifo set usleep
? echo kill mh sh xd
cat exec losetup mw sleep
cd exit ls ps test
cp free mb pwd unset

Builtin Apps:
nsh> ls
/:
dev/
nsh> ls dev
/dev:
console
null
ttyS0
nsh> free
total used free largest
Mem: 193312 6688 186624 126288
nsh>

とりあえず、何もできないが、nshはアプリの追加ができるし、nuttx本体はいろいろ周辺のコンフィグレーションができそうで楽しみ。

赤外線リモコン送信

今回のターゲットであるYAMAZENの扇風機はコード1を5回、コード2を3回送信しているようなので、とりあえず解析データをその通りに送ると問題なく動いた。搬送波は38kHzの30%デューティでないとうまくいかなかったが、ソニーの機材をコントロールすることも考えて、少し周期を縮めてみた。最初は赤外線LEDの保護のために出力にかませていたコンデンサのために動作が安定せず苦労した。
Nationalのエアコンは解析が面倒なので、信号パターンをそのまま送信してみた。これで、とりあえず、実験は成功で、エアコンと扇風機が見事に連動して動いた。
// 赤外線リモコン送信プログラム by K Fujio 2012
// 搬送波は16ビットタイマ0で作成し、
// 解析通りに16ビットタイマ1でカウントして、オンオフしている。

#include <mes2.h>
#include <h8/reg3067.h>
static unsigned short yzrotate[] ={
3443, 819, 3382, 818, 1269, 2928, 3386, 818,
3452, 748, 1326, 2871, 3384, 820, 1268, 2930,
1272, 2930, 1271, 2929, 1271, 2929, 1271, 19822,
//
3381, 820, 3381, 820, 1271, 2929, 3380, 820,
3381, 820, 1191, 2986, 3328, 826, 1263, 2932,
1269, 2932, 1270, 2932, 1269, 2932, 1269, 19820,
0 };

static unsigned short yzpower[] ={
3439, 826, 3374, 827, 1265, 2925, 3384, 827,
3374, 827, 1263, 2926, 1272, 2932, 1268, 2932,
1268, 2933, 1268, 2929, 1271, 2933, 3381, 17708,
//
3385, 819, 3382, 819, 1265, 2931, 3385, 818,
3382, 818, 1269, 2928, 1272, 2928, 1272, 2928,
1273, 2928, 1272, 2928, 1272, 2928, 3385, 17707,
0 };

static unsigned short ntpower[] ={
8897, 8450, 2276, 6396, 2405, 6334, 2345, 2026, 2405,
6335, 2343, 6396, 2406, 6335, 2344, 6396, 2406, 6335, 2344,
6396, 2406, 6335, 2343, 2026, 2406, 6334, 2345, 6397, 2405,
6335, 2343, 6396, 2407, 6334, 2343, 6397, 2406, 6335, 2343,
6397, 2406, 1965, 2405, 1965, 2404, 1966, 2404, 1966, 2404,
1966, 2404, 6336, 2405, 6334, 2345, 6396, 2406, 1965, 2405,
1966, 2404, 1966, 2404, 1966, 2404, 1966, 8960, 8451, 2275,
6398, 2343, 6397, 2343, 2026, 2406, 6335, 2405, 6335, 2344,
6397, 2405, 6334, 2344, 6397, 2405, 6335, 2343, 6397, 2344,
2025, 2407, 6335, 2406, 6334, 2344, 6397, 2406, 6335, 2343,
6397, 2406, 6334, 2343, 6396, 2344, 6398, 2405, 1964, 2406,
1966, 2405, 1965, 2405, 1965, 2405, 1966, 2405, 6335, 2343,
6398, 2404, 6335, 2344, 2027, 2405, 1965, 2405, 1966, 2404,
1966, 2405, 1965, 8961, 8450, 2338, 34678, 9026, 8451, 2275,
2027, 2405, 1966, 2404, 6335, 2343, 2027, 2406, 6334, 2343,
6397, 2406, 6335, 2343, 6396, 2406, 1965, 2405, 1965, 2405,
6335, 2405, 1965, 2406, 6335, 2405, 6335, 2343, 6397, 2406,
6334, 2343, 2026, 2407, 6334, 2344, 6398, 2405, 1964, 2406,
6334, 2344, 6397, 2343, 2026, 2407, 1965, 2405, 1966, 2405,
6334, 2344, 6397, 2406, 1964, 2406, 6335, 2406, 6336, 2342,
2026, 2407, 1965, 8962, 8451, 2337, 1966, 2405, 1965, 2406,
6334, 2406, 1964, 2406, 6335, 2343, 6396, 2343, 6397, 2406,
6335, 2343, 2026, 2407, 1965, 2406, 6335, 2342, 2026, 2406,
6336, 2405, 6335, 2343, 6397, 2343, 6397, 2406, 1965, 2406,
6334, 2344, 6397, 2405, 1965, 2406, 6335, 2406, 6335, 2343,
2026, 2407, 1965, 2405, 1965, 2406, 6334, 2406, 6335, 2343,
2027, 2406, 6335, 2406, 6334, 2344, 2026, 2407, 1965, 8961,
8451, 2337, 0, 0
};

static unsigned short nttimer[] ={
9025, 8452, 2336, 6336, 2344, 6396, 2406, 6334, 2344,
6397, 2404, 1966, 2405, 1967, 2403, 1968, 2403, 1967, 2403,
6336, 2344, 6395, 2405, 6335, 2343, 6397, 2405, 1966, 2405,
1967, 2403, 1968, 2403, 1967, 2403, 1968, 2402, 1967, 2401,
1968, 2402, 1969, 2402, 6335, 2345, 2026, 2405, 1967, 2404,
1967, 2403, 1967, 2402, 1968, 2402, 1968, 2403, 1968, 2402,
6334, 2405, 1965, 2405, 1967, 2403, 1967, 8958, 8452, 2337,
6334, 2346, 6396, 2405, 6336, 2344, 6396, 2405, 1966, 2405,
1968, 2402, 1969, 2401, 1968, 2402, 6335, 2345, 6397, 2404,
6336, 2344, 6394, 2406, 1966, 2404, 1968, 2403, 1968, 2401,
1969, 2402, 1968, 2401, 1969, 2401, 1969, 2402, 1968, 2402,
6335, 2406, 1965, 2405, 1967, 2403, 1968, 2403, 1968, 2402,
1968, 2403, 1968, 2402, 1968, 2402, 6335, 2345, 2026, 2404,
1967, 2403, 1968, 8958, 8452, 2337, 6336, 2344, 6396, 2405,
6336, 2344, 6397, 2404, 1965, 2404, 1967, 2402, 1969, 2402,
1968, 2402, 6335, 2345, 6396, 2344, 6396, 2345, 6396, 2344,
2027, 2404, 1967, 2403, 1968, 2402, 1969, 2402, 1968, 2402,
1968, 2402, 1969, 2402, 1968, 2402, 6335, 2406, 1965, 2406,
1966, 2402, 1968, 2403, 1968, 2402, 1968, 2403, 1968, 2402,
1967, 2402, 6336, 2343, 2027, 2405, 1967, 2404, 1966, 8959,
8451, 2337, 0, 0
};

// IR pulse on 16 bit timer 0
// IR signal count on 16 bit timer 1
// pulse width is very critical
#define STATEA (265-1-1)
#define STATEB (85-1)

// IR control for Yamazen Fan
int yzctrl(unsigned short int *irdata){
unsigned short int i,j;

TSTR &= 0xfe; // stop 0
PADDR=0x04;
PADR=0x00;
TSNC = 0xf8;
TISRA = 0x88;
TCR0 = 0x80 | 0x20 | 0x01; // GRA clear and x2
GRA0 = STATEA;
GRB0 = STATEB;
TIOR0 = 0x88 | 0x10 | 0x02; // GRB 0 GRA 1
TMDR = 0x98 | 0x01; // PWM mode
TSTR &= 0xfd; //stop 1
TSNC = 0xf8;
TCR1 = 0x80 | 0x00 | 0x03; // no clear and x8
TIOR1 = 0x88;
TOLR=0xc0;

int_disable();
TSTR |= 0x02; //start 1
for(j=0; j<5; j++) {
for(i=0; i<24; i++) {
TSTR |= 0x01; // start 0
TCNT1=0; while(TCNT1 < irdata[i]){}
TSTR &= 0xfe; // stop 0
PADR=0x00;
i++;
TCNT1=0; while(TCNT1 < irdata[i]){}
}
}
for(j=0; j<3; j++) {
for(i=24; i<48; i++) {
TSTR |= 0x01; // start 0
TCNT1=0; while(TCNT1 < irdata[i]){}
TSTR &= 0xfe; // stop 0
PADR=0x00;
i++;
TCNT1=0; while(TCNT1 < irdata[i]){}
}
}
int_enable();
TSTR &= 0xfd; // stop 1
return i;
}

// IR control for National air conditioner
// simple copy send
int ntctrl(unsigned short int *irdata){
unsigned short int i,j;

TSTR &= 0xfe; // stop 0
PADDR=0x04;
PADR=0x00;

TSNC = 0xf8;
TISRA = 0x88;
TCR0 = 0x80 | 0x20 | 0x01; // GRA clear and x2
GRA0 = STATEA;
GRB0 = STATEB;
TIOR0 = 0x88 | 0x10 | 0x02; // GRB 0 GRA 1
TMDR = 0x98 | 0x01; // PWM mode
TSTR &= 0xfd; //stop 1
TSNC = 0xf8;
TCR1 = 0x80 | 0x00 | 0x03; // no clear and x8
TIOR1 = 0x88;
TOLR=0xc0;

int_disable();
TSTR |= 0x02; //start 1
i=0;
while(irdata[i] > 0) {
TSTR |= 0x01; // start 0
TCNT1=0; while(TCNT1 < irdata[i]){}
TSTR &= 0xfe; // stop 0
PADR=0x00;
i++;
TCNT1=0; while(TCNT1 < irdata[i]){}
i++;
}
int_enable();
TSTR &= 0xfd; // stop 1
return i;
}

int main(){
printf("NT POWER %d\r", ntctrl(ntpower));
sleep(1000);
printf("NT TIMER %d\r", ntctrl(nttimer));
sleep(1000);
printf("YZ POWER %d\r", yzctrl(yzpower));
sleep(1000);
printf("YZ ROTATE %d\r", yzctrl(yzrotate));
sleep(1000);
}

赤外線リモコン解析

H8-3069Fを購入したのに、まずはOSから離れてしまったのには、わけがあります。
ネットで情報をあさっていて、H83069Fさんのサイト(http://www.geocities.jp/h83069f/index.html)
をみると、赤外線リモコンの回路が載っている。簡単、しかもデバイスが安い。
赤外線LEDや赤外線受信モジュールが、100円だなんて知らなかった。さっそく購入して、扇風機を動かすぞ。
赤外線リモコン受信モジュールPL-IRM1261-C438(I-04169,¥100)
赤外線LED[5mm][940nm][55mW/sr]OSI5LA5113A(10個入)(I-04311,¥100)
最終的な回路は以下の通りというか、上記のサイトとほぼ同じ。
赤外線リモコン回路図
プログラムも上記のサイトを参考にして、YAMAZANの扇風機のリモコンコードを解析してみた。
ググった情報では、赤外線リモコンのフォーマットは、基本的にNEC式、家電製品協会式、ソニー式らしいが、リーダもないし、データのコード化も合わない。スキャンに誤差があるのかと、プログラムをソフトスキャンから、irq4割り込みに変更してみたが、やはり同じデータが得られた。ソニーのリモコンを解析するとソニー方式のパターンになっている雰囲気なので、とりあえずパルス・フォーマットをべたコピーして送信したら、扇風機がちゃんと動いた。書くとあっさりしているが、ほんとに動くのか疑心暗鬼のなかで、はじめて動いたときは感激した。あとで、送信プログラムをいろいろ調整してみると、搬送波の周波数もデューティ比も結構シビアで、試行錯誤で動いたのはラッキーだったと思った。
解析というより、パルスのコピーなので、最終的に16ビットタイマのインプットキャプチャ割り込みを使って、自分的にはカッコよく書き直してみた。これが、簡単にできるMESシステムと開発環境に改めて感激。

// 赤外線リモコン解析プログラム by K Fujio 2012
// 解析には16ビットタイマー1を8分周して使用します。
// カウントはインプットキャプチャ割り込みで取り込みます。
// タイマのオーバーフロー(約26ms)か、DATASIZE/2サイクルで終了します。
// ただし、最低1回の赤外線信号がなければ終了しません。
// タイマが競合しないならMESの割り込みは止めなくてもたぶん大丈夫。
#include <mes2.h>
#include <h8/reg3067.h>

#define DATASIZE 500
static unsigned short int p_value[DATASIZE];
static unsigned short int count;

#pragma interrupt
void int_imia1(void){
load_segment(28);
if(count TISRA &= 0xfd; //IMFA1 allow
}

int main(){
unsigned short int i;

printf("IR analysis\r");
count = 0 ;
set_handler(28, int_imia1);

// int_disable();
TSTR &= 0xfd; //stop timer 1
TSNC = 0xf8;
TCR1 = 0x80 | 0x20 | 0x03; // GRA clear and x8
TIOR1 = 0x8f; // GRA input CATURE
TISRA = 0xa0; //IMFA1 allow
TISRC &= 0xdd;

TSTR |= 0x02; //start timer 1
while(count < DATASIZE){
// printf("%d-", count);
if(TISRC & 0x02) {
if (count==0) {
TISRC &= 0xfd;
} else {
p_value[count]=0;
break;
}
}
}
TSTR &= 0xfd; //stop timer 1
// int_enable();

printf("\r-DATA-\r");
for(i=0; i printf("%d\r",p_value[i]);
if(p_value[i]==0) break;
}
printf("Count=%d\r", i);
}

AKI H8-3069F LAN

もともとOSが好きなので、「組み込みOS自作入門」を買ってしまった。
ターゲットのH8/3069Fネット対応マイコンLANボード(K-01271)が、なんと3750円。さっそく、秋月電子通商の通販で買ってしまった。
よし、OSでも作ろうかなと思ったものの、ROMの書き換え回数が100回までというのにビビってしまって、すぐには手が出せそうにない。
それに、もともとついているH8-OSが、すでにバージョンアップされてMES2となって、いろいろデバイスドライバがついていて、使いやすそう。既に開発者がH8を卒業されて、開発が終了しているのが残念だが、ネット上に再配布サイトがあったので、さっそく導入してみた。
MES2.3r18は、SDカードのドライバにバクがあるようなので、公式最終版のMES2.3r17を選択した。
大西@ソフト屋サイト(http://www.interq.or.jp/earth/atsushi/mes2/)から、
20MHz動作用のconfig.sys、shell.c、gcc23r17.exeをダウンロード。
また、本家みついわさんのサイト(http://mes.sourceforge.jp/mes26/)のサンプル例から、DHCPクライアントdhcp.h、dhcp.cをダウンロード。これは、MES23の環境でも動いたので便利。
秋月電子通商からは、ボードのほかに、ボードとPCの接続のため、USB・シリアル変換ケーブル(M-02746、¥900)、ケーブルコネクタのネジの干渉を避けるためにRS232C(Dサブ9P)延長ケーブル(C-00004、¥350)、1Mbit シリアルEEPROM(I-00187、¥270)を購入。
5VのACアダプタは手持ちを流用したが、なければこれも買っておく必要がある。
ホストPCは、windows7を使用しているので、XP modeにドライバをインストールして、変換ケーブルを接続し、COMポートを使えるようにしておく。
その後、gcc23r17をインストールし、mes23フォルダを作成して、shell.c, dhcp.h dhcp.cを配置する。
デスクトップのDevelopアイコンをクリックして、CbarLiteを起動し、ファイルメニューから、新規プロジェクトshellを作成する。設定メニューの環境設定を選び、読込ボタンから、User_H8.xmlを読み込む。ファイルメニューの追加で、Sourceにshell.cを追加。あとは、実行メニューのコンパイルでshell.elfを作成する。
同様に、新規プロジェクトdhcpを作成し、SourceとHeaderにそれぞれdhcp.cとdhcp.hをそれぞれ追加し、コンパイルして、dhcp.elfを作成する。mes23フォルダにdiskフォルダを作成し、作成したshell.elfとdhcp.elfを移動し、ダウンロードしたconfig.sysを配置する。config.sysは1MbitEEPROMを使うので、i2c0のsize=8000を20000に変更しておく。また、今後の自動実行のために、下記のautoexec.batファイルを作成しておく。
mount i2c0
/i2c0/run.bat

再びデスクトップからDisktoolを起動し、DiskLoadボタンを押して、先ほどのdiskフォルダを指定すると、4ファイルをmes2.motを含むdisk.motファイルがmes23フォルダに作成される。
H8ボードのdipスイッチをブートモードに設定して、シリアルコネクタを接続したら、電源と接続する。その後デスクトップからFlush writerを起動し、ボードの種類、comポートを選択し、57600bpsに設定したら、Writeボタンから先ほどのdisk.motファイルを選択すると、ROMに書き込みが行われる。
終了したら、H8ボードは、電源を切断し、DIPスイッチをモード5に設定する。
デスクトップのTerm(57600)でハイパーターミナルを開いた後、H8ボードに電源を入れるとMes2が起動する。
最初はEEPROMのフォーマットが終わっていないのでエラーとなるので、eject i2c0でアンマウントした後、format i2c0でフォーマットし、mount i2c0でマウントし、dfでサイズを確認する。
今後の自動処理のため、i2c0の下に下記のrun.batを作成する。
dhcp.elf ne0
ifconfig

ここまでできたら、LANケーブルを接続し、resetボタンを押して、H8ボードを再スタートする。
DHCPサーバが動いているなら、ipアドレスが無事割り当てられるはずです。
H8-3069fとmes23は終わった話なので、情報がなくなっていますが、gcc+cbarの開発環境はとっても快適です。

FC2Ad