• 締切済み

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

ちょと長いですがプログラムおいときます 下のプログラムでは割り込みをスイッチで行うのですが スイッチを使わない割り込みをするにはタイマーがいいのではと聞きましたが 私にはわからなかったので教えていただきたいです どこをどう変えたら起動できるでしょうか? 使っているものはマイコン(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

  • マイコンキットで学ぶ/組み込みシステム入門

    【対象】 日経エレクトロニクス(2007.6.30発行) 16ビット・マイコン搭載ボード付き(組み込み速修キット) エミュレータ一体型 http://techon.nikkeibp.co.jp/embedded/academy/thats1.html http://techon.nikkeibp.co.jp/embedded/academy/guide1.pdf#search='NE... <マイコン> R5F21256SNFP <エミュレータチップ> HD64F2215U(H8Sファミリ/2215グループ) (このマイコンに特殊プログラムをインストールしてエミュレータ機能をもたせているのか?) <パソコンOS> Windows7(32bit版) Sw1(p1_7) Sw2(p1_3) LED1(p2_0) LED2(p2_1) 始めまして。アセンブリの学習を始めた初心者です。 皆さんに質問です。 現在「Sw1を押した時LED1が90%で点灯かつSw2を押した時LED2が80%で点灯する事」を課題として行っています。   私が入力した命令 .INCLUDE sfr_r825.inc .SECTION PROGRAM,CODE .ORG 0009000h Start: MOV.B #01110111b, pd1   p1_7、p1_3を入力ポートに設定 MOV.B #0FFh, pd2     p2_0,p2_1を出力ポートに設定 MOV.B #0FFh, p2      LED1,LED2消灯 Loop: BTST p1_7      Sw1がOnならZフラグに1、OFFなら0 JZ Sw1_On    Zフラグが1ならSw1_Onへ BTST p1_3      Sw2がOnならZフラグに1、OFFなら0 JZ Sw2_On    Zフラグが1ならSw2_Onへ JMP Loop Sw1_On: BCLR p2_0          LED1点灯 JSR Wait_LedOn01     BSET p2_0          LED消灯 JSR Wait_LedOff01 JMP Loop Sw2_On: BCLR p2_1           LED2点灯 JSR Wait_LedOn02 BSET p2_1           LED2消灯 JSR Wait_LedOff02 JMP Loop Wait_LedOn01: MOV.W #198,R0 WaitSub_LedOn01: SBJNZ.W #1,R0,WaitSub_LedOn01 RTS Wait_LedOff01: MOV.W #22,R0 WaitSub_LedOn02: SBJNZ.W #1,R0,WaitSub_LedOn02 RTS Wait_LedOn02: MOV.W #176,R0 WaitSub_LedOn03: SBJNZ.W #1,R0,WaitSub_LedOn03 RTS Wait_LedOff02: MOV.W #44,R0 WaitSub_LedOn04: SBJNZ.W #1,R0,WaitSub_LedOn04 RTS .SECTION FIXVECTOR,ROMDATA .ORG 0FFFCh Reset: .LWORD Start|0FF000000h .END という入力をしました。 しかし、Sw1,Sw2を同時に押した際、LED1のみの点灯となってしまいます。 試行錯誤で今まで行ってきましたが、現在止まってしまっております。 解決策など教えていただければと考えております。 回答の方、宜しくお願いいたします。

  • アセンブラの練習で困ってます

    下記のようなアセンブラのプログラムの勉強をしています。初心者。 (ベクターテーブルとかは省略してます) この状態であれば、tablに書いたデータどおりにLEDが順番に点灯します。 しかしtablの内容を書き換えると、点灯しなくなります。命令語の意味を 調べたりしたのですが、わかりません。どなたか理由を教えてください。 (例えば) 10000000 01000000 00100000 00010000 10000000 01000000 00100000 ・・・・ プログラム抜粋 reset: mov.l #stack,sp bsr initio begin: mov.l #tabl,er1 ; 点灯データ表 mov.w #14,r2 ; 点灯データ表のデータ数 loop: mov.b @er1+,r0l not.b r0l mov.b r0l,@p1dr bsr wait dec.w #1,r2 bne loop bra begin ; tabl: .data.b b'10000000 .data.b b'01000000 .data.b b'00100000 .data.b b'00010000 .data.b b'00001000 .data.b b'00000100 .data.b b'00000010 .data.b b'00000001 .data.b b'00000010 .data.b b'00000100 .data.b b'00001000 .data.b b'00010000 .data.b b'00100000 .data.b b'01000000 ; initio: mov.b #h'ff,r0l ; ポート1を出力に設定 mov.b r0l,@p1ddr rts ; wait: mov.l er0,@-sp mov.l #h'100000,er0 wait1: nop dec.l #1,er0 bne wait1 mov.l @sp+,er0 rts

  • アセンブラ、、タイマルーチン

    LOOP0: MOV.W @DATA1,RO ;6ステート LOOP2: MOV.W @DATA2,R1   ;6 DEC.W #1,R1 ;2 BNE LOOP1 ;4 DEC.W #1,R0 ;2 BNE LOOP2 ;4 MOV.W #H'FFFF,R2 ;4 JSR @LIGHT ;6 JMP @LOOP0 ;4 上記のプログラムの実行にかかる時間を計算で求めるとどうなるでしょうか?? DATE1は H'FFFE00で DATE2は H'FFFE02です。ほかにも数値がいるでしょうか? ステートは自分で考えたので間違っているかもしれません(苦笑) 全然理解できていなくて困っています。教えてください!!

  • 割り込みなしのタイマー

    以下のような割り込みを用いないタイマーを使うプログラムをH8マイコンで動かしたいのですが、上手くいきません・・・。表示を1秒間隔で切り替えていくものです。どこがよくないのでしょうか? 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**

  • タイマーを用いたプログラム

    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***

  • 組み込みアカデミー LEDを1個点灯のはずが2個点灯してしまいます

    組み込みアカデミー第1回 LEDを1個点灯のはずが2個点灯してしまいます。 対象は付録の「NE-R8C/25」です。動作確認プログラムのslos.hwsを実行するとLED1と2が交互・同時点灯を繰り返し、正常に動作しています。 ところが以下のプログラムをC:\WorkSpace\step01\step01\step01.a30として実行してもLEDが2個点灯してしまいます。 プログラム中 LED1点灯のところがMOV.B #11111110b,p2でもLED1と2同時に点灯してしまいます。 指定されたsfr_r825.incファイルはc:\WorkSpase\STEP01\STEP01以下にコピーしています。 .INCLUDE sfr_r825.inc ;SFR定義ファイルのインクルード .SECTION PROGRAM,CODE ;コードセクション .ORG 0009000h Start: MOV.B #11111111b,pd2 ;入出力ポートP2を出力ポートに設定 BCLR p2_0      ;LED1点灯  BSET p2_1      ;LED2消灯 Loop: JMP Loop .SECTION FIXVECTOR,ROMDATA .ORG 0FFFCh Reset: .LWORD Start|0FF000000h .END

  • PICでLEDを点滅させる

    16F628Aを使ってLEDが点滅するプログラム作ることはできたのですが、それを16F873A用に組み替えてみたのですが点滅せずに点灯したままになります。ハード的な問題なのかそれともプログラム問題なのかがわかりません。マイコンの勉強をはじめたばかりなのでお教えいただければたすかります。 ちなみにプログラムは以下のようになっています。クロックは10MHzです。 開発環境はMPLABをつかっていて秋月のキットを使って書き込んでいます。 ; ; ; list p=pic16f873a #include <P16F873A.INC> __CONFIG _WDT_OFF & _HS_OSC & _CP_OFF & _PWRTE_ON & _LVP_OFF COUNT EQU 20H COUNT1 EQU 21H ORG 0 MAIN BSF STATUS,RP0 CLRF TRISA CLRF TRISB CLRF TRISC BCF STATUS,RP0 MOVLW B'11111111' MOVWF PORTC CALL LA CLRF PORTC CALL LA GOTO MAIN LA MOVLW B'11111111' MOVWF COUNT LOOP2 MOVLW B'11111111' MOVWF COUNT1 LOOP NOP NOP NOP NOP NOP NOP NOP DECFSZ COUNT1,1 GOTO LOOP DECFSZ COUNT,1 GOTO LOOP2 RETURN END

  • フローチャート、教えて!

    このプログラムのフローチャートなんですけど・・・。 list P=PIC16F84A INCLUDE "P16F84A.INC" __CONFIG _HS_OSC&_WDT_OFF&_PWRTE_ON ; WCNT EQU 018H ; ORG 0 GOTO START ; ORG 05H ; START BSF STATUS,RP0 MOVLW 03H MOVWF TRISA BCF STATUS,RP0 ; st CALL SPEAKER goto st ; SPEAKER BCF PORTA,2 CALL WAIT2 BSF PORTA,2 CALL WAIT2 RETURN ; WAIT2 MOVLW D'249' ; MOVWF WCNT ; WAIT3 NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; DECFSZ WCNT,F ; GOTO WAIT3 ; RETURN ; ; WAIT4 NOP ; DECFSZ WCNT,F ; GOTO WAIT3 ; RETURN ; END ; ちょっと見難いですね、ごめんなさい;; このプログラムなんだけど、自分では良く分からなくて(@@; アセンブラ?だっけこれ、これでフローチャート作ったことないんだよね・・・。 簡単なフローチャート図なら作ったことあるけど、ほんと基本的な物だったからねぇ。 どうか、教えてください!

  • PIC16F84Aから16F628Aの変換について

    以前PIC16F84Aで問題なく動作しているプログラムを 初期設定を変えて(これでいいのか?も疑問)16F628Aで動かそうとしていますが サブルーチンに入り「タイマー」のルーチンから抜け出せないみたいです。 BILD ALL ではエラーは出ません。 割込みは正常に動作します。 どこがいけないのでしょうか? よろしくお願いいたします。 プログラムはこちらです。 ;------------------------------------------------------------------------- ;     初期設定 list P=pic16f628a include "p16f628a.inc" __CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _MCLRE_OFF ORG 0 GOTO MAIN ;----------------------------------------------------------------------- ; 割り込み処理 ORG 4     ;割り込みアドレス CLRW CLRF PORTB     ;ポートBクリア GOTO MAIN ;----------------------------------------------------------------------- ; メインプログラム MAIN   BCF STATUS,RP0          MOVLW B'00000111'         MOVWF CMCON         BSF INTCON,INTE     ;割りこみ許可?          BSF STATUS,RP0     ;ポートAを全て入力に設定         MOVWF TRISA          MOVLW H'01'     ;ポートBは0(ゼロ)以外は出力に設定         MOVWF TRISB         MOVLW 90H     ;INT割り込み許可         MOVWF INTCON         BCF STATUS,RP0     ;ポートBをクリア         CLRF PORTB          CLRW ;---------------------------------------------------------------------- ; スイッチ入力チエック LOOP    BTFSS PORTA,0     ;オープンSWがONか?          GOTO OPEN      ;ONだったら OPENへ         GOTO LOOP ;----------------------------------------------------------------------- ; オープン動作 OPEN    MOVLW 010H      ;ポートB4番に5V出力(リレーON)          MOVWF PORTB        MOVLW D'250'      ;動作時間 '250'設定         MOVWF 0EH      ;アドレス0EHに250を入力          CALL LOOP3      ;サブルーチンLOOP3を呼び出す        GOTO MAIN      ;サブルーチンが終わったら MAIN に戻れ ;------------------------------------------------------------------------ ;----------------------------------------------------------------------- ; サブルーチン(タイマー) TIMER1    MOVLW D'220'           MOVWF 0CH LOOP1    NOP           DECFSZ 0CH,1           GOTO LOOP1         RETURN TIMER2     MOVLW D'100'      ;アドレス0DHに100を入力          MOVWF 0DH LOOP2    NOP           CALL TIMER1      ;TIMER1を呼び出し(行く)           DECFSZ 0DH,1      ;アドレス0DH から1を引き算する           GOTO LOOP2      ;結果が"0"でなかったら LOOP2に戻ってまた引き算          RETURN       ;引き算の結果が"0"になったら「CALL」した「次に(下)」へ戻る LOOP3    NOP      ;何もしない          CALL TIMER2      ;TIMER2を呼び出す(行く)         DECFSZ 0EH,1         GOTO LOOP3          RETURN END    END

  • アセンブラ(アセンブリ?)に関する質問

    アセンブラのプログラムを学んでいる時に、 MOV.B @(TBL01,ER0)、R3H というところがでてきました。 この中の TBL というのが宣言されてなく、よくわかりません。 また、@(,)の意味もわかりません。 知識のある方、どうか教えてください。

専門家に質問してみよう