電子書籍の厳選無料作品が豊富!

H8のマイコンを用いて、7セグメントLEDを
1秒間隔で表示を切り替えるプログラムを作りたい
のですが、いまいち上手くいきません。。。
タイマー割り込みは用いずに行いたいのですが、以下のプログラムでどこが間違っているのでしょうか??

MOV.L #FFFFD1,ER0//PADDR
MOV.L #FFFFD4,ER1//PBDDR
MOV.B #FF,R2L//FF=11111111

MOV.B R2L,@ER0//PADDR = FF
MOV.B R2L,@ER1//PBDDR = FF

MOV.L #FFFFD6,ER0//PBDR
MOV.L #FFFFD3,ER1//PADR

MOV.B #5B,R2L//5B = "2"
MOV.B R2L,@ER0//PBDR = 5B

MOV.B #01,R2L//01 = 0KETA
MOV.B R2L,@ER1//PADR = 0KETA

*** MOV.L #FFFF64,ER3//TCR0
MOV.B #83,R2H//83 = 1/8
MOV.B R2H,@ER3//TCR0 = 1/8

MOV.L #FFFF6A,ER3//GRA0
MOV.L #61A8,ER4//61A8 = 25000
MOV.L ER4,@ER3//GRA0 = 25000

MOV.W #3E8,E3//3E8 = 1000
MOV.W #0,R3// 0

MOV.B #F9,R4L// F9

MOV.L #FFFF67,ER5//TSR0

MOV.L #FFFF60,ER3//TSTR
MOV.B #1,R2H//TSTR = 1

** MOV.B @ER5,R4H//TSR0の値
CMP.B R4L,R4H//比較
BNE FFF**//ループ

MOB.B #F8,R4H//初期値に戻す
MOV.B R4H,@ER5//
INC.W #1,R3//ループ数
CMP.W R3,E3//比較
BNE FFF**//ループ

MOV.B #0,R2H//タイマーのストップ
MOV.B R2H,@ER3//


ADD.B R2L,R2L//表示桁の更新
MOV.B R2L,@ER1//
BRA FFF***

A 回答 (4件)

 #3です。

なんだかきつい口調になってしまいました。急いでいると、ついこんな口調になるようです。どうか、気にしないで下さい。
 
 2つ見つけました。
1.TCR0 = 0x83 としているのは、0xa3のほうが良いと思います。TCNT0==GRA0 の一致でTCNT0をクリアしないと、結局 一周期が 65536 カウントになります。
2.TSR0 == 0xf9 になるまで待っていますが、TCNT0==GRB0のほうが先に生じるので、TSR0=0xfb になり、いつまで待っても一致しないと思います。
while ((*TSR0 & 0x01) != 0x01);
のように、1ビットだけ監視したほうが確実だと思います。
(C言語風に説明しましたが、もし分かりにくければ質問して下さい)
    • good
    • 0

 「上手くいかない」と言っても、何がどのようにうまくいかないのかわかりません。

あるいはどこまでうまくいっているかもです。詳しい説明をお願いします。

 アセンブラが数値を10進数と16進数のどちらで解釈するかは、アセンブラの仕様やスイッチによって異なります。私が知っているアセンブラの場合、16進数は
MOV.L #H'FFFF34FB,ER0
のように表記します。10進数の場合は
MOV.L #12345,ER1
のようになります。ソースファイルとリストファイルを比べて、どのように変換されているか調べて下さい。

 それから、H8の型式を教えて下さい。
    • good
    • 0

 気になった点があります。


1.GRA0に対して、ロングワードアクセスを行っていますが、ワードでアクセスするべきではないでしょうか。H8はビッグエンディアンなので、000061A8を書き込むと、GRA0には、0000が入ると思います。それにその次のアドレスに存在するレジスタも、設定がおかしくなります。
2.ループのカウント処理に、E3とR3を使用していますが、ループ内でER3を書き換えて、データを壊しているようです。
3.CPUの型式が分からないので、レジスタに入れた設定値の妥当性はわかりません。

この回答への補足

GRA0に25000を書き込むには、10進のままワードで書き込めばよいのですか?

補足日時:2004/06/30 20:36
    • good
    • 0
この回答へのお礼

アドバイスいただいたことを参考にして以下のように
書き換えてみましたが上手くいきません・・・。

MOV.L #FFFFD1,ER0     //PADDR
MOV.B #FF,R1L//FF=11111111
MOV.B R1L,@ER0//PADDR = FF

MOV.L #FFFFD4,ER0     //PBDDR
MOV.B #FF,R1L//FF=11111111
MOV.B R1L,@ER0//PBDDR = FF

MOV.L #FFFFD6,ER0     //PBDR
MOV.B #5B,R1L//5B = "2"
MOV.B R1L,@ER0//PBDR = 5B

MOV.L #FFFFD3,ER0     //PADR
MOV.B #01,R1L//01 = 0KETA
MOV.B R1L,@ER0//PADR = 0KETA

**128 MOV.L #FFFF64,ER2//TCR0
MOV.B #83,R1H//83 = 1/8
MOV.B R1H,@ER2//TCR0 = 1/8

MOV.L #FFFF6A,ER3     //GRA0
MOV.W #61A8,E1//61A8 = 25000
MOV.W E1,@ER3//GRA0 = 25000

MOV.W #3E8,E4//3E8 = 1000
MOV.W #0,R4// 0

MOV.B #F9,R5L// F9

MOV.L #FFFF67,ER0     //TSR0

MOV.L #FFFF60,ER6     //TSTR
MOV.B #1,R5H
MOV.B R5H,@ER6//TSTR = 1

*158 MOV.B @ER0,R5H//TSR0の値
CMP.B R5L,R5H
BNE FFF*

MOV.B #F8,R5H//初期値に戻す
MOV.B R5H,@ER0
INC.W #1,R4
CMP.W R4,E4
BNE FFF*

MOV.B #0,R5H//ストップ
MOV.B R5H,@ER6

MOV.L #FFFFD3,ER0     //PADR
ADD.B R1L,R1L//表示桁の更新
MOV.B R1L,@ER0
BRA FFF**

お礼日時:2004/06/30 21:30

本題ではないですが、


タイマー割り込みを使わないと非常に効率の悪いプログラムができてしまう事があります。
その辺は大丈夫ですか。
    • good
    • 0
この回答へのお礼

まずはタイマー割り込みを使わないものを作ってから、割り込みを使ったプログラムを作るというものなのです。効率などは考えなくて大丈夫です。TSR0の値の変化を監視するようにすることは分かるのですが・・・。1/8分周で0.01sのカウントを1000回繰り返すように組んだつもりなのですが・・・。よろしくお願いします。

お礼日時:2004/06/30 08:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!