FreeBSD上でSH2の開発環境構築とSH2を使ったDCサーボモータの制御のページ

セミオートマ用のDCモータサーボ制御用に秋月の SH2ボードを購入しました。付属のCD−RはCygwin環境で開発するようになっていますが、ガレージのCNC制御用のPCはFreeBSD4.11なのでこの上でSH2のプログラムが開発できる環境を整えます。

その後、SH2を使ってDCサーボモータを制御する方 法を紹介していきます。


2005年
8月24日
秋月にSH2ボード(AKI -SH2)を発注したので、 開発環境の整備をは じめました。WEBで検索するとやはりLinuxの環境が多いようです。ガレージのPCはペンティアムの200MHzです。このマシンではコンパイルに時 間がかかるので、アパートの自宅webサーバ(このサーバ)でコンパイルし、完成したバイナリをガレージに持って行きます。下記のページを参考にして gcc開発環境一式をコンパイルします。


Linuxによるマイコンプログ ラミングのページ

SuperH 用のクロスコンパイラができるまで

ひみつのけいかく


1.ソースコードの入手

  以下のソースを入手します。
  binutils-2.13.3
  gcc-3.2.3
  newlib-1.13.0


 2.binutilsのコンパイル
   展開後、コンフィギュレーション、メイク、インストールを行ないます。toppersなんかも動かしてみたいのでelf用のコンパイラ一式を作ります。

 % ./configure i386-freebsd4 --prefix=/usr/local/sh_cross --target=sh-hitachi-elf
 % make CFLAGS=-O2
 % make install

3.gccのコンパイル
先にインストールしたbinutils(/usr/local/sh_cross/bin)にパスを通して、newlibも展開後、
コンフィギュレーション、メイク、インストールを行ないます。

 % ./configure i386-freebsd4 --prefix=/usr/local/sh_cross --target=sh-hitachi-elf --with-newlib --with-headers=../newlib-1.13.0/newlib/libc/include/ --enable-languages=c
 % make CFLAGS=-O2
 % make install

4.newlibのコンパイル
コンフィギュレーション、メイク、インストールを行ないます。
 % ./configure i386-freebsd4 --prefix=/usr/local/sh_cross --target=sh-hitachi-elf
 % make CFLAGS=-O2
 % make install

 これで、/usr/local/sh_crossの 下にsh用のelfの出るgcc開発環 境が入りました。ガレージ用にCD−Rに焼いておきます。


8月25日
秋月より、AKI-SH2のボードが通販で送られてきました。早速、実装されていな部品のハンダ付けを行います。一応、ソフトウェア付きを購入。CD−RにはCygwin環境のコンパイラと、H8/OS(SH2版)が付 属していま す。


8月27日
電源とシリアルケーブルとgcc一式の入ったをCD−Rをガレージに 持ってきました。環境一式をコピーして、h8writeのコンパイルも終えて、シリアルケーブルを接続しようと思ってPCの裏を見ると、シリアル9ピンコネクタが出てませんでした。このPCはシリアルがマザーボードにヘッダ コネクタとして出ているISAバスのある古いタイプで、ケーブルが接続されていおらず、おまけにケーブルも 見つかりません(笑)

しかたかがないので、古いWin98のノートPCでSH2ボードの動作試験を行ないました。秋月のCD−Rに入っていたplus7045.moth8writeコマンドで内蔵Flashへ書き込み ブートさせます。シリアルコンソールにプロンプトが出るのを確認しdumpコ マン ドを入力してみます。ちゃんと動ているようです。次までにケーブルを作製してBSDマシンでH8/OSのコンパイルと書き込みをできるようにする予定です。


9月1日

[h8write]
自宅アパートのWEBサーバマシンでAKI-SH2ボードへの書き込みテストを行ないました。 h8write.c#define FreeBSDを有効にします。
 % cc -o h8write h8write.c
でコンパイルします。

 % h8write -7045 plus7045.mot /dev/cuaa0
