- ベストアンサー
タイマーを用いたプログラム作成の間違い
- H8のマイコンを使用して、1秒間隔で7セグメントLEDの表示を切り替えるプログラムを作成したいが、上手くいかない。タイマー割り込みを使用せずに行いたいが、以下のプログラムには何が間違っているのか教えてください。
- H8のマイコンのプログラムで7セグメントLEDの表示を1秒ごとに切り替える方法を教えてください。以下のプログラムで何が間違っているのか教えてください。
- H8のマイコンを使用して、1秒ごとに7セグメントLEDの表示を切り替えるプログラムを作成したいが、正しく動作しません。タイマー割り込みを使用せずに行いたいので、以下のプログラムにはどの部分が間違っているのか教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3です。なんだかきつい口調になってしまいました。急いでいると、ついこんな口調になるようです。どうか、気にしないで下さい。 2つ見つけました。 1.TCR0 = 0x83 としているのは、0xa3のほうが良いと思います。TCNT0==GRA0 の一致でTCNT0をクリアしないと、結局 一周期が 65536 カウントになります。 2.TSR0 == 0xf9 になるまで待っていますが、TCNT0==GRB0のほうが先に生じるので、TSR0=0xfb になり、いつまで待っても一致しないと思います。 while ((*TSR0 & 0x01) != 0x01); のように、1ビットだけ監視したほうが確実だと思います。 (C言語風に説明しましたが、もし分かりにくければ質問して下さい)
その他の回答 (3)
- LCR707
- ベストアンサー率70% (95/135)
「上手くいかない」と言っても、何がどのようにうまくいかないのかわかりません。あるいはどこまでうまくいっているかもです。詳しい説明をお願いします。 アセンブラが数値を10進数と16進数のどちらで解釈するかは、アセンブラの仕様やスイッチによって異なります。私が知っているアセンブラの場合、16進数は MOV.L #H'FFFF34FB,ER0 のように表記します。10進数の場合は MOV.L #12345,ER1 のようになります。ソースファイルとリストファイルを比べて、どのように変換されているか調べて下さい。 それから、H8の型式を教えて下さい。
- LCR707
- ベストアンサー率70% (95/135)
気になった点があります。 1.GRA0に対して、ロングワードアクセスを行っていますが、ワードでアクセスするべきではないでしょうか。H8はビッグエンディアンなので、000061A8を書き込むと、GRA0には、0000が入ると思います。それにその次のアドレスに存在するレジスタも、設定がおかしくなります。 2.ループのカウント処理に、E3とR3を使用していますが、ループ内でER3を書き換えて、データを壊しているようです。 3.CPUの型式が分からないので、レジスタに入れた設定値の妥当性はわかりません。
- ymmasayan
- ベストアンサー率30% (2593/8599)
本題ではないですが、 タイマー割り込みを使わないと非常に効率の悪いプログラムができてしまう事があります。 その辺は大丈夫ですか。
お礼
まずはタイマー割り込みを使わないものを作ってから、割り込みを使ったプログラムを作るというものなのです。効率などは考えなくて大丈夫です。TSR0の値の変化を監視するようにすることは分かるのですが・・・。1/8分周で0.01sのカウントを1000回繰り返すように組んだつもりなのですが・・・。よろしくお願いします。
お礼
アドバイスいただいたことを参考にして以下のように 書き換えてみましたが上手くいきません・・・。 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**
補足
GRA0に25000を書き込むには、10進のままワードで書き込めばよいのですか?