• 締切済み

アセンブラのタイマー割り込み

ちょと長いですがプログラムおいときます 下のプログラムでは割り込みをスイッチで行うのですが スイッチを使わない割り込みをするにはタイマーがいいのではと聞きましたが 私にはわからなかったので教えていただきたいです どこをどう変えたら起動できるでしょうか? 使っているものはマイコン(R8C15)です 内容とか足らないのかもしれませんが何でも言ってください すみませんがよろしくお願いします .INCLUDE sfr_r815.inc ;プログラム部分 .SECTION PROGRAM, CODE .ORG 0D000h Start: LDC #0500h, isp LDINTB #VarVector JSR SetClock20MHz JSR InitPort JSR InitKeyInputIntr MOV.B Dummy, r0h FSET i Loop: BCLR p1_1 JSR Wait2s BSET p1_1 JSR Wait2s JMP Loop ;外部クロックに切り替えるサブルーチン SetClock20MHz: BSET prc0 BSET cm13 BSET cm15 BCLR cm05 BCLR cm16 BCLR cm17 BCLR cm06 NOP NOP NOP NOP BCLR ocd2 BCLR prc0 RTS ;ポートの初期化を行なうサブルーチン InitPort: MOV.B #00000110b,drr MOV.B #00000110b,p1 MOV.B #00000110b,pd1 RTS ;キー入力割り込みの初期化を行なうサブルーチン InitKeyInputIntr: BCLR ki0pl BSET ki0en MOV.B #01h, kupic RTS ;2秒待ちサブルーチン Wait2s: MOV.W #200, r1 Wait2s_1: JSR Wait10ms SBJNZ.W #1, r1, Wait2s_1 RTS ;10m秒待ちサブルーチン Wait10ms: PUSH.W r0 MOV.W #28571,r0 Wait10ms_1: SBJNZ.W #1,r0,Wait10ms_1 POP.W r0 RTS ;キー入力割り込み処理ルーチン KeyInput: Start1: MOV.B #10001001b,pd1 MOV.B #00000000b,p1 MOV.B #10111000b,pd3 MOV.B #00000000b,p3 Syoki01: MOV.W #2,r1 BSET p1_3 ;M BCLR p3_3 ;SDI Loop1: MOV.W #2,a1 GYOU: MOV.W #9,a0 CP00: BSET p3_4 ;CP=H BCLR p3_5 JSR wait1 BCLR p3_4 ;CP=L JSR wait1 BSET p3_4 ;CP=H BCLR p3_5 JSR wait1 BCLR p3_4 ;CP=L JSR wait1 SBJNZ.W #1,r1,CP00 BNOT p3_3 ;SDI MOV.W #2,r1 SBJNZ.W #1,a0,CP00 LOAD0: BSET p3_4 ;CP=H ;BSET p3_5 ;LOAD JSR wait1 BCLR p3_4 ;CP=L BCLR p1_0 ;DIO BSET p3_5 ;LOAD JSR wait1 BNOT p3_3 ;SDI SBJNZ.W #1,a1,GYOU MandDIO: BSET p1_0 ;DIO BNOT p1_3 ;M JMP Loop1 wait1: MOV.W #30,r2 wait001: SBJNZ.W #1,r2,wait001 RTS REIT ;その他の割り込み処理ルーチン NOTUSE: REIT ;データ(作業領域)部分 .SECTION WORK,DATA .ORG 0400h Dummy: .BLKB 1 ;可変ベクタテーブル .section VARIABLEVECTOR, ROMDATA .org 0F000h VarVector: .lword NOTUSE .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword KeyInput .lword NOTUSE .lword NOTUSE .lword NOTUSE .lword NOTUSE .lword NOTUSE ;リセットベクタ部分 .SECTION FIXVECTOR, ROMDATA .ORG 0FFFCh Reset: .LWORD Start | 0FF000000h .END

みんなの回答

  • kaoaru
  • ベストアンサー率33% (42/127)
回答No.2

めんどくさいので要点だけ。 1・ベクタテーブルのタイマ割込みのところに、タイマ割込みで処理したいエントリを指定する。 2・初期化のところでタイマ関係の初期化もする。そして割込みを許可する。 ハードウェアマニュアルをよく読んでください。少なくともプログラミングされているわけですから理解できない内容ではないハズです。他力本願にならぬよう、ご注意ください。 割込みをかける周期とかは設計上の話になりますのでそれは自分でクリアしてください。 あまり極端に短いタイマで割込みをかけるとメインループ処理に影響しますので、そういう部分は自分で習得する以外に方法はないのです。

  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.1

前回の質問読みました. ソースコードは斜め読み. デバッグする気はありません. とりあえず質問を眺めた上でのアドバイスですが, 1.「到達点は明確ですか?」 20MHzでR8を利用している様ですが, 壊れたLCDコントローラの代わりにタイマ割り込みを利用してビデオ信号をポート制御にて行おうとしているのであれば無謀としか言い様がありません. ポート制御で生成できるパルス波形は1Mhz前後になるでしょう. ビデオ信号に必要なピクセルクロックはVGAサイズでさえ20MHz程度になります. 昨今のFullHDであれば135Mhzとか. 作業前にその辺りに見積もりが取れていないと, 作業時間が無駄になってしまいます. 2.「タイマは定周期イベントを得る為に利用します」 タイマと呼ばれる周辺モジュール(ペリフェラル)の実態は概ねカウンタです. カウントアップするパルスエッジのリソースとして正確なクロックを与えることで, 定周期のイベントを起こすことが可能です. 一般的にはイベントとしてCPU割り込みを発生させ, 定周期処理を実現します. 3.「要点は明確・簡潔に」 質問の記述からは困っているポイント・どのように動作したらOKなのかが伝わってこないので, アドバイスを送ろうにもどんなアドバイスを送れば良いのか困ってしまいます. 質問の仕方を工夫すれば, より多くの方から回答が寄せられるでしょう. 極論から言うと, 箇条書きがベストです. 社会に出られて実務を行われる際, コンパクトに話をまとめられる力はエンジニアにとって知識と並ぶ超強力な武器となるので是非磨いて下さい. 機能をすべて盛り込んだプログラムから不具合を抽出するのは難しいです. (※結合テストから実施するのは非効率的) 各機能レベルまで分解し, 個々のドライバが期待の動作をしているか「モジュールテスト」から始めましょう. 具体的に言うならば, データシートを熟読してタイマ割り込みでLEDでも点滅させる動作確認用のプログラムを書き, タイマの使い方を把握してから実機能の搭載に取り掛かるべきだと思います. ここまで書けるのなら半日~1日程度で片が付く問題でしょう.

関連するQ&A