ブートモードに設定し、CD-Rのコンパイル済みのH8/OSをSH2ボードへ書き込みます。

 % cu -l /dev/cuaa0 -s 57600
ノーマルモードに戻して、シリアル端末から接続し、H8/OSの動作確認をします。FreeBSD4.11上でh8writeコマンドが正常動作することを確認しました。


[H8/OS]
続いて、FreeBSD上のSH2のGCC環境でH8/OSをコンパイルします。AKI-SH2に付属のCD-Rにはソースコードが無いので
Linuxによるマイコンプログラミングのページ
ここからダウンロードします。

 Makefileはファイルのフォーマットがcoffになっているので、elfに修正します。7045用の*.x(リンカスクリプト)もcoff指定をelfに修正します。

SH2ボードはクロックが28.64MHzなので、シリアルのボーレートジェネレータのsio.c内でBRRの値を15に設定します。

 sio_init()関数の以下を修正します。

 #ifdef SH2
 /* scr_base[BRR] = 14; */

 scr_base[BRR] = 15; /* 15 に変更します */
 #endif

注)ここに設定しても後でsio_speed()から57600bpsに上書きされていました。

 この後、H8/OSのヘッダファイルを/usr/local/sh_cross/sh-hitachi-elf/include/shにコピーしておきます。その後、メイクします。できあがったplus7045.motを前項と同様の手順で書き込みます。コンパイル済みのものと同様に正常動作することを確認しました。これでH8/OSのアプリケーションがFreeBSD上で開発できることになります。後で、パッチを公開たいと思います。

[toppers&stub]
次にTOPPERSですが、早速ここから、ダウンロードしてドキュメントを見たところ、対応しているSH2のプロセッサはAKI-SH2と同じ7045は無く、似ている7145というのがありました。これは内蔵RAMが8Kバイトで7045の倍になったもので、内蔵の周辺デバイスも少し増えているようです。また、特に気にる部分は動作環境で以下の記述がありました。

TOPPERS SH2の動作環境
BINUTILS : 2.14
GCC-CORE : 2.95.3

ということで、構築したバージョンと
微妙違います。BINUTILSはバージョンが下で、GCCは上いということになります。

また、SH2の機種依存のパッチここから出ています。しかし、ダウンロードしようとするとWEBページのCGIをダウンロードしようとしてしまい、メールで問い合わせたところ、機種依存パッチSTUBを添付ファイルにて送ってもらいました。もしこのSH2のSTUBがちゃんと動作すればGDBを使用して、ソースデバッグが実現します。これは強力です。それに加えてフロントエンドのDDDが動けば言うこと無しです。今後、構築済みのgcc-3.2.3の環境でTOPPERSのコンパイルに挑戦してみます。


9月2日
SH2-STUBをgcc-3.2.3でコンパイルしてみましたが、sh-stub.7145.cのインラインアセンブラでエラーが出ます。下図参照。因みにTOPPERS自体も3.2.3でコンパイルすると、コンパイルは通るものの、シリアルコンソールにタイトルのメッセージが出て、その後、だんまりになりました。

ということで、やはり動作環境と同じコンパイラを再構築する必要がるようです。早速、2.14のBINUTILSと2.95.3のgccを入手して、上の手順と同様に環境の再構築します。EWLIBは前のまま1.13.0を使いました。ガレージに持っていくためにCD-Rに焼いておきました。

9月3日
先週無かったシリアルケーブルを作製します。ガレージで使っているマザーボードはシャトルコンピュータ製HOT-557という古いマザーです。マザーボードからシリアルを取出すケーブルは圧接用のピン配置ではなく、ピン番の通りに接続するタイプでした。金具も2チャンネル入るように削ってPCに取りつけました。


早速、シリアルの検査をします。H8/OSが書き込み済みのAKI-SH2ボードをシリアルで接続します。



[H8/OS]
H8/OSが立ちあがってメッセージが出ましたが、dumpコマンドで画面が乱れます。コンソールにはシリアルがオーバーフローしているというメッセージが出ます。無手順フロー制御無しなので、開発マシンの動作速度が遅く、57600bpsについて行けないようです。


