• 締切済み

H8/3664Fでパルス幅測定

H8/3664でパルス幅を測定しようと思っています。 秋月の超音波距離計のT7の信号を取り込んでいます。 距離を測る前にパルスの立ち上がりと立下りがちゃんと拾えてるか調べようと思い、下記のようなプログラム(mainループのみですが)を作りました。 ・・・・ PUP:  BTST  #1,@PDR8 ;P81にパルス;立上がりか?      BEQ RED1       JMP @PUP RED1: BSET #3,@PDR5  ;P53にLED-1,ON      BTST #1,@PDR8 ;立下りか?      BNE RED2     JMP @RED1 RED2: BCLR #3,@PDR5 ;RED-1 OFF      BSET #4,@PDR5 ;RED-2 ON     JMP @RED2     .END  しかし、スイッチを入れるとRED-1はつくのですが、RED-1が消えRED-2がつくまでに5秒くらいかかります。最後は命令どうりになっているのでバグではないと思うのですが・・・なぜタイムラグがあるのかわかりません。  オシロスコープでマイコンに取り込む直前の信号を見たのですが、きれいな信号で問題なさそうです。  タイムラグがある原因を教えてください。どうかよろしくお願いします。

みんなの回答

  • techa
  • ベストアンサー率60% (41/68)
回答No.1

いきなりアセンブラか...とおもったのはおいといて、 BTSTで判定しているわけですが、立ち上がり/立ち下がりを みているわけではなく、ONかOFFかをみているだけですよね PUP : BTST BEQ RED1 BCLR ==>LED1off JMP @PUP RED1: BCLR ==> LED1on JMP @PUP でよさそうなもんですね。 で結論なのですが、ただしく動いているんじゃないでしょうか。 ただ、超音波なので、ON/OFFが非常に頻繁に繰り返されて いるはずで、LEDの消灯の目視による確認ができないだけでは ないですか? オシロがあるなら、入力(P81)とLED出力(P53)を観測すれば 動作の確認はできるとおもいます。 オシロがないとすれば、まず、超音波ではなく、SWなどをつけて ON/OFFさせ、それに応じた処理が正しくできているかどうか を確認するなどの方法をとるべきでしょうね。 いずれにせよ、何事も一歩づつすすめることが肝要だとおもいます。

st03s40
質問者

補足

 丁寧な回答ありがとうございます。返答が遅くなって申し訳ありません。 (旅行で・・・)  いろいろやってみたのですが、SWではできました。 ですが、ONのときLEDを点灯させ、OFFになったとき、別のLEDを点灯させようとしているのですが、一瞬でOFFのLEDがつくと思うんですけどそれが数秒たってつきます。  パルスの電圧を測ったら6.2Vあってそれが原因なのでしょうか?  最終的にはある距離になったらLEDが点灯するようにしたいです。(インプットキャプチャで一回やってみましたがうまくいかず)  初心者の質問で申し訳ありません。わかれば教えてください。

