H8関連の情報.
機械研で現在標準的に使用しているH8は秋月電子のH8-3069ボードである.
目次
秋月ボードのCN2-1をGND,CN-2-2を5Vに接続する。AVcc,Vrefも使わない場合でも5Vに接続しておいたほうが無難なよう。
モニタはVer.1.2.1を使用し,Ver.1.2は使用しないこと.
3069S.Hは近くの先輩にもらいましょう。
注)cygwinが新しいバージョンのとき、Makefileの99行目の)と¥の間にスペースをいれないとmakeしたときエラーを返されることがあります。
シリアルで接続する.(表ページの情報を参照すること.)
シリアルポートがない場合は秋月電子のUSB-シリアルケーブルが安価で使いやすいかも.
Tera Termを使って接続するのが機械研では一般的.
ITUのPWMモードを使うときは、GRAを変えることで周期を、GRBを変えることで出力Highの時間を変えられます。(以下,GRAマッチでカウンタクリアの場合。GRBマッチでカウンタクリアのときは適宜読み替えてください。)
周期を変えようとする際、不用意にGRAを書き換えると一瞬だけパルス幅が乱れる可能性があります。変更後のGRAの値よりTCNTが大きいとコンペアマッチが起こらず、カウンタが65536まで行ってしまうためです。
DCモータの信号なら周期はそんな頻繁に変えないので影響は少ないですが、頻繁に周期を変えるであろうステッピングモータのクロックでは致命的です。脱調の原因となります。
そこで以下のようにして強制的にコンペアマッチを起こします。
//ここで周期をtにセットする ITUx.GRA = t; if (ITUx.TCNT > t) ITUx.TCNT = t;
TCNTを0にリセットするのではなく、GRAと同じ値にセットするのがポイントです。セットした瞬間にコンペアマッチが起こるので、ポートの信号もちゃんと変わります。
dutyを変えるためGRBを書き換える時にも似たような問題が起こります。同じような方法で解決できます。
ITU0.GRB = d; if(ITU0.TCNT > d) PADR.BIT.B2 = 0;
(山口)
割り込みで行われる処理の中で、変数aの値が変化しても、 例えば、main関数の中で
int a; //グローバル変数 int main(void) { ・・・・ while(a < 100); //aが100になるまで待つ ・・・・ }
のようにすると(a >= 100となっても)whileから抜け出すことができない。 aに型修飾詞volatileを付けて、
volatile int a;
と宣言する。または、
while(a < 100) wait_usec(1); //意味のない処理をいれてみる
などすると解決する。 (今井)
H8モニターで割り込みの初期化では
SYSCR.BIT.UE = 0; /* 割り込み許可 */ __asm__ volatile ("andc.b #0x3f,ccr");
としてCCRレジスタのIビットUIビットともにクリアしている.
一方,割り込みを制御するint_enable()とint_disable()では
void int_enable(void) { asm volatile ("andc.b #0x7f,ccr"); } void int_disable(void) { asm volatile ("orc.b #0x80,ccr"); }
としているのでCCRレジスタのIビットのみを変更している.
ただ割り込みが起きるとIビット,UIビットともに自動で1とされる.
そのため,デフォルトではプライオリティレベル1の割り込みはプライオリティレベル0の処理中には起きない.
(int_disable()はプライオリティレベル1の割り込みをとめられない.)
そこでUIビットをプライオリティレベル0の割り込み中でクリアしてやればよい.
asm volatile ("andc.b #0xbf,ccr"); __asm__ volatile ("andc.b #0xbf,ccr");
起きないようにしたければ,
asm volatile ("orc.b #0x40,ccr"); __asm__ volatile ("orc.b #0x40,ccr");
(Fukuma)
プログラムなどをFile->Send fileで転送することが多いと思いますが、このとき送るファイルを選ぶウィンドウで最初に開くディレクトリは、Tera Termを起動する度にリセットされます。それを防ぐ、というかこのホームポジションのようなディレクトリを変える方法です。
詳しくはTera Termヘルプの「Tera Term 設定ファイル」の項を参照。 (山口)