H8/OSのシリアルの速度19200bpsに変更して、再コンパイルし、書き込み再起動します。今度は正常に表示されました。コンパイルはgcc2.95.3を使い、このバージョンでもH8/OSが動作することを確認しました。


シリアルの速度はsio.c内で設定していますが、プロセッサのクロックとボ−レ
ト からBRRの値を計算で求めています。元のコードはsio_init()で初期化した値がsio_speed()から57600で上書きされています。 H8ではコンパイル時にFREQでプロセッサのクロックを指定できるようになっていますが、小数点が入れられないので、今回はsio_speed()内で 直接BBR47を入れました。パッチはここからダウンロードしてください。このパッチはh8-os-sources-3.51a.tar.bz2.tarをelf形式のgccに対応させ、28.64MHzクロックのAKI-SH2を19200bspに変更するパッチです。

h8-os-sources-3.51
のディレクトリが見えるところにforaki-sh2.patchを用意して

% patch -p0 -d . < foraki-sh2.patch
でパッチを当てます。その後

% gmake plus7045
でメイクし、plus7045.motをAKI-SH2に書き込みます。

他のボーレートを変更するにはsio.cのsio_init()、sio_speed()関数でBRRに設定している値を変更します。
scr_base[BRR] = XXの所です。

例えば57600bpsの場合には
  BRR = 28.64E6 / 32 / 57600
= 15.5 = 15
例えば38400bpsの場合には
  BRR = 28.64E6 / 32 / 38400
= 23.3 = 23


というふうに計算します。調歩式非同期は大体4%くらいまで、偏移があっても通信できるようです。


[gdb/stub]

続いて、gdbです。使用したバージョンは5.3です。gccと同様にsh-hitachi-elf用にコンパイルします。添付ファイルで送ってもらったSTUB7145用ですが、内蔵RAMは使っていないようです。外部RAMの先頭番地容量ともAKI-SH2と同様です。そのまま、転送速度のみ19200に変更し(28.64MHzのクロックではBRRの値を47に設定します)コンパイルします。ワーニングが出るもののコンパイルできました。stub.motをメイクし、h8writeで書き込みます。以下、リモートデバッグ用の設定ファイルgdbstartup作って、

set remotebaud 19200
target remote /dev/cuaa1
load


 (シリアルの速度とシリアルデバイス、プログラムのロードの設定を行ないます)

% sh-hitachi-elf-gdb -x gdbstartup &
として起動します。しかし、全く、反応しませんでした。STUBのソースを見るとSH2のSCI0をSTUBのポートとして使っていました。早速、SCI1に変更して、再度STUBを書き込みます。今度は正常に動作しました。gdbが上手く動作したので気を良くして、dddに挑戦します。アパートからdddのpackageをCD-Rに焼いて持って来ていたので、add_pkgでインストールします。予め依存関係がありそうな他に必要なものも持って来ていたので、簡単にインストールできました。必要だったのはopen-motiffreelibibertyです。dddは下位のリモートデバッガを--debuggerスイッチで指定します。

% ddd --debugger "sh-hitachi-elf-gdb -x gdbstartup test" &

として起動します。すんなり立ちあがりました。左側、ブレークポイント、ローカル、グローバル変数表示も良好です。右は機械語の表示オプションを付けたところです。newlibの検査も兼ねて、strcpy,sscanf,sprintf,sinなどのライブラリを使用してみました。sprintfで%g,%fなどで実数を文字に変換するとトラップが発生して止まります。gccとnewlibのバージョンの相性でしょうか。


左側、変数のプロット機能、gnuplotが呼ばれて、配列の内容がグラフ表示されます。この辺の機能でdddという名前がついているようです。右はプロセッサのレジスタ表示ウインド。


なんかちゃんと動いているな〜と思っていると、一番下のコマンド入力おかしいです。どんなコマンドを入れても未定義コマンドのエラー表示が出ます。手動での入力は2文字目で 直ぐにエラーになります。コマンド履歴からの入力は全文字入るものの、同様に未定義コマンドになります。ん〜惜しい!packageでインストールしてい るのでエラーになる原因はつかめませんでした。ソースからコンパイルするにはgcc-3.4.xやmotifなどのソースも必要かもしれません。大変そう です。



