• ベストアンサー

アセンブラを勉強中の者です。

アセンブラを勉強中の者です。 PIC16F84Aによるタイマープログラムについておしえてください。 言語はアセンブラでRA4を入力にしてDC5Vの電圧を加えたときに、 ・RB5(出力)ではRA4のタクトスイッチを押したと同時にリレーが1秒間オンにする ・RB4(出力)ではRA4のタクトスイッチを押した後、0.4秒後にリレーが0.2間オン このような動作は、並列実行できるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#120054
noname#120054
回答No.1

タクトスイッチのチャタリング取り、RB5タイマー、RB4タイマーを一個の10mSインターバルタイマーで処理するなどの方法があります。 10mSのインターバルタイマールーチンを作ります。PIC16は割り込みでレジスタを自動でスタックに退避しないのでインターバルタイマルーチンの頭と最後にマニュアルに載っているとおりのレジスタ退避が必要です。これによって、10mSに1回インターバルタイマールーチンを通ることになります。 チャタリング取りタイマーは8bitのメモリーで、初期値を0として、RA4がH(スイッチOFF)の時0を、L(スイッチON)の時タイマーの値が5未満なら+1をセット、5以上なら何もしません。タイマーの値が4の時をタクトスイッチONとみなします。これで40mSまでのチャタリングを取り除いたタクトスイッチONの前縁を検知できます。 RB5タイマーは8bitのメモリーで、初期値を255として、タイマーの値が255未満のとき+1をセットします。またタクトスイッチONの前縁(チャタリング取りタイマーが4)で0をセットします。この値が0~100の時RB5をH、それ以外のときLとします。 RB4タイマーは8bitのメモリーで、初期値を255として、タイマーの値が255未満のとき+1をセットします。またタクトスイッチONの前縁(チャタリング取りタイマーが4)で0をセットします。この値が40~60の時RB4をH、それ以外のときLとします。  この3つの処理を一個のインターバルタイマールーチン内に書くことによって並列に動作させることが出来ます。  上記でタイマーと言っている値はPICのハードウェアタイマーではなくメモリー上の値ですから混同しないよう気をつけてください。使用するハードウェアタイマーは10mSインターバルタイマーを作る汎用タイマー1個のみです。