HOSをVstoneのVS-WRC003で動かす為には [HOS]
※実際にはこのボードを持っていないので、動作確認が取れていません。
また、もう少し詳しい解説が欲しい場合もあるかもしれません。
連絡はコメント欄を使用してください。
VS-WRC003
http://akizukidenshi.com/catalog/g/gM-02745/
確かに安いですね。
HOSのサンプルプログラムはH8/Tinyシリーズの3664をターゲットにしています。
それに対してこのVS-WRC003で使用しているTinyは36064と言う第2世代?のTinyシリーズが使われています。この世代から書替え保証回数が10000回以上になったのは嬉しい限りですね。
さてこのマイコンの違いに伴い、HOSのサンプルを動かす為には幾つかの変更をしないと動かない事になりますので、現状判っている範囲でそれを書いておきます。
一つはCPUクロックの周波数が異なっています。
このボードは、秋月の写真を見る限り14.7456MHz近辺の周波数となるようです。
※実際はお手持ちの資料を確認してくださいね。
また、3664では存在していたTimerA(TA)が無くなり、TimerB1(TB1)がTAに近い機能を持つタイマーのようです。
これらを踏まえてostimer.c内のOsTimer_Initializeを変更するならば、
#include "iodefine.h" /*ルネサス環境の場合、h83664f.hの代わり*/
TB1.TCB1 = 14745600L / 512 / 122 * (-1); /*オートリロード値*/
TB1.TMB1.BYTE = 0x80 | 0x02; /*オートリロード有効、φ/512*/
IENR2.BIT.IENTB1 = 1; /*タイマ割り込み許可 */
これで約8.192ms周期で割り込みが入る筈です。
OsTimer_TimerHandlerの方は
TB1割り込みステータスのクリアを行いますので、
IRR2.BIT.IRRTB1 = 0; /* 割り込み要因クリア */
としておきます。
またTAからTB1では割り込み番号も異なりますので、system.cfgのOSタイマーの登録では
/* OS タイマ */
ATT_INI({TA_HLNG, 0, OsTimer_Initialize});
ATT_ISR({TA_HLNG, 0, 29, OsTimer_TimerHandler});
としておきます。
更に、さらに、CPUカーネルとプロジェクトの割り込みベクター(vector.srcまたはvector.S)にも変更が必要となってきます。
まずは割り込みベクターの変更は、これはルネサス環境用ですが、冒頭の.IMPORTに29までの追加と、
.IMPORT _hos_vector025
.IMPORT _hos_vector026 ;ここから追加
.IMPORT _hos_vector027
.IMPORT _hos_vector028
.IMPORT _hos_vector029
ベクターテーブルの追加が必要です。
.DATA.W _hos_vector025
.DATA.W _hos_vector026 ;ここから追加
.DATA.W _hos_vector027
.DATA.W _hos_vector028
.DATA.W _hos_vector029
_hos_vector029はカーネルライブラリを参照しますので、カーネルライブラリにもベクター番号29までの追加と、ライブラリの再構築が必要となってきます。
hosv4\src\h83\htc以下のpacintn.src(ルネサス環境の場合)が該当します。
.EXPORT _hos_vector025
.EXPORT _hos_vector026 ;ここから追加
.EXPORT _hos_vector027
.EXPORT _hos_vector028
.EXPORT _hos_vector029
・
・
・
_hos_vector025: push.w r0
mov.b #25, r0l
bra int_handler ;ここから追加
_hos_vector026: push.w r0
mov.b #26, r0l
bra int_handler
_hos_vector027: push.w r0
mov.b #27, r0l
bra int_handler
_hos_vector028: push.w r0
mov.b #28, r0l
bra int_handler
_hos_vector029: push.w r0
mov.b #29, r0l
うーん、ちょっと手間は多いですね。CPUコアが変更と言う訳ではなくとも、割り込みの様にそのCPUに大きく依存する部分についての変更は、やはりそれなりに手間が掛かります。
CPUクロックの変更はSCIのBRRにも影響を与えます。
以下がh8t_sci.h内の新しいBRR値です。
/* SCI通信速度定義 (14.7456MHzのとき) */
#define SCI_9600 47
#define SCI_19200 23
#define SCI_38400 11
Tinyの世代更新に伴う違いとして、WDT(ウオッチドッグタイマー)がデフォルトでONとなっています。
勿論この変更は組み込みとしては正解だと思いますが、学習用としての利用ならばあまり使わなくても良いかな?。
sample.cのmainに入った直後に以下の記述を追加するとWDTを停止できます。
WDT.TCSRWD.BYTE = 0x9a; /*0b1001 1010 B4WI=0,TCSRWE=1*/
WDT.TCSRWD.BYTE = 0x92; /*0b1001 0010 B2WI=0,WDON=0*/
逆にWDTも使用したいと言う事なら、一例としてはIDLE LOOP内にWDTのクリアを行う処理を追加するか、最も優先度の低いタスクを生成して、その中でクリアを行う等の方法が有ります。
※ベストな方法はそのシステムに依存しますので、適切な方法を取ってください。
また、もう少し詳しい解説が欲しい場合もあるかもしれません。
連絡はコメント欄を使用してください。
VS-WRC003
http://akizukidenshi.com/catalog/g/gM-02745/
確かに安いですね。
HOSのサンプルプログラムはH8/Tinyシリーズの3664をターゲットにしています。
それに対してこのVS-WRC003で使用しているTinyは36064と言う第2世代?のTinyシリーズが使われています。この世代から書替え保証回数が10000回以上になったのは嬉しい限りですね。
さてこのマイコンの違いに伴い、HOSのサンプルを動かす為には幾つかの変更をしないと動かない事になりますので、現状判っている範囲でそれを書いておきます。
一つはCPUクロックの周波数が異なっています。
このボードは、秋月の写真を見る限り14.7456MHz近辺の周波数となるようです。
※実際はお手持ちの資料を確認してくださいね。
また、3664では存在していたTimerA(TA)が無くなり、TimerB1(TB1)がTAに近い機能を持つタイマーのようです。
これらを踏まえてostimer.c内のOsTimer_Initializeを変更するならば、
#include "iodefine.h" /*ルネサス環境の場合、h83664f.hの代わり*/
TB1.TCB1 = 14745600L / 512 / 122 * (-1); /*オートリロード値*/
TB1.TMB1.BYTE = 0x80 | 0x02; /*オートリロード有効、φ/512*/
IENR2.BIT.IENTB1 = 1; /*タイマ割り込み許可 */
これで約8.192ms周期で割り込みが入る筈です。
OsTimer_TimerHandlerの方は
TB1割り込みステータスのクリアを行いますので、
IRR2.BIT.IRRTB1 = 0; /* 割り込み要因クリア */
としておきます。
またTAからTB1では割り込み番号も異なりますので、system.cfgのOSタイマーの登録では
/* OS タイマ */
ATT_INI({TA_HLNG, 0, OsTimer_Initialize});
ATT_ISR({TA_HLNG, 0, 29, OsTimer_TimerHandler});
としておきます。
更に、さらに、CPUカーネルとプロジェクトの割り込みベクター(vector.srcまたはvector.S)にも変更が必要となってきます。
まずは割り込みベクターの変更は、これはルネサス環境用ですが、冒頭の.IMPORTに29までの追加と、
.IMPORT _hos_vector025
.IMPORT _hos_vector026 ;ここから追加
.IMPORT _hos_vector027
.IMPORT _hos_vector028
.IMPORT _hos_vector029
ベクターテーブルの追加が必要です。
.DATA.W _hos_vector025
.DATA.W _hos_vector026 ;ここから追加
.DATA.W _hos_vector027
.DATA.W _hos_vector028
.DATA.W _hos_vector029
_hos_vector029はカーネルライブラリを参照しますので、カーネルライブラリにもベクター番号29までの追加と、ライブラリの再構築が必要となってきます。
hosv4\src\h83\htc以下のpacintn.src(ルネサス環境の場合)が該当します。
.EXPORT _hos_vector025
.EXPORT _hos_vector026 ;ここから追加
.EXPORT _hos_vector027
.EXPORT _hos_vector028
.EXPORT _hos_vector029
・
・
・
_hos_vector025: push.w r0
mov.b #25, r0l
bra int_handler ;ここから追加
_hos_vector026: push.w r0
mov.b #26, r0l
bra int_handler
_hos_vector027: push.w r0
mov.b #27, r0l
bra int_handler
_hos_vector028: push.w r0
mov.b #28, r0l
bra int_handler
_hos_vector029: push.w r0
mov.b #29, r0l
うーん、ちょっと手間は多いですね。CPUコアが変更と言う訳ではなくとも、割り込みの様にそのCPUに大きく依存する部分についての変更は、やはりそれなりに手間が掛かります。
CPUクロックの変更はSCIのBRRにも影響を与えます。
以下がh8t_sci.h内の新しいBRR値です。
/* SCI通信速度定義 (14.7456MHzのとき) */
#define SCI_9600 47
#define SCI_19200 23
#define SCI_38400 11
Tinyの世代更新に伴う違いとして、WDT(ウオッチドッグタイマー)がデフォルトでONとなっています。
勿論この変更は組み込みとしては正解だと思いますが、学習用としての利用ならばあまり使わなくても良いかな?。
sample.cのmainに入った直後に以下の記述を追加するとWDTを停止できます。
WDT.TCSRWD.BYTE = 0x9a; /*0b1001 1010 B4WI=0,TCSRWE=1*/
WDT.TCSRWD.BYTE = 0x92; /*0b1001 0010 B2WI=0,WDON=0*/
逆にWDTも使用したいと言う事なら、一例としてはIDLE LOOP内にWDTのクリアを行う処理を追加するか、最も優先度の低いタスクを生成して、その中でクリアを行う等の方法が有ります。
※ベストな方法はそのシステムに依存しますので、適切な方法を取ってください。
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 濱原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
2009-09-06 11:08
nice!(0)
コメント(2)
トラックバック(0)
参考にさせて頂きまして、無事サンプルプログラムが動きました。
WDTを停止は落とし穴でした。
いくつかご提案。
36064自体はベクタテーブルは32番(SCI3_2)まであります。
ただしpacintn.srcにベタで書いていくと8bit JRA命令でエラーになりますので、システム予約である19~21と28,30,31を省略して書くのが素直そうです。
(16bitJRA命令にしてもエラーは解決できました)
vector.srcも同様です。使っていないベクタ番号については.IMPORTを記述せず、ベクターテーブルは、 .DATA.W h'ffffで埋めたほうが安心かと思います。
以上。参考まで。
by maro (2010-01-04 17:14)
ご連絡有難うございます。
> ただしpacintn.srcにベタで書いていくと8bit JRA命令でエラーになりま
> すので、システム予約である19~21と28,30,31を省略して書くのが素
> 直そうです。
確かにそうですね。
オリジナルのHOSのサンプルはなるべく実装依存しないように、、、とは言え依存性を無くす事は不可能なので、この辺はポイントが判ればそれぞれ工夫してもらった方が良いと思います。
未使用割込みベクターに付いてここまでやるなら、折角ならばもう一工夫して不正割込み発生時はちゃんと処理をする事をお勧めします。
つまり未使用割込みベクターの飛び先を不正割込み処理のルーチンとして登録し、そこでエラー処理、例えばスタックから割込み発生時のPCの値を取り出して外部にメッセージを送るとか、EEPROMやバックアップ付きのRAMに記録に取るとかですね。
by hamayan (2010-01-05 10:41)