[toppers]

続いてTOPPERSです。TOPPERSは上記の添付ファイルにて送ってもらったSH2依存部分をそのまま使います。TOPPERSのサンプルプログラムをコンパイルするには以下の手順になります。

chkcfgプログラムを作成します。
 これはコンフィグレーションで使われるプログラムで、開発マシンで動作するプログラムです。cfgディレクトリでgmakeとするとコンパイルが始まります。プログラムはC++で書かれているようです。結構時間がかかります。200MHzで20分くらいでしょうか。

sh2機種依存パッチを適応するために、config/sh2ディレクトリをconfig/sh2.ORGに変更して、添付にて送ってもらったsh2機種依存パッチを新たにconfig/sh2としてコピーします。
28.64MHzで19200bpsにするために、config/sh2/sh7145sci1.h内のBRR47に変更します。

・コンフィギュレータを実行しサンプルプログラムの作成します。
 適当なディレクトリを作成し、そこで、サンプルプログラムをコンパイルできるファイル一式生成します。

% mkdir obj
% cd obj
% ../configure -C sh2 -S apsh2f6a

プロセッサはSH2、システムはapsh2f6a(SH7145を使用したボードの名称)でサンプルプログラムに必要なファイルのコピー、生成を行ないます。ちょっと分かりにくいですが、"-A"スイッチを付けないと、デフォルトでsample.cが生成されます。これはsampleディレクトリからコピーされます。 

% gmake depend

  Makefile内のDBGENV := GDB_STUBをコメントにてGDBを使わない指定にします。

% gmake
2〜3分くらでjsp.srecができます。これがTOPPERSのOS部とサンプルコードのsample.cが結合されたロードモジュールです。Sレコードなので、h8writeコマンドでAKI-SH2ボードに書き込みます。

% h8write -7045 jsp.srec /dev/cuaa1
 ブートモードにして、サンプルを書き込みます。

% cu -s 19200 -l /dev/cuaa1
 ノーマルモードに戻して端末を立ち上げます。

電源を投入します。以下のようにメッセージが表示されタスクの実行状態が表示されればTOPPERSが動作しています。
sample.cはメインとその他に3つのタスクを生成して、シリアル端末からタスクの制御を行なえるようにしたプログラムです。プログラムを実行するとデフォルトで優先順位が一番高task1が実行されます。下記参照。


'r'コマンドを入力すると、タイマールーチンで優先順位の回転が行なわれるようになります。優先順位が回転するので、各タスクが順番に実行されている様子がわかります。実行されるタスクによって'|':task1、'+':task2、'*':task3が端末に表示されます。ノン・プリエンプティブのRTOSの動作が良く分かるサンプルプログラムです。


例えばtask3を10秒間起床待ちにしてみます。'3'コマンドでコマンド対象をtask3に設定した後、'd'コマンドを入力します。task3が実行されなくなり10秒後に再度復帰します。


sample.cの先頭にコマンド一覧がコメントで入っているのでこれを参考に動作確認を行ないます。ということで、gcc-2.95.3の環境でTOPPERSの動作が確認できました。

ここまでの問題点を以下にあげます。

・ddd(リモートデバッガ):
デバッガコンソールにコマンドが入らない。

・newlib-1.13.0(ライブラリ):sprintfで%gや%fで実数を変換するとトラップが発生してしまう。


9月7日
dddのデバッガコンソールにコマンドが入れられない現象を少し調べてみました。
OSはFreeBSD4.11-RELEASEです。dddのコンフィギュレーションは以下です。

BSDserver# ddd -configuration
GNU DDD 3.3.10 (i386-portbld-freebsd4.11)
Copyright (C) 1995-1999 Technische Universitt Braunschweig, Germany.
Copyright (C) 1999-2001 Universitt Passau, Germany.
Copyright (C) 2001 Universitt des Saarlandes, Germany.
Copyright (C) 2001-2004 Free Software Foundation, Inc.

