- ベストアンサー
STATUSのZフラグについて
STATUSのZフラグについてお聞きしたい事があります。 参考書を読んでみると、「Zフラグは、計算結果や代入結果が'0'となったことを表す指標のことをいう。数値の一致を知るには引き算をしてZフラグを見るプログラムを書く」とあります。 サンプルプログラムを見ても'0'か'1'しかZフラグには存在しない様に思われますが、現在私が組んでいるプログラムでは、プログラムが1行進むにつれてZフラグの数字が1ずつ増えていってしまい、計算結果を確認する事が出来ません。これは単に私のプログラムの設定が間違っているのでしょうか。もしソースがあれば判断出来るのであれば後ほどアップしますのでどなたか教えてもらえませんか。PICアセンブラで組んでいます。宜しくお願い致します。
- jza70-kai
- お礼率60% (21/35)
- その他(プログラミング・開発)
- 回答数11
- ありがとう数6
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
0Vと5Vがショートしない限り発火の心配はないと思います。 10Kオームの抵抗でパルスとの間は安全に接続されていますので、この回路で問題はでないと思いますが、ゲート側にコンデンサが入っているのでノイズには良いかもしれませんが、多少信号が遅延しているかも(時定数をすぐ言えるほど精通していないので勘ですが)。カウントできているなら問題ないと思います。 コンデンサは信号の変化をゆるやかにする効果がありますので。
その他の回答 (10)
- zwi
- ベストアンサー率56% (730/1282)
>あと、GとS間に抵抗ですか??入ってなかったですよ。この回路も別の方に教えて頂いたものなんですが・・・。ちなみに入れる抵抗値は10KΩくらいでいいのでしょうか? うーん。私もFETは不勉強で(^^ゞ トランジスタなら必要そうだと勘で分かるんですが、とりあえず動いているなら放置してかまいません。 こんな感じ(簡略図)でLEDにそのまま出力してみてください。 スイッチ→FET→PIC→LED PICは入力をそのまま出力にスルーします。 ちゃんとスイッチと連動してON/OFFしていたらOKって事で。 >PORTAの点灯なんですけれど、プログラムを訂正してみましたがやはり点灯しません。さらに気付いたんですが、PORTCの6と7番のLEDも点灯していませんでした。PIC壊しちゃったかな?(T_T) そう簡単には壊れませんので、動作を確認してみましょう! 全てのポートにオール1を出力してみます。これで配線が間違っていなければ点灯するはずです。今まで一度でも全点灯のテストはした事がありますか?マイコンは、こういう地道な部分を最初に確認しておくと後で悩まなくても済みますので必ず最初に確認しましょう。 >割り込みのレジスタ退避はしてたつもりなんですが、これは退避になっていないのでしょうか。 退避と回復として正しいですが、タイミングが間違っています。 なぜなら、割り込んだ瞬間の値を退避しないと駄目なんですが、割り込みの最初のほうで、 bsf STATUS,RP0 とか movlw 00H で値を変更してますよね。つまり、ここで変更した値を保存してしまっています。じゃあ割り込んだ瞬間の値はと言うと失われているので二度と元に戻せません。 このまま割り込み元に戻ると割り込む前に使っていたWレジの値やSTATUSの一部が失われているのでマズイのです。 しかし、よく考えてみると前に書いてもらったカウントしているだけのプログラムなら問題が出ないはずだなぁ。Wレジ使っていないし。問題は別件かもしれませんね。 >メーターに出力する所はまだまだ手直し出来るんですね。私の頭ではこれが現状では限界だったもので。(^^; 整理してみると意外とシンプルに書けますよ。 movlw D'130' ;これが最大値 subwf PULSE_COUNT2,W ;PULSE_COUNT2-130。130より大きければC=1 btfsc STATUS, C ; 130以下(c=0)ならスキップ goto speed_180 ; c=1なら180km/hオーバーとして処理。 これを大きい値から小さい順に処理します。 movlw D'108' ;次の値。 subwf PULSE_COUNT2,W ;PULSE_COUNT2-108。108より大きければC=1 btfsc STATUS, C ; 108以下(c=0)ならスキップ goto speed_150 ; c=1なら150km/hオーバーとして処理。 って感じです。
お礼
zwi様、こんばんは。ご無沙汰しております。 その後の報告を書き込もうと思ったら、先に回答がないとそこには書き込みが出来ないんですね。 とゆー事でまだお礼内容にはなりませんがこちらに書かせて頂きました。 パルス入力部分はやはりおかしく、色々調べてみて、部品番号とかは違ったのですが、使えそうなものがあったのでちょっとアレンジして回路を作ってみました。 5V ↓ 1kΩ ↓ LED 2SK2493 ↓ パルス入力→10KΩ→→→→G→→→D→→→PIC ↓ ↓ ↓ 0.1uF ↓ S ↓ 10KΩ ↓ ↓ ↓ ↓ 0V 0V これで動かしてみたら、入力が入った時(スイッチを押した時)にPICはHi、スイッチを離したらPICはLowとなり、期待していた動きになりました。 先日、実際に車に取り付けて車速パルスを認識して動くか試してみました。結果はちゃんとパルスをカウントして、LEDも点灯しました。ただ点灯するタイミングがずれていたのでその辺りは微調整が必要な様です。 上記の回路が悪魔で自己流なものなので、これで完成品を作っても大丈夫なのかが一番の心配点です。間違って発火なんぞされたら大変ですもんね。(^^; zwi様はどう思われるでしょうか。 またお時間がある時で結構ですのでご回答をお願い致します。
補足
zwi 様 こんばんは。昨日と今日はちょっと出掛けていましたので返事が遅くなりました。 >スイッチ→FET→PIC→LED >PICは入力をそのまま出力にスルーします。 >ちゃんとスイッチと連動してON/OFFしていたらOKって事で。 やってみました。 あっ、何か変。 そう言えば前に入力部分はこうやっていますって書いた時に、入力がなくてもHi入力になっているって書きましたよね。 前の配線図で接続したら、電源を入れたらやはりLEDが最初から点灯しています。そしてスイッチを入れたらLEDが消えるんですが、スイッチを離してもすぐには点灯せず、1秒ほどしてから点灯しています。 これがzwi様の言っていた「GとS間に抵抗が入っていなかったか?」に繋がるんでしょうかね。ちょっと調べてみます。 >全てのポートにオール1を出力してみます。これで配線が間違っていなければ点灯するはずです。 すみません。ちゃんと全部点灯します。 基本を飛ばしていきなりあれやこれやとやってしまっているのが問題を引き起こしている原因なんでしょうね。 メーター出力部分のプログラムは本当に見やすくてスッキリとしていますよね。恐れ入ります。m(__)m 再度教えて頂いた内容でプログラムを修正して動かしてみます。 また結果はご報告いたします。
- zwi
- ベストアンサー率56% (730/1282)
>よくよく考えたら、これってパルス入力がなければPICには5V(Hi)がかかってるんですよね。 前はパルス入力のところにスイッチ入れてたんでしょうか? それと、この回路のGとS間に抵抗が入ってなくて大丈夫かって気がするんですが、入ってませんでしたか? >LEDのPORTAの点灯の件ですが、教えて頂いていた「C0H」を「03H」に変更したら点灯しましたが、これで正解なのかな? あっ、わかりました。 ビットシフトを忘れてましたね。 MOVF PULSE_COUNT1,W ANDLW C0H ;上位2bitをマスク MOVWF PORTA ;上位2bitをポートAへ。 BCF STATUC,C ;carryをクリア RLF PORTA,F ;carry←bit7,bit7←bit6 RLF PORTA,F ;bit0←carry,carry←bit7 RLF PORTA,F ;bit1←bit0,bit0←carry。これで下位2ビットに値が出ます。 プログラムのほうは、割り込みでレジスタ退避せずにSTATUSやWレジ使っているのはまずいですね。まともに動作するはずがありません。これが原因かも?一番先にWレジやSTATUSを退避してください。 メーターに出すほうの処理は、まだ効率よく書けると思うんですが、時間がないのでまた後で。
補足
zwi様、こんばんは。 >前はパルス入力のところにスイッチ入れてたんでしょうか? >それと、この回路のGとS間に抵抗が入ってなくて大丈夫かって気がするんですが、入ってませんでしたか? そうです。以前の時はパルス入力部分にスイッチを入れて、ボタンを押したら5Vが流れていくって感じにしていました。 あと、GとS間に抵抗ですか??入ってなかったですよ。この回路も別の方に教えて頂いたものなんですが・・・。ちなみに入れる抵抗値は10KΩくらいでいいのでしょうか? PORTAの点灯なんですけれど、プログラムを訂正してみましたがやはり点灯しません。さらに気付いたんですが、PORTCの6と7番のLEDも点灯していませんでした。PIC壊しちゃったかな?(T_T) 割り込みのレジスタ退避はしてたつもりなんですが、これは退避になっていないのでしょうか。 [退避] movwf w_temp movf STATUS, W movwf s_temp [退避解除] swapf s_temp,W movwf STATUS swapf w_temp,F swapf w_temp,W 書籍に掲載されていたものをそのまま利用していたんですが・・・。 メーターに出力する所はまだまだ手直し出来るんですね。私の頭ではこれが現状では限界だったもので。(^^; 処理は時速0km以上9km以下はLEDは点灯せず、10km以上19km以下は10kmのLEDを点灯させようとしていてこんなプログラムにしていました。またお時間がある時で結構ですので教えて下さい。 色々とお世話になり申し訳御座いません。非常に助かります。zwi様にここまでフォローしてもらわないといけないくらいPICって簡単なものではないんですよね。PICを触り出してからあまり時間は経っていませんが痛感しています。この後も引き続きご指導の程宜しくお願い致します。m(__)m
- zwi
- ベストアンサー率56% (730/1282)
>チャタリング処理はしておりませんので確かにきっちりとしたカウントは現在は出来ない状態にあります。 チャタリング込みじゃないと1秒間に10回以上は入力するのは難しいですからね。 >入力部分はFETの部品が入ったりしていてよく解らなかったので、10Kオームの抵抗を-に接続して配線をやりかえました。 SWがオープンの状態のときにプルダウンされている事が必要なので、少し違う心配がありますね。 5V→SW→PIC ↑ 10KΩ ↑ 0V ならOKです。 >LEDの2進表示プログラムを割り込み部分に入れて実際にテストしてみましたが、PORTAの2つのLEDが点灯しません。PORTCは点灯しております。手直し方法が分からないのですいませんが助けて下さい。。。 値が64以上にならないと表示されませんので、試しに4倍して表示してみてください。 >あと、バンク間違いの件ですが、全く気付いてませんでした!(>_<) >けど、オドメーターのプログラムも調べてみたら同じ事をしていたのにどうして作動しているんだろ??それもちょっと気になる所です・・・。 WDTとINT割り込みを使っていないので大丈夫なんだと思います。そういう意味なら不要ですね。
補足
zwi様、こんばんは。 PORTAのSW入力部分なんですが、現状は教えて頂いた通りの図で合っています。 しかし、それまでのFETを接続している状態は、 5V ↓ R(10KΩ) (2SK2493)↓ パルス→R(100KΩ)→G-S-D→PIC ↓ 0V という接続でした。よくよく考えたら、これってパルス入力がなければPICには5V(Hi)がかかってるんですよね。 LEDのPORTAの点灯の件ですが、教えて頂いていた「C0H」を「03H」に変更したら点灯しましたが、これで正解なのかな? この状態で、チャタリングを起こさせながら入力をしたらLEDが1秒毎に点灯位置も変わり表示していました。という事は、カウントは出来ていて、その後のカウント数を比較してLED表示させるソースがおかしいという事になりそうですね。 今度はその辺りのソースをUPしてみます。 WARIKOMI bcf PIR1,TMR1IF bsf STATUS,RP0 bsf PIE1,TMR1IE bcf STATUS,RP0 movlw 00H movwf TMR1L movlw 80H movwf TMR1H movwf w_temp movf STATUS, W movwf s_temp movf PULSE_COUNT1,W movwf PULSE_COUNT2 clrf PULSE_COUNT1 ;-------------------------------------------------- ; 0km movlw D'0' subwf PULSE_COUNT2 btfsc STATUS, Z goto speed_0 btfss STATUS, C goto speed_0 ;10km movlw D'7' subwf PULSE_COUNT2 btfsc STATUS, Z goto speed_10 btfss STATUS, C goto speed_0 ;20km movlw D'7' addwf PULSE_COUNT2,1 movlw D'14' subwf PULSE_COUNT2 btfsc STATUS, Z goto speed_20 btfss STATUS, C goto speed_10 ・・・以下、180kmまで ;----------------------------------------------- ; SPEED-BAR LED OUTPUT ;カウントしたパルスの値に合うスピードバーLEDを点灯させる ;PORTA 0~3,5 → 時速 10km/h ~ 50km/h ;PORTC 2~7 → 時速 60km/h ~ 110km/h ;PORTB 1~7 → 時速120km/h ~ 180km/h に対応 ;----------------------------------------------- speed_0 movlw B'010000' movwf PORTA clrf PORTB clrf PORTC goto OWARI speed_10 movlw B'010001' movwf PORTA clrf PORTB clrf PORTC goto OWARI speed_20 movlw B'010011' movwf PORTA clrf PORTB clrf PORTC goto OWARI ・・・以下180kmまで ;-------------------------------------------------- OWARI swapf s_temp,W movwf STATUS swapf w_temp,F swapf w_temp,W RETFIE こんな感じです。 めちゃくちゃなソースになっているのならゴメンナサイ。 またアドバイスをお願い致します。m(__)m
- zwi
- ベストアンサー率56% (730/1282)
>まず割り込み確認ですが、これも別の方に教えて頂いたチェック方法なんですが、割り込みルーチンの所に下のソースを入力して確認を行いました。 >その割り込み処理は時計やオシロでは計ってはいませんが、見ている限り1秒くらいの周期で動作していました。実際、別に1秒ではなくて0.5秒くらいでも構わないのですが、スピードが上がっていくのに1秒くらいで処理すれば十分だと思って設定しているだけなんです。 1秒周期で点滅していると見えたとすると、割り込み周期は0.5秒かな? 2回の割り込みで1周期ですからね。 >次ですが、擬似パルスというのは車速パルスが約5~6V出ているので、パルス入力端子に電源の5Vを接続して、スイッチを押すと5VがPICへ流れていく様にしているだけで何も作っておりません。 チャタリング処理はしてませんよね?するとONでカウントされる値は不定ですね。それより不安なのは、スイッチOFF時はLOW判定されるようにプルダウン(10Kオーム程度の抵抗を通してーに接続)してますか? >使用しているPIC(16F873A)はオドメーターのプログラムを入れていた試作品を使っておりますので、オドメーターが正常に動いている良品のPICです。 これは問題無しですね。 >LEDの接続回路ですが、現在の試作回路図をフリーソフトを使って描いてみました。・・・けどもしかしてここには画像がUP出来ない!? 文章でうまく説明出来るかな。。。 >RA0~3、5、RB1~7、RC2~7に3.3kΩの抵抗を各々に接続してその後にLEDの+を接続しております。 分かりました、8ビットしか出力しませんので、RA0~1とRC2~7に出力しましょう。 MOVF PULSE_COUNT1,W ANDLW 3FH ;下位6bitをマスク MOVWF PORTC ;下位6bitをポートCへ。 MOVF PULSE_COUNT1,W ANDLW C0H ;上位2bitをマスク MOVWF PORTA ;上位2bitをポートAへ。 で行けると思いますが、アセンブラ書くの久しぶりなので間違っているかも。 それとINAHO_SH4さん向けのに書いてある bcf STATUS, RP0 movlw B'11000000' movwf OPTION_REG は、なんかバンク違ってますが大丈夫ですか?
補足
zwi様、こんばんは。 チャタリング処理はしておりませんので確かにきっちりとしたカウントは現在は出来ない状態にあります。入力部分はFETの部品が入ったりしていてよく解らなかったので、10Kオームの抵抗を-に接続して配線をやりかえました。LEDの2進表示プログラムを割り込み部分に入れて実際にテストしてみましたが、PORTAの2つのLEDが点灯しません。PORTCは点灯しております。手直し方法が分からないのですいませんが助けて下さい。。。 あと、バンク間違いの件ですが、全く気付いてませんでした!(>_<) けど、オドメーターのプログラムも調べてみたら同じ事をしていたのにどうして作動しているんだろ??それもちょっと気になる所です・・・。
- zwi
- ベストアンサー率56% (730/1282)
>先の方にご相談をしておりまして、少し回答が重複するかも知れませんが、1秒で割り込みがかかるかテストは行って、結果は正常に作動しております。 これはLEDの点滅等で実際に確認されましたか?周期が正しいことは、時計やオシロ等で確認されていますか? >しかし、パルス(まだ現状では擬似パルス)を入力するプログラムで走らせると割り込みがうまくかかりません。 擬似パルスは、別のPIC等で生成してポートから入力された物ですか?それとも1つのPIC内でプログラムで生成しましたか? >車速パルスは1秒で最大約130パルスのカウント入力(時速180km/h)になるので、255は越えないと思われます。 それなら問題ないですね。 >あと、同じ型番のPICでオドメーターを製作し、そこに車速パルスを入力させてPICがパルスカウントをしているので、入力部分のハードをこの回路にも使用しております。でもこれは実際に車両と接続してからの話なので、現在の試作回路上では問題ないとは言えないですよね。 オドメーターが正常に動作しているPICで走らせていると理解して良いですか? >zwi様からのアドバイスの(2)をテストしたいのですが、LEDで2進表示させるプログラムの流れを簡単で結構ですので教えて頂けませんでしょうか。(すいません、まだ独自でちゃんと組めないので・・・)宜しくお願い致します。 カウント値をそのまま、LEDのポートに送るだけです。 LEDがPICに接続している回路が不明なので、もう少し情報をください。
補足
zwi様 こんばんは。 ご質問の回答です。 まず割り込み確認ですが、これも別の方に教えて頂いたチェック方法なんですが、割り込みルーチンの所に下のソースを入力して確認を行いました。 BTFSS PORTA,0 GOTO $+3 BCF PORTA,0 GOTO OWARI (割り込み終了処理) BSF PORTA,0 GOTO OWARI (割り込み終了処理) 恐らくzwi様なら何をしているのかすぐ解ると思いますが、TMR1で割り込みが発生した時、PORTAの0番ピンに接続しているLEDが1(点灯)しているならば0(消灯)にして割り込みルーチンからメインルーチンへ戻り、次の割り込み発生時にPORTAの0番ピンが0(消灯)しているならば1(点灯)にしてまたメインルーチンに戻る、といったテスト方法です。 その割り込み処理は時計やオシロでは計ってはいませんが、見ている限り1秒くらいの周期で動作していました。実際、別に1秒ではなくて0.5秒くらいでも構わないのですが、スピードが上がっていくのに1秒くらいで処理すれば十分だと思って設定しているだけなんです。 次ですが、擬似パルスというのは車速パルスが約5~6V出ているので、パルス入力端子に電源の5Vを接続して、スイッチを押すと5VがPICへ流れていく様にしているだけで何も作っておりません。 使用しているPIC(16F873A)はオドメーターのプログラムを入れていた試作品を使っておりますので、オドメーターが正常に動いている良品のPICです。 LEDの接続回路ですが、現在の試作回路図をフリーソフトを使って描いてみました。・・・けどもしかしてここには画像がUP出来ない!? 文章でうまく説明出来るかな。。。 RA0~3、5、RB1~7、RC2~7に3.3kΩの抵抗を各々に接続してその後にLEDの+を接続しております。RA4はパルス入力、RB0は時速100km/hが出ているフラグ出力用にしています。RC0とRC1には32.768KHzのTMR1クリスタルを30pFのコンデンサーX2で接続しています。 これで確認出来ますでしょうか。 まだ不足等ありましたらご連絡をお願い致します。 以上、お手数をお掛けいたしますが宜しくお願い致します。
- INAHO_SH4
- ベストアンサー率52% (10/19)
メインに書いている分には問題ないです。 但しこの処理は割り込みルーチン内には書かないでくださいね。 さてさて,1秒経っても割り込みが掛からないという点ですが・・・ 1.この処理の前にちゃんと割り込みを許可していますか? 2.割り込みの設定は正しく設定していますか?マスクの設定等は大丈夫ですか? 3.割り込み処理でワークレジスタ,ステータスレジスタはちゃんと退避・復旧をしていますか?(←今回は薄いかな) 4.割り込み復旧時にちゃんと割り込み要因フラグをリセットしてますか? この辺も確認して見てください。 この処理であれば,PORTAの状態で分岐している(ワークやステータスの状態で処理してない)ので可能性は薄いかもしれませんが,ワークの退避も一応試してみてください。 多分,話の流れ的にまだシミュレーター上かと思いますのでハードの使い方による物ではないと思います。 あと,シミュレーターをアニメーション(1ステップずつ実行していくさまを見ている状態)で実行すると1秒はとてつもなく長い時間になります。 その辺の注意してください。 A No4 の zwi さんがおっしゃるとおり,部分的に動作を確認するのが近道&基本です。 まずは正常に動作する部分と,うまく動かない部分を切り分けましょう。
お礼
INAHO_SH4様 1ヶ月くらい前にお世話になったjza70_kaiです。 本日、どうにかこうにか今回の製作回路が完成に至りましたのでご報告をさせて頂きました。 基本を飛ばしていきなり本題に入ってしまっていたのが今回の反省点であり、今後は先に細かな事を調べて本題に入っていきたいと思います。 色々とアドバイスを頂き、本当に有難う御座いました。 また別の件でお世話になるかも知れませんが、その時も変わらず助けて頂けます様宜しくお願い致します。m(__)m それでは失礼致します。
補足
INAHO_SH4 様 こんばんは。お忙しい中回答有難う御座います。 初期設定なんですが、色んな方のプログラムを参考にしながら手探り状態で組んでいるのでもしかしたらここかもしれないですね。現状のソースをUPしてみますのでこちらも一度見て頂いてご意見を頂けないでしょうか。 start movlw B'00000000' movwf INTCON clrf ADCON0 bsf STATUS, RP0 movlw 07H movwf ADCON1 bsf PIE1,TMR1IE movlw B'010000' movwf TRISA clrf TRISB movlw B'00000011' movwf TRISC bcf STATUS, RP0 movlw B'11000000' movwf OPTION_REG movlw B'11000000' movwf INTCON movlw B'00001010' movwf T1CON movlw 00H movwf TMR1L movlw 80H movwf TMR1H movlw B'010000' movwf PORTA clrf PORTB clrf PORTC clrf PULSE_COUNT1 clrf PULSE_COUNT2 bsf INTCON,PEIE bsf INTCON,GIE bsf T1CON,TMR1ON ちなみにお伝えしてなかったかも知れませんが現在使用しているPICは16F873A、クロックは20MHz、TMR1には32.768KHzを使用しております。宜しくお願い致します。
- zwi
- ベストアンサー率56% (730/1282)
なにかだいぶ前に回答した気がするzwiです。 見てみましたが、プログラム的には割り込みは邪魔してませんので問題ありません。 問題があるとしたら次のようなことが考えられます。 (1)割り込み側の処理でレジスタ退避がちゃんと行われていない。 そのため動作が不安定になっている。 (2)カウントが8ビットで足りていない。車速パルスが1秒間に255以上になっている。 (3)割り込み処理時に、車速パルスのカウンタがクリアされていないために、カウントが累積されていっているため表示がおかしい。 (4)パルスのレベルが高すぎるか低すぎて、常にPORTAの4ビット目1か0となってしまっている。そのためカウントされない。 まだ思いつかない原因が他にもあるかも知れません。 なのでテストの方法です。 (1)PORTAのビットを見ずにカウントアップだけをさせた場合でも、割り込みはちゃんと動きませんか? (2)割り込みでLEDを処理せず、パルスをカウントアップしていることをカウント値をLEDに2進表示させて確認する。 (3)パルスの信頼性が低いならパルス発信機かもう一個のPICを使ってパルスを発生させて、パルスカウントの試験をする。
補足
zwi 様 こんばんは。ご回答有難う御座います。 確か以前に別の件でお世話になった記憶が御座います。この度も目を止めて頂いてコメントを頂き、感謝いたします。 先の方にご相談をしておりまして、少し回答が重複するかも知れませんが、1秒で割り込みがかかるかテストは行って、結果は正常に作動しております。しかし、パルス(まだ現状では擬似パルス)を入力するプログラムで走らせると割り込みがうまくかかりません。 車速パルスは1秒で最大約130パルスのカウント入力(時速180km/h)になるので、255は越えないと思われます。 あと、同じ型番のPICでオドメーターを製作し、そこに車速パルスを入力させてPICがパルスカウントをしているので、入力部分のハードをこの回路にも使用しております。でもこれは実際に車両と接続してからの話なので、現在の試作回路上では問題ないとは言えないですよね。 zwi様からのアドバイスの(2)をテストしたいのですが、LEDで2進表示させるプログラムの流れを簡単で結構ですので教えて頂けませんでしょうか。(すいません、まだ独自でちゃんと組めないので・・・) 宜しくお願い致します。
- INAHO_SH4
- ベストアンサー率52% (10/19)
あぁ・・・ やっと理解できた。 今見ているのはPCLと言うアドレスカウンターの下位8ビットです。 そのレジスターを覗くウインドウは指定したラベルの数値をアドレスとして扱うため,Zには2が設定されている(Bit2だからね)ので「アドレスが」2の場所と思ってそのレジスターの値を見ています。 アドレスが02HのレジスターはPCLなのでプログラムが1ステップ進むたびに 1カウント上がっていきます。 まずは,STATUSを指定してみてください。 演算のたびに乱数のように数値が変わるはずです。 後は表示のタイプを2進数表示にして右から3つ目を見れば演算結果に沿って変化するはずです。
補足
INAHO_SH4 様 こんにちは。ご回答有難う御座います。 私が現在使用しているのは「MPLAB IDE v7.00」というものです。 ZフラグではなくSTATUSフラグの8bitで見たら確かに0と1だけで表示されていました。私の勘違いでしたね。すいません・・・。 あともしお願い出来るのであればご相談があるのですが、現在車で使用するものを製作していて、時速10km単位でLEDを点灯させ、計18個のLEDをバーグラフ状に表示させるものを作ろうとしております。 TMR1で1秒をカウントして、その間に入力される車速パルスをカウントし、割り込みが入ったらその値を比較してLEDを点灯するという流れなんですが、入力されているパルスが1秒を超えても割り込みがかからなくて、パルス入力を止めたらそこから約1秒して割り込みがかかっている感じなんです。 P_IN ;パルス入力 BTFSS PORTA,4 ;PORTA,4が1のとき次の命令スキップ GOTO P_IN ;P-INへ戻る INCF PULSE_COUNT1 ;PORTA,4が1なのでカウントを1加算 BTFSC PORTA,4 ;PORTA,4が0なら次の命令スキップ GOTO $-1 ;1個前に戻る GOTO P-IN ここはメインルーチンのパルス入力部分なのですが、何か割り込み処理にいたずらをする様なものがあるでしょうか。もしよろしければご回答をお願い致します。
- INAHO_SH4
- ベストアンサー率52% (10/19)
う~ん,少し見えてきたかな・・・ その前に訂正。 ZフラグはBit3ではなくBit2です。ごめんなさい。 では本題。 デバックツールというのはMPLABのことでしょうか? もしそうであれば,まだどこのレジスターを覗いているのか良くわからないのですが,Zフラグを見たいのであれば,覗くレジスターは「STATUS」です。 2進数で覗き,右から3つ目がZフラグです。 演算結果がゼロであれば演算の直後に1に,そうでなければ0になるはずです。 あと,わざわざ見なくても確か同じウィンドウの中にあるタブにステータスレジスターを見れるタブがあったか,MPLABのウィンドウの下のステータスバーに今のフラグの状態が表示された思います。 あくまでZフラグはSTATUSレジスターの中のビットの一つです。 当然1Bitしかないので2や3は表現できません。 ・・・なんだろう?回数のカウントかなんかが見えてるのかな?
- INAHO_SH4
- ベストアンサー率52% (10/19)
数値が1ずつ増えるの意味がわかりませんが・・・ とりあえず説明すると,STARUSレジスタはZ80(Z80使ったこと無かったらごめんなさい)で言うところのFレジスターにあたります。 STATUSレジスターは8Bitあるレジスターの各ビットに意味をもたせてあります。 Bit0はC(キャリー),Bit1はDC(デジットキャリー),Bit3はZ(ゼロ)・・・ といった具合です。 ですので,結果がゼロかどうかを確認する場合はSTATUSのBit3の状態を見ればいいわけです。 比較をしたい場合は・・・ movlw [比較の基準] subwf [比較したい値の入ったファイルレジスタ] btfsc STATUS, Z goto [一致していた場合の処理] ~以下一致していない場合の処理~ と言うふうに書きます。 btfscをbtfssにすると「一致していた場合」と「一致していない場合」が逆になります。 STATUSやZは最初に書くおまじないの「~.inc」の中でビットやアドレスを定義してくれているので,書くだけで「STATUSレジスター(address:03h)のZフラグ(bit:3)」と言うふうにアセンブラが読み替えてくれます。 こんなもんでどんなもんでしょう?
補足
INAHO_SH4 様 早速のご回答有難う御座います。 数値が1ずつ増えるというのは、PICプログラムツールのデバッグモードでZフラグの数値の変化を見ていたんですが、デバッグ開始時(プログラムがスタートする時)は「0x00」となっているのですが、次の行に命令が移動すると「0x01」に、また次の行に命令が移動すると「0x02」という感じで数値がアップしていくんです。(これでうまく伝わるかな?) 例えば、下の様なプログラムがあるとします。 プログラム開始行 clrf PORTA Zフラグの値:0x00 clrf PORTB ” :0x01 clrf PORTC ” :0x02 clrf PO_A ” :0x03 clrf PO_B ” :0x04 clrf PO_C ” :0x05 こんな感じで、プログラムが進むと同時にZフラグの数字も増えていくんです。 もう少し補足説明が必要でしたら言ってもらえますか。うまく説明が出来ていないかもしれなくてすいません。宜しくお願い致します。
関連するQ&A
- PIC(MOVFで何故、STATUS Zフラグが変わるのか)
こんにちは。 PICマイコンで割り込みをやる場合、 MOVFはSTATUSのZフラグに影響を与えるので、 使わない、とありますが、 何故、MOVFでZフラグに影響を与えるのか、 どういう影響を与えるのか分かりません。 割り込みを使わなくても、STATUS<Z>を 条件判断に使っている限り、 MOVFは使えないのでしょうか。 また、 本によっては、 (割り込みのはじめ) MOVWF W_TEMP MOVF STATUS,W(*) MOVWF ST_TEMP ~割り込みの内容 MOVF ST_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W (割り込み終わり) のように書いてあり、 この場合、*で、 STATUSのコピー前(同時)に、 MOVFを使っていますが、 これは、OKなのでしょうか。 何か分かる人がいましたら、 よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- PIC18FのSTATUS
PIC18FのSTATUSレジスタ(N,OV,Z,DC,C)の内Z,DC,Cは16Fと同じだと思いますがN,OVが部分的にわかりません OV:7ビット越えのオーバーフローフラグということですが8ビットオーバーすればC=1と思いますがなぜ7ビットなのでしょう? どういった時に使えるものなのでしょうか?(符号付とは?) N:演算の負フラグ 16Fの時はCで兼用だったのが分離したものだと思いますが、実際にマイナスになると=1になります。が足して7ビット越えした状態でも=1になっていますがそういうものなのでしょうか?
- ベストアンサー
- その他(プログラミング・開発)
- PICのプログラミングについて
PICのSTATUSレジスタのz〔ゼロ〕フラグとC〔キャリー〕が同時に1になることはあるのでしょうか?以下のようなときのことなのですが・・・ movlw b'00000001' sublw b'00000001' このような時のZフラグとCフラグはどうなるのでしょう? PIC活用書等を読んでみたのですが、あまりわかりませんでした。 初心者な質問ですが宜しくお願いします。
- 締切済み
- その他(プログラミング・開発)
- 組み込みプログラマ
制御系(マイコン)のプログラマに就職が決まった大学生です。 現在、アセンブラの勉強をしています。 今まで、Z80、PICの経験があります。 しかし、C言語で組み込み系のプログラムを書いたことはありません。 そこで、実際に組み込み系で働いておられる方に質問があります。 1.現在のマイコンではC言語が主流ですか? 2.アセンブラだけでは食っていけませんか? 3.組み込み系は寿命が長いと聞いたことがあるのですが、 本当でしょうか?
- ベストアンサー
- その他(プログラミング・開発)
- PICで小数点の演算
PIC16F877Aを使ってプログラムを作っています。その内容がセンサー(例えば温度センサー等)から取り入れた電圧をPICのA/D変換(10bit)を行って、その値を使ってpicで計算し、その結果を液晶に表示するといった内容なのですが、その計算過程で小数を扱わなければならないのですが、その計算がうまくいきません。A/D変換後の値をxとし具体的に式で書くと、 v = x * 5 / 1023 ・・・(1) ここでvはセンサーから取り込んだ電圧値(値の範囲は0.935~1.748)です。 y = 218.5 - v / 0.008 ・・・(2) 又は y = 218.5 - 125 * v ・・・(3) 上記の式はA/D変換後の値xを一度アナログ電圧値vに変換し(1)、そこから(2)又は(3)へ代入して得たい情報yを算出するといった少々面倒なものなのですが、これをアセンブラで書きたいのですが、このPICには乗除命令がないことや小数点の演算方法、16bitの乗除等の部分が引っかかってどうもうまくかけません。小数部分は固定小数点形式で考えて最終的にyは少数第二位を四捨五入したいと思っています。 どのようにプログラムを作ればよいのでしょうか。実際にソースを書いていただけると大変理解しやすいです。
- ベストアンサー
- その他(プログラミング・開発)
- PICマイコン MPLABアセンブラで小数点の累…
PICマイコン MPLABアセンブラで小数点の累乗(べき乗) n^-0.9067の計算をMPLABのアセンブラでやりたいのですが 記述、計算方法がわかりません。 わからない点 ・四則計算だけでできるのか ・小数点を整数の変換して計算可能か ・負の値を気にせず(正の数)計算できるか 一番知りたいのは四則計算だけで計算できるかです。 これができるとある程度正確な結果が得られるので ご教授よろしくお願い致します。
- 締切済み
- 電気設計
- 【PICマイコン】一般製品にPICシリーズが使われてるって本当ですか?
最近PICをはじめて大分アセンブラもなれてきて楽しめるようになってきました。 それで教えてGOOで色々見てるときにPICシリーズのマイコンは一般製品の中にも組み込まれているって書いてあったんですが本当ですか? 僕の中でPICやAVR等はそれなりにコアな趣味を持つ人たちのおもちゃ的な物だと思ってました。 もし本当に入ってるんだったら具体的にどんな製品にどのマイコン(例PIC16F877A等)が使われてるのか教えてください。凄く興味があります。 また、何処のサイトだったか忘れましたが「これからマイコンをはじめるならAVR!PICをやるメリットなし!」ぐらいの勢いで書いてあったんですがその通りなんでしょうか? もひとつ、、PICの勉強をはじめるときにアセンブラかCかで迷ったんですがアセンブラではじめた方がCPUの構造をより理解しやすいとの事でアセンブラで進めてきたんですが、いまいちその実感がわきません。具体的にどういう所でCPUの構造を理解しやすいのでしょうか? それっぽいなぁと思うのはクロックでタイミングを与え、そのタイミング毎に命令を実行しレジスタのBITで条件判断をしたり計算をしたりしてポートに出力する的な部分でしょうか?そもそもCPUの構造ってどういう事なんでしょうか?何て言うか例えて言うならエクセルは仕事で使うから詳しいけどWindowsの設定は全然解りませんみたいな感じです。 よろしくお願いしますm(_)m
- ベストアンサー
- その他(プログラミング・開発)
- エクセル(Excel)の計算結果を行番号に反映させるには?
エクセルのセル表記についてのご質問です。 計算結果をセルの表記に反映させたいと思っています。 例1: A1の計算結果が『2』 B1の計算結果が『3』 この場合は、C5(2+3=5)に、Z5からの値を代入する 例2: A1の計算結果が『10』 B1の計算結果が『15』 この場合は、C25(10+15=25)に、Z25からの値を代入する =$Z$(A1+B1) =$Z$[A1+B1] =$Z$'A1+B1' 上記のようなイメージです。 どなたか、お教えいただけると幸いです。 よろしくお願い致します。
- 締切済み
- その他(業務ソフトウェア)
- PIC/「Label」に対応するアドレス重複
PICのプログラムを学んでおります。 Include fileの中の「pic16f84a.inc」を見ると、下記のように「Label」に対応するアドレスが重複しているものがあります。 ある特定の「Label」には特定のアドレスが一つ与えられるのだとばかり理解していたので、このように重複していて、さっぱり混乱しています。 これはどのように理解したらよいのでしょうか? よろしくお願いいたします。 -------------------- // Register: TMR0 TMR0 equ 0001h // Register: PCL PCL equ 0002h // Register: STATUS STATUS equ 0003h // bitfield definitions STATUS_C_POSN equ 0000h STATUS_C_POSITION equ 0000h STATUS_C_SIZE equ 0001h STATUS_C_LENGTH equ 0001h STATUS_C_MASK equ 0001h STATUS_DC_POSN equ 0001h STATUS_DC_POSITION equ 0001h STATUS_DC_SIZE equ 0001h STATUS_DC_LENGTH equ 0001h STATUS_DC_MASK equ 0002h STATUS_Z_POSN equ 0002h STATUS_Z_POSITION equ 0002h STATUS_Z_SIZE equ 0001h STATUS_Z_LENGTH equ 0001h ---------------------------
- ベストアンサー
- その他(プログラミング・開発)
- PICマイコンをアセンブラでAD変換をした時に、、
現在PICマイコンの16f88を用いてアセンブラでAD変換の勉強をしています。とりあえずいろいろなサイトやデータシートを見てAD変換した結果をPORTBに出力させるテスト用のプログラムを完成させたのですが、AD変換の結果を格納するADRESLのデータをうまく読み込むことができませんでした。その時のプログラムは(結果は左詰め,X_Lは自分で定義した変数) BSF STATUS,RP0 MOVF ADRESL,W MOVWF X_L ;ADRESLの結果をX_Lに保存 BCF STATUS,RP0 MOVF X_L,W MOVWF PORTB こんな感じです。わざわざADRESLの結果をX_Lに保存しなくても直接出力することもできるんですが気にしないで下さい。で、このプログラムだとPORTBにつないだ全てのLEDが点灯します。 ところがプログラムを以下の様に書き変えたら見事にADRESLレジスタの中身が出力できました。何が起きたのでしょうか?バンクの切り替えの前にWレジスタをX_Lレジスタに書き込むのと、バンクを切り替えてからWレジスタをX_Lレジスタに書き込むのとでは結果が同じになると思うのですが、、、。 BSF STATUS,RP0 MOVF ADRESL,W BCF STATUS,RP0 MOVWF X_L MOVF X_L,W MOVWF PORTB
- ベストアンサー
- その他(プログラミング・開発)
お礼
zwi様 こんばんは。ご無沙汰しております。 本日、最終調整も行い、ほぼ思った感じでLEDの点灯が出来る様になったので、これで完成にしたいと思います。 この後は実際にこの回路や前回のオドメーター回路と共にオリジナルメーターの製作に入りたいと思います。 この度はとても長い間助けて頂いて本当に有難う御座いました。m(__)m また別のものを作る時に助けて頂く事もあるかも知れませんが、その時も変わらずアドバイスを頂けます様宜しくお願い致します。 簡単ですが、御礼の挨拶に代えさせて頂きます。 それでは。