関連するQ&A

  • SH7144でパルス幅を測定したい。

    マイコン初心者です。 SH7144でPIOに接続された信号のパルス幅を測定したいです。 ネットで検索をしてH8-3048のサンプルプログラムを見つけたのですが、 SH7144への変更のしかがたが分かりません。 どなたか分かる方がいましたらお教えください。 初心者ですので、具体的に教えていただけると助かります。 ちなみに、下記がネットで見つけたH8-3048でのプログラムです。 宜しくお願いいたします。 /* メイン関数************************************************/ int main(void){ long counter; P1.DDR = 0xff; // port1出力に設定 表示LED PA.DDR = 0x00; // portA入力に設定 パルス入力用 ITU1.TCR.BYTE = 0x23; // GRAインプットキャプチャ,カウンタクリアGRA clock 1/8 ITU1.TIOR.BYTE = 0xCD; // GRA立下り,GRB立ち上がりインプットキャプチャ ITU.TSTR.BIT.STR1 = 0; // カウント停止状態 while(1){ while(PA.DR.BIT.B4 == 0){} // 入力パルス立ち上がり検知 ITU.TSTR.BIT.STR1 = 1; // ITU1 TCNTカウント開始 while(ITU1.TSR.BIT.IMFA == 0){} // GRAキャプチャ,パルス立下り検知 ITU1.TSR.BIT.IMFA = 0; // フラグをクリア ITU.TSTR.BIT.STR1 = 0; // ITU1 TCNTカウント停止 counter = ITU1.GRA; // カウント値の取得 P1.DR.BYTE = counter >> 4; // 8bitシフトさせP1に表示 } }

  • H8 3664Fのプログラム

    タクトスイッチのチャタリングを回避し、奇数回めのONで LEDの交互点灯を(タイマを使って) やろうとしていますが、なかなかうまくいきません。 入門者でお恥ずかしいですが、下記コードの誤りをご指摘頂けませんでしょうか? 宜しくお願い致します。 以下、コード。 #include <3664.h> //プロトタイプ宣言 void main(void); int SW_Read(void); // 入力SWの状態読み込み 関数 void wait(int); // nミリ秒待つウエイト 関数 void wait1ms(void); // 1ミリ秒待つウエイト 関数 void IOinit(void); // I/O の初期化 関数 void main(void) { if (SW_Read()==1) { IO.PDR8.BIT.B0 = 1; // ポート8のビット0を出力ON IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF DI; // 割り込み禁止 TA.TMA.BYTE = 0x0A; // タイマーA、低速発信・0.25sec設定(タイマーのカウント開始) IRR1.BIT.IRRTA = 0; // タイマーA 検知フラグをゼロクリア IENR1.BIT.IENTA =1; // 割り込み許可 EI; // 割り込み許可 } else { } while(1) { } } /////////////////// I/Oの初期化 void IOinit(void) { IO.PCR8 = 0x03; // ポートコントロールレジスタ: ポート8のビット0・1を出力に設定 // その他のビットは入力に設定 IO.PDR8.BIT.B0 = 0; // ポート8のビット0を出力OFF IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF IO.PCR1 = 0x00; // ポートコントロールレジスタ: ポート1を全ビット0とし、入力に設定 } /////////////////// タイマーA関数 void int_timera (void) // タイマーA関数 { IO.PDR8.BIT.B0 = ~IO.PDR8.BIT.B0; // ポート8のビット0を反転して出力(赤)LED用 IO.PDR8.BIT.B1 = ~IO.PDR8.BIT.B1; // ポート8のビット1を反転して出力(緑)LED用 IRR1.BIT.IRRTA = 0; // タイマーA検知フラグをゼロクリア } /////////////////// スイッチの状態読み込み int SW_Read(void) { int sw1; //スイッチ状態読み込み1回目 int sw2; //スイッチ状態読み込み2回目 int val; //スイッチの状態判定値の入力値 int memval; //入力信号の全回の値 int numcnt; //奇数偶数判定ループ用カウンタ while(1) //モニタリング { sw1 = IO.PDR1.BIT.B7; // スイッチの状態読み込み1回目 wait(10); // 10mS待つ sw2 = IO.PDR1.BIT.B7; // スイッチの状態読み込み2回目 memval=val; //現行のスイッチ状態判定値をメモリに入れ替える if(sw1==1 & sw2==1) // スイッチ読み込み1回目と2回目共にONだったら { //スイッチ状態判定を<押した>と見なして、 val=1; } else { val=0; } if(memval==0 & val==1) //パルスの前後状態を比較し、新規に立ち上がりONであれば、 { numcnt=++numcnt; if(numcnt%2!=0) //ループカウンタが奇数だったら { return(1); // 1を返す } else { } } else { } } } //////////////////// nミリ秒待つウェイト関数 void wait(int time) { int i; // ループカウンタ for(i = 0 ; i < time ; i++) // time回数分ループ wait1ms(); // 1ミリ秒のウェイト関数を呼び出す } //////////////////// 1ミリ秒待つウェイト関数 void wait1ms(void) { int i; // ループカウンタ for(i = 0 ; i < 2662 ; i++); // 1ミリ秒の間ループする } 以上、宜しくお願い申し上げます。

  • H8/3664FのAD変換について

    初めまして。 現在大学でH8/3664FでのAD変換を行っているのですが、 AD変換とその値に対する出力への動作が上手くいきません。 分かる方、ご教授お願いいたします。 現状は、1.7V程度の信号をADコンバータ端子(AN1)に入力しています。 AD変換を行い、条件として1V以上のときは出力に設定した 端子(P11)から5V出力しダイオードを光らせようと思っています。 プログラムは以下のように組んでいます。 おかしいところがあればご指摘お願いします。 void main(void){ IO.PMR1.BYTE=0x00; /* ポート1入出力ポート*/ IO.PCR1=0xff; /* ポート1出力*/ /*AD変換の初期設定*/ AD.CSR.BIT.ADST=0; /*AD変換機能停止*/ AD.CSR.BIT.SCAN=1; /*スキャンモード*/ AD.CSR.BIT.CKS=1; /*高速変換*/ TW.TCRW.BIT.CCLR=1; /* TCNTがGRAでクリア */ TW.TCRW.BIT.CKS=3; /* クロックφ/8 */ TW.GRA=40000; /* パルスの周期20ミリ秒 */ TW.TMRW.BIT.CTS=1; /* カウントスタート */ while(1){ /* 20ミリ秒間のカウントは約8880となる. */ if(TW.TSRW.BIT.IMFA==1){ TW.TSRW.BIT.IMFA=0; AD.CSR.BIT.ADST=1; /*AD変換機能開始*/ while(AD.CSR.BIT.ADF==0){}; /*AD変換終了待ち*/ AD.CSR.BIT.ADF=0; /*変換終了フラグクリア*/ AD.CSR.BIT.ADST=0; /*AD変換機能停止*/ x0=(int)(AD.DRA>>6); /*x0に値を格納*/ if(x0>100){/*1V以上の場合*/ IO.PDR1.BIT.B2=1; }else{ IO.PDR1.BIT.B2=0; }

  • AKI-H8/3048Fマイコンボードについて質問

    毎度お世話になっております。 H8マイコンについて質問があります。 以前から、秋月電商さんのAKI-H8/3048F基板の組み立てキットを使用しております。 が、秋月電商さんの方で組み立てキットの販売が縮小され、組立済みの基板の方でないと入手が困難になってきましたので、先日、初めて組立済みのAKI-H8/3048Fを使用してみました。 キットと組立済み製品では完全にピンコンパチなので、何も考えずに同一のプログラムを書き込んで見たところ、液晶表示器の制御で誤作動が起きました。 状況を列挙しますと、 1)症状 3回に2回程度の割合で、電源投入直後からLCDが全ビット点灯で真っ黒な状態で、何もデータが表示されない。 組み立てキットの方では、同一プログラムを書き込み、同一の装置に差し込んだ状態で問題なくデータが表示される。 それぞれ電源のON/OFFを十数回繰り返して検証したが、現象はかわらなかった。 2)H8マイコンの書き込みモード モード7 3)H8マイコンのピンの割り当て H8マイコンのポート3を下記の様に使用。 /*****************************************************/ H8マイコンのP3をLCD制御に使用 7  6  5  4   3   2   1   0 - RW  E RS DB7 DB6 DB5 DB4 /*****************************************************/ AKI-H8/3048F上では、P3はCN3の13,14,15ピンになります。 DB0~DB3はセオリー通りGNDに落としています。 4)回路基板 基板は手配線ではなく、PCBに起こした物。 AKI-H8/3048Fのソケットから液晶表示器まで直結していて、 各信号線は10kΩの抵抗で5Vにプルアップされている。 5)電源 H8基板のレギュレータは使用せず(取り外してある)、回路基板 上の5V電源から供給(LCDも同一電源から供給)。 ちなみに電源は、1A5Vの三端子レギュレータで作っており、特にリップル等もない。 6)LCD POWERTIP PC1602-Lを使用しています。 上記の様な状態です。 ちなみに、組み立てキットと完成済み製品で基板のパターンを比較したところ、違いはCN3-14(P3-4)が、H8/3048FのICのパスコンの下をくぐっていところくらいでした。 それと、LCDの初期化の所で、E信号の間に設けるディレイを、200usecから700usecに変えたところ、症状がおさまった様にみえます。 本来であれば制御信号をモニタしてみるのが第一だとは思うのですが、適当な計測機器が手元に無く解析に苦労しております。 もし、 ・同様の症状の経験 ・原因について心当たり ・原因の調査方法についての助言 等のある方がおられましたら、是非ともアドバイスをお願い致します。 それと、上記で不明な情報がありましたら、なるべくすぐに追記致しますので、お申し出下さい。 よろしくお願いいたします。 訂正です。 >ちなみに、組み立てキットと完成済み製品で基板のパターンを比較したところ、違いはCN3-14(P3-4)が、H8/3048FのICのパスコンの下をくぐっていところくらいでした。 H8/3048のICのP3-5(E信号)ピンからCN3-14番ピンまでの配線パターンが、完成品ではH8/3048のICのパスコンのチップコンデンサの下をくぐっている。 でした。

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

    【対象】 日経エレクトロニクス(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のみの点灯となってしまいます。 試行錯誤で今まで行ってきましたが、現在止まってしまっております。 解決策など教えていただければと考えております。 回答の方、宜しくお願いいたします。

  • 秋月電子通商の超音波デジタル距離計キットとマイコンの接続

     とある学生なのですが、秋月の超音波距離計の距離をマイコンに取り込みたいと思っています。でも自分の知識不足もありますが、どこをつないでいいのかわかりません。   インターネット等で調べ、超音波のキットで「T7の信号が超音波が往復している時間ONとなってそれをマイコンに取り込む」というのは見つけたのですが、オシロスコープで波形を見ようとしてもうまく見れませんし、マイコンにどう接続すればいいかわかりません。  接続しようとしているマイコンはH8/3664です。  どうかわかる方教えてください。  できるならでだしのプログラムorアルゴニズムもお願いします。

  • SH7144で汎用入力のパルス幅を測定したい。

    マイコン初心者です。 SH7144で汎用入力のパルス幅を測定したいです。 どなたか分かる方がいたら教えてください。 下記の様にプログラムしてみたのですが、timは、"0"となってしまいます。 他にも何か設定が必要なのでしょうか? または、汎用入力をトリガにタイマーを使用することはできないのでしょうか? ====================================================== unsigned short tim; // 設定 MTU1.TCR.BYTE = 0x03; // カウンタクリア禁止,内部CLK=PΦ/64 MTU.TSTR.BIT.CST1 = 0; // カウント停止 MTU1.TCNT = 0; // カウントクリア // タイマスタート MTU.TSTR.BIT.CST1 = 1; // カウント開始 // パルス監視(HIGHを測定) while(!PF.DR.BIT.B7); // TRG=H while( PF.DR.BIT.B7); // TRG=L // タイマー停止 MTU.TSTR.BIT.CST1 = 0; // カウント停止 tim = MTU1.TCNT; // カウント値取得 ======================================================

  • 超音波センサのパルス幅測定の仕方が分かりません

    現在,超音波センサ(LV-MaxSonar)を使用して,距離を測定することを考えています. そこで,sh2-7047を用いてパルスの幅を測定することでセンサから障害物までの距離を測定する事を目指しているのですが,マイコンのどの機能を使って,どのようなプログラムを書けば,パルスの幅を測定出来るのか分かりません.教えてください.

  • 流量計のパルス幅を広くしたいのですが。

    パルス幅が3ms~4msの灯油流量計を購入したのですが、今までのパルスロガーが約15ms以上なので使用できないことに気がつきました。 ロガーと流量計の接点の間に乾電池をつないで記録しているだけなんですが、その間に入れる等して、安く流量計のパルス幅を広くして記録できるようにする物や方法があるでしょうか。 素人で用を得ない質問でしょうがどなたか教えて下さい。

  • パルス幅とオシロスコープについて教えて下さい。

    パルス幅をT=5msになるような、 コンデンサと抵抗の組み合わせが何通りもあると思うのですが、 この理論値を使って、回路を組みオシロスコープでみてみると、 コンデンサと抵抗の組み合わせによって波形が違ってきます。 これは何故なんでしょうか? よろしくおねがいします。