Compiled with GCC 3.4.4 20041224 (prerelease) [FreeBSD]
Requires X11R6, Xt11R6, Motif 2.2.3 (Motif Version 2.2.3)
Includes XPM 3.4.11, Athena Panner (7000002L), DDD core
Built 2005-01-04 by Charlie <root@gohan39.freebsd.org>.

続いてコンフィギュレーションのチェックは以下です。

BSDserver# ddd -check-configuration
Checking for X11 library directory... /usr/X11R6/lib/X11
Checking for XKeysymDB... /usr/X11R6/lib/X11/XKeysymDB
No configuration problems found.

dddを立ち上げます。SH2のリモートgdbではなく、通常のgdbを下位デバッガとして立ち上げます。-tスイッチを付けて、コマンド入力をkterm上で行なえるように設定します。黄色で注釈を入れます。

BSDserver# ddd -t --debugger gdb test

GNU DDD 3.3.10 (i386-portbld-freebsd4.11), by Dorothea Luekehaus and Andreas Zeller.
Copyright (C)1995-1999 Technische Universitae Braunschweig, Germany.
Copyright (C)1999-2001 Universitae Passau, Germany.
Copyright (C)2001 Universitae des Saarlandes, Germany.
Copyright (C)2001-2004 Free Software Foundation, Inc.
Deprecated bfd_read called at /usr/src/gnu/usr.bin/binutils/gdb/../../../../contrib/gdb/gdb/dbxread.c\
 line 2627 in elfstab_build_psymtabs
Deprecated bfd_read called at /usr/src/gnu/usr.bin/binutils/gdb/../../../../contrib/gdb/gdb/dbxread.c\
 line 933 in fill_symbuf
(gdb) break test.c:28 <--ブレークポイントを設定
Breakpoint 1 at 0x80485cf: file test.c, line 28.
(gdb) run <-- 実行

Breakpoint 1, main () at test.c:28 <-- ブレークポイントに到達
28 fx = sin(fy/2);
(gdb) help <-- helpコマンドを入力
Undefined command: "8". Try "help". <-- 8なんてコマンドは無いと怒られる!
(gdb)
 
という感じです。helpと入力しているのですが、
なんてコマンドは無いということのようです(笑)
dddは~/.ddd/logにログを残すのでこれを調べてみます。

2005.09.07 06:41:31
<- "Num Type Disp Enb Address What\n"
2005.09.07 06:41:31
<- "1 breakpoint keep y 0x080485cf in main at test.c:28\n"
2005.09.07 06:41:31
<- "\tbreakpoint already hit 1 time\n" <-- ブレークポイントに到達 
2005.09.07 06:41:31
<- "(gdb) "
# Retrieving Command Definitions... <-- helpコマンドを入力
2005.09.07 06:41:39
-> "help user-defined\n" <-- ユーザデファインが開始される
2005.09.07 06:41:39
<- "User-defined commands.\n"
2005.09.07 06:41:39
<- "The commands in this class are those defined by the user.\n"
2005.09.07 06:41:39
<- "Use the \"define\" command to define a command.\n"
2005.09.07 06:41:39
<- "\n"
2005.09.07 06:41:39
<- "List of commands:\n"
2005.09.07 06:41:39
<- "\n"
2005.09.07 06:41:39
<- "\n"
2005.09.07 06:41:39
<- "Type \"help\" followed by command name for full documentation.\n"
2005.09.07 06:41:39
<- "Command name abbreviations are allowed if unambiguous.\n"
2005.09.07 06:41:39
<- "(gdb) "
# Retrieving Command Definitions...done. <-- デファインコマンド検索終了?
2005.09.07 06:41:39
-> "8\n" <-- 8コマンド?
2005.09.07 06:41:39
<- "Undefined command: \"8\". Try \"help\".\n" <-- 8なんてコマンドは無いと怒られる!
2005.09.07 06:41:39
<- "(gdb) "

という感じで、コマンドを入れるとユーザーデファインが始まり、その後なぜか
関係無いが入力されたことになっているみたいです。


9月10日
ガレージにレーザプリンタを持ってきました。友人にもらったものでブラザーのHL-1240です。マザーからケーブルが出ていないので、取り出しケーブルも一緒に持ってきました。まあ、一応、プリンタも開発環境の1つとして、こちらに載せておきます。


FreeBSDから印刷するにはghostscript経由で印刷します。ここのページを参考に各種プログラムを導入しました。左写真のようにacrobat5firefoxから印刷できました。またプログラムリストなどのテキストはa2ps-jでポストスクリプトに変換してから印刷します。右写真。また、qcadからの印刷もできました。しかし、動作する時の突入電流で一瞬、蛍光灯が暗くなります(笑)仕様書を見ると平均340Wと書いてあります。


dddですが、デバッガコンソールに手入力のコマンドが入らないものの、そこそこ使えます。dddの名前にもなっているデータディスプレイ機能を使ってみました。ネイティブのプログラムで構造体のポインタ表示を行なってみました。ただし、
左のようにコメントに日本語があると行番号がずっこけてしまうようです。コメントを削除すると、行番号が一致します。右は構造体の中身とポインタを追って行ったところです。自動的に配置される訳ではなく、表示位置などは手動で調整しました。ポインタをイネーブルにして、右クリックで付きで参照すると次のポインタの内容が表示されます。一度、表示されているポインタに戻るようなポインタの場合にはちゃんと戻り矢印が表示されます。nullポインタは赤で表示されます。コンソールにコマンドが入らない件は解決しました。ここをクリックしてください。



9月11日
SH2ボードの下に接続すモータドライバ基板の作製を開始しました。搭載するのはロータリエンコーダの波形整形DCモータドライブ回路、LED表示、SW入力回路などです。電源は外部から12Vを入力します。ボード上に5Vの3端子レギュレータを載せ、SH2ボードへ供給します。


ロータリエンコーダは1回転あたり、360パルス
インクリメンタル型、Z相付きを使います。エンコーダからはリード線が出ているので子基板を作り、フラットケーブを接続して延長しました。左写真。出力レベルは右写真のように正弦波で、電圧も150mVと低いのでコンパレータでロジックレベルに変換する必要があります。


延長したケーブルを40ピンのレセクタプルに圧接します。


ボード上にも40ピンのヘッダを付けて、上記のエンコーダを接続します。LM393を3個載せて、ABZ相を2CH分ロジックレベルに変換します。コンパレータの出力波形確認しながら、
スレッショルドを調整して50%デューテに近くなるように調整しておきます。


ロータリエンコーダのA,B相信号はSH2のMTUの位相計数カウンタで16ビットの値に変換できるようにカウンタの入力ポートに接続しておきますします。早速、ロータリーエンコーダがカウンタ値として読み込めるか検査を行ないます。丁度、モータ制御用のサンプルプログラムがここにあります。samples.lzh内のcounterディレクトリに2チャンネルのA,B相ロータリエンコーダ入力のプログラムがあります。シリアルの速度を19200bspに変更し、コンパイルスクリプトがcygwin環境のcoff用なので変更します。ローダ用の配置ファイルもベクタが400H分領域を取るように修正しました。プログラムはROM化されるので、早速h8writeで書き込み、起動するとシリアルに2chのロータリエンコーダのが表示されます。正常にカウントしていることを確認しました。高抵抗が無かったので、現在はストレートのコンパレータですが、ヒステリシス付きにした方が良いです。


パッチをここに載せておきます。
このパッチは上記のcounterプログラムをelfに対応させ、.textを0x400番地に設定しました。また、シリアルのボレートを19200bpsに変更しています。

counterの見えるディレクトリで
% patch -p0 -d . < counter.patch
% cd counter
% sh comp

としてください。compというコンパイル用のスクリプトでコンパイルとSレコードを生成します。


9月16日
SH7045と7145の違いを少し調べてみました。7045は内蔵RAMが4Kバイトあります。
7045はこの内蔵RAMを1Kバイトキャッシュメモリとし使うことができます。このときには内蔵RAMの容量は2Kバイトとなります。7145の方はキャッシュメモリはありません。キャッシュが小さいですが、ループがキャッシュの中に入ればかなり、高速化が期待できます。TOPPERSは7145用なので、当然そのままではキャッシュがOFFになっています。SH7145のデータシートはここにあります。


9月17日
SH2ボードにシリアルを追加します。追加といってもケーブルを接続するだけで追加できます。ボード上にはSCI0,1ともTXD,RXDはRS-232Cドライバを通っていますので、GNDと共にケーブルを接続するだけで1チャンネル増やせます。具体的にはJP2の7,5番ピンをそれぞれRXD,TXDに接続します。また、1,2ピンショートバー接続し ます。GNDはとなりのCN4の9ピンから取ります。右写真はTOPPERSのサンプルプログラムが動作しているところで、2つのktermを使って GDBとcuを実行しています。GDBを使う様に設定すると、GDB_STUBがSCI1へ、ログがSCI0へ設定されます。SCI0も19200bps に設定し直しました。


拡張ボードに8x8のマトリックスLEDを追加しました。赤、緑の2色です。GPIOの空きが少ないので、バスに74AC374を 3個追加して接続します。当初CS2,3を使う予定でしたが、MTUの端子と兼用で使えないため、CS0を使うことにします。CS0はボード上の外部 ROM用の選択信号ですが、これは使わないようにして、LED制御に使います。拡張コネクタにはCS0が接続されていないため、nWRHH信号を切って代わりにCS0を 接続します。拡張ボードは8ビットのみのアクセスなのでこの信号線は使いません。内部フラッシュを有効にすると、CS0は内部フラッシュ直ぐ後ろの 0x00200000から始まります。0x00200000,0x00200004,0x00200008にそれぞれ8ビットの赤、緑、カラム出力レジス タを実装して、ダイナミック点灯させます。右は0x0020000番地をアクセスしてスタティックに点灯テストを行なっているとろです。


LEDのテストをいちいちプログラム内にコーディングす るのは面倒ですが、gdb(ddd)でメモリに直接値が入れられるはすなので、やってみました。"Examine Memory"で直接0x00200000へ値を書いてみましたが、できませんでした。"set variable `x /1xb 0x00200000` = 0x00"とコマンドが展開されますが、'`'がおかしいといわれます。左図。ん〜だめか〜じゃあ変数を経由すればできるのか?ということで、予めio_ptrに0x00200000をいれておくと*io_ptrで書き込めました。右図。dddから赤LEDのポートに出力できます。予め、ポインタをプログラムの中に入れておく必要がありますが〜確かに
set variableなので変数じゃないとできないのかもしれません。


toppersのサンプルに新しく周期タイマを追加してダイナミック点灯を行ないます。周期は2mSEC(50Hz)です。フォントが無かったので、1文字だけ作りました(笑)レジスタに対して0を出力すると点灯なので、初め、文字が反転しました(笑)フリーの8x8フォントは
恵梨沙フォントがありますので、後で組込んでみます。まあ、漢字は使う予定がありませんが。プログラムの方は良好ですが、赤と緑を両方点灯してオレンジにすると電流が足らないみたいで、少し暗くなります。


toppersでは*.cfgファイルに静的APIを定義すると自動的にID番号などを自動的に振ってくれます。以下*.cfgの抜粋です。こうすると、cyc_led_handler2mSEC毎に呼ばれるようになります。この中で1カラムづつダイナミック点灯をします。静的APIの仕様はμiTRONの仕様書を見てください。

----
CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 }); <--優先順位を回転する2秒の周期関数元々あったもの

/* ADD 050919 for 8x8 LED matrix */
CRE_CYC(CYCHDR2, { TA_HLNG, 0, cyc_led_handler, 2, 0 }); <--新しく追加
した2mSEC周期のLED用

#ifdef CPUEXC1
DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} );

---


9月21日
dddの
デバッガコンソールにコマンドが入力できない不具合ですが、環境変数LANG日本語のロケールが設定されているとこの現象が起きるようです。ロケールをにすると正常にコマンドが入力できるようになります。また、ソースウインドに日本語のコメントがあると行番号がずれる不具合も無くなりました。下は正常にhelpコマンドが表示されているところ。めでたしめでたしです。


また、メモリへの書き込みですが、色々やってみましたが、単純に"set variable *(0x8062000)=0x55"とするとするとちゃんと書き込めます。デバッガコンソールから手入力で入力する必要があります。左はバイトで0x55を書いたところです。
"set variable *(0x8062000)=0x1234"とすると16bitで書き込めます。ディスプレイウインド上で値が変更される変数値が黄色くなります。明示的にキャストして"set variable (short *)(0x8062000)=0x1234"では怒られてしまいした。PC上(x86)では上手くメモリに書き込めますが、SH2のモートデバッガではまだおかしいです。また後で調べてみます。




9月23日

8x8マトリックLED用に
恵梨沙フォントフロッピに入れて持ってきましたが、リードエラーで読み込めませんでした。しかたがないので、を作って、スクロール表示のプログラムを作りました。スクロールは200mSECの周期関数でデータをシフトします。ここをクリックすると動画を再生します。途中で緑、オレンジに色が変りますが、オレンジは発色が悪くて良く分かりません。


9月24日
MTUの3、4を使ってモータドライブ用のPWMの信号を出力するプログラムを追加しました。MTU4はMTU3には無い出力のイネーブルレジスタがあって、それに気がつかずなかなか信号が出ませんでした。テスト用として、ロータリエンコーダの値からパルス幅が変更できるようにしてあります。これで任意のデューティ比の信号が2チャン
ネル出力できるようになりました。



9月25日
予め作っておいたモータドライバのPWM信号を整形するGALをボードに実装して検査を行ないました。これはHブリッジ回路の上下のFETが両方ONになるのを防ぐのが目的です。MTU0で900kHz程度のクロックを作ってGAL内で遅延させて生成します。ボードの中央の白いシールが貼ってあるのがGALですが、最近ではすっかり、お目にかからなくなりました。型番はラティス16V8です。会社のPCに残っていた、古いABELで論理を作成し、会社のROMライタで書き込みしました。ABELは流石にすっかり忘れていました(笑)


下が遅延回路で生成した信号です。上のパルスは下よりも少しだけ短くなっています。のように波形を加算すると良く分かります。論理を間違えてます。細い方は反転する必要がありました。このままだと両方ONでFETが焼損します(笑)


同期クロックにMTU0を使ったため、SH2内蔵のMTUですが、0〜4まで全て使ってしまいました。使い道は以下です。

0:900kHzクロック発生
1:ロータリエンコーダ#0
2:
ロータリエンコーダ#1
3:モータドライブPWM#0
4:モータドライブPWM#1


9月27日
DDDのメモリへの書き込みですが、このSH2はリトルビッグエンディアンなので例えば、
左図のように、set variable *(0x42c000)=0x12とすると0x42c003に0x12が書き込まれ、00、01、02には0x00が書き込まれます。右図のように*(0x42c0001)=0x12とすると0x42c004に0x12が書き込まれます。set variable *(xxxx)はintのサイズでアクセスされるようで、キャストしようとして、(char *) (xxxx)などとするとエラーになります。


gdbのマニュアルを調べていると変数への代入という項があり、そこにメモリ番地への値の入れ方が書いてありました。例えば、
set {int}0x83040 = 4するとメモリ番地0x83040にint型で書き込みが行なわれると書いてあります。型の指定を{}での中に入れれば良いようです。早速やってみました。左図のようにset {char}0x42c001=0x55    とすると、期待通り書き込まれました。{short}も正常に動作します。


左図は{int}で0x87654321を書いたところ。右図は奇数番地へ{short}で書いたところです。いずれも期待の通りに動作しています。





line