• 締切済み

PICのプログラミングについて

PICのSTATUSレジスタのz〔ゼロ〕フラグとC〔キャリー〕が同時に1になることはあるのでしょうか?以下のようなときのことなのですが・・・ movlw b'00000001' sublw b'00000001' このような時のZフラグとCフラグはどうなるのでしょう? PIC活用書等を読んでみたのですが、あまりわかりませんでした。 初心者な質問ですが宜しくお願いします。

みんなの回答

  • KOH_da
  • ベストアンサー率31% (161/506)
回答No.2

PIC16F84A+ADXL202+WonderSwanをフライパンに取り付け、 炒飯を作るゲームを作っています(^^;)。 >z〔ゼロ〕フラグとC〔キャリー〕が >同時に1になることはあるのでしょうか? 普通はないと思います。 あるとすれば、フラグを意味するワークへのストア。 >movlw b'00000001' >sublw b'00000001' の結果は、Z=1, C=0だと思います。 Cは引き算で足りなかったときに1だと思いますが...。

  • atari
  • ベストアンサー率40% (4/10)
回答No.1

手元にあるPIC16F84の命令表によると, ZとCが同時に変化する可能性のある命令は  ADDLW  ADDWF  SUBLW  SUBWF と書かれています. 参考URLから,お使いのPICのデータシートをダウンロードしておくと 良いと思います.

参考URL:
http://www.microchip.co.jp/

関連するQ&A

  • 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 アセンブラ TMR0の使い方がいまいちわかりません。

    *文字数制限の為コメントや繰り返し処理プログラムの一部を省きました。解りにくくてすみません。ココに載せてくれとかあったらそっちに全部載せます。 目標としてはPICでデジタル時計を作りたいのですが、手始めに正確な1秒を作って7セグを0から9まで表示しそれを繰り返す。と言うものをやってみようと思いプログラムしましたがウンともスンとも言いません。 流れとしては 初期処理 ↓ TMR0割り込みが発生するまで無限ループ ↓ 割り込みが発生したら割り込み回数をカウントし(12,8MHzクロック、プリスケーラを256設定で1250回フラグをカウントすると1秒)1秒間分カウントが終わったら7セグの表示を切り替え無限ループに戻る どの数字まで表示したかは任意のレジスタに1を立てて判断する。PICはPIC16F628AなのでTMR1とかもあるんですが気分的にTMR0だけで時間を作ってみたかったのでTMR1とかは使ってません。で、3回くらいやり直してプログラムを作ったんですが全然動きません。 1、何処が悪いんでしょうか? 2、また、PIC16F628Aでは16番ピンがクロックの入力として使えますが その設定方法があってるかわかりません。 コンフィグ設定で OSCをHSにしてポートの設定でRA7を入力にしておけば良いんでしょうか?プログラム中の記述で合ってますでしょうか? 3,7セグをカウントアップするだけのプログラムなのに こんなに長くなる物なんですか? (プログラムが下手だから?アセンブラだから?) 4、1秒のカウント方法ですがプログラム中の記述で正確に1秒をカウントしてますか?(計算間違ってますでしょうか?) 以下、プログラムになります。 list p=pic16f628a include "p16f628a.inc" __CONFIG _LVP_OFF &_MCLRE_ON &_BODEN_OFF &_PWRTE_ON &_WDT_OFF &_HS_OSC time0 equ d'30' ;time4まで作る tcount equ d'43' count0 equ d'35' ;count7まで作る koko0 equ d'43' koko1 equ d'44' org 0 goto start org 4 goto wari start bcf intcon,gie movlw b'00000111' movwf cmcon bsf status,rp0 movlw b'00000111' movwf option_reg movlw b'10100000' movwf trisa clrf trisb bcf status,rp0 bcf status,z bcf intcon,t0if movlw b'00001000' movwf count0 ;この間に1から6の同じ処理が入ります。 movlw b'00000000' movwf count7 time movlw .30 movwf time0 bsf intcon,gie bsf intcon,t0ie clrf tmr0 roop btfsc tcount,0 call segout swapf count0,0 movwf portb swapf portb,0 movwf count0 ;この間に1から5が入ります swapf count6,0 movwf portb swapf portb,0 movwf count6 goto roop wari bcf intcon,t0ie bcf intcon,t0if incf time0,1 btfss status,z goto modori bcf status,z movlw .255 movwf time0 incf time1,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 incf time2,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 movlw .255 movwf time2 incf time3,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 movlw .255 movwf time2 movlw .255 movwf time3 incf time4,1 bcf status,z goto modori bcf status,z movlw .30 movwf time0 movlw b'00000001' movwf tcount modori bsf intcon,t0ie retfie segout clrf tcount btfss koko0,0 goto seg1 ;この中間にseg2からseg6が入ります。 btfss koko0,7 goto seg8 btfss koko1,0 goto seg9 nop goto seg0 seg1 bsfkoko0,0 movlw b'00000010' movwf count0 movlw b'00000100' movwf count1 movlw b'00000000' movwf count2 movlw b'00000000' movwf count3 movlw b'00000000' movwf count4 movlw b'00000000' movwf count5 movlw b'00000000' movwf count6 movlw b'00000000' movwf count7 nop return ;この中間にseg2からseg9が入ります seg0 clrf koko1 clf koko0 movlw b'00001000' movwf count0 movlw b'00000100' movwf count1 movlw b'00000010' movwf count2 movlw b'00000001' movwf count3 movlw b'10000000' movwf count4 movlw b'01000000' movwf count5 movlw b'00000000' movwf count6 movlw b'00000000' movwf count7 return end

  • PIC 簡単なプログラミングで行き詰まりました

    PIC初心者です。よろしくお願いします。 PIC16F84Aを使って 「ポートA 0bIt 」 に入力があったとき(1になったとき) ラベルの「OPEN」に飛びポートBのLEDが一秒点灯。 「ポートA 1bit 」に入力があったとき ラベルの「CLOSE」に飛びポートBのLEDが一秒点灯。 これだけのプログラムなのですが MPLAB IDE v8.63で Debug all すると ;の記述のところで表記のエラーが出ます。 プログラムはこちらです。 list P=pic16f84a include "p16f84a.inc" __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF CNT1     EQU   0CH CNT2    EQU   0DH CNT3     EQU  0EH       ORG    0      GOTO    MAIN           MAIN      BSF    STATUS,RP0      MOVWF    TRISA      CLRF    TRISB      BCF    STATUS,RP0      CLRF    PORTB      CLRW LOOP      BTFSC    PORTA,0      GOTO   OPEN      BTFSC   PORTA,1      GOTO    CLOSE     ;ここで「Symbol not previously defined (CLOSE)」 のエラー                        GOTO    LOOP OPEN      MOVLW    010H      MOVWF    PORTB      CALL   TIMER3    ;ここでSymbol not previously defined (TIMER3)エラー                             CLRF    PORTB      END CLOSE   MOVLW    020H      MOVWF    PORTB      CALL   TIMER3      CLRF   PORTB      END TIMER1     MOVLW    D'62'       MOVWF    CNT1 LOOP1     NOP       DECFSZ    CNT1,1       LOOP1       RETURN TIMER2     MOVLW    D'100'       MOVWF    CNT2 LOOP2     NOP       CALL    TIMER1       DECFSZ    CNT2,1       goto     LOOP2       RETURN TIMER3     MOVLW    D'100'       MOVWF    CNT3 LOOP3     NOP       CALL    TIMER2       DECFSZ    CNT3,1       goto     LOOP3       RETURN      END 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。

  • PIC16F88 STATUS,Cが認識しない原因

    はじめて質問させていただきます。 PIC16F88を使用しており、以下の点でつまづいております。 色々調べましたが原因がわからず、こちらに質問させていただきました。 「MPLABIDE(v8.92)」を使用して、STATUS,Cをbtfss判定させているのですが 「MPLABSIM」では、条件により正しく分岐できているのですが プログラムを書き込むと、STATUS,Cを認識して判定してくれません。 STATUSの代わりに、作業用レジスタのBIT_0に1,0を書き込むと 正しく判定してくれますので、STATUSを認識していない様に思います。 コードは次の様に作成しています。 movlw D'05'   ;TEST用 movwf AD0_RES; ” bcf  FLAG,BIT_7  movlw D'10' subwf AD0_RES,W ; btfss  STATUS,C ;設定以下? bsf  FLAG,BIT_7   ;FLAG_SET btfss FLAG,BIT_7   ;FLAG判定補足 goto  LED点灯へ LED消灯動作  STATUS、Cが認識出来ない原因が分かる方、お知恵をお貸しいただけますでしょうか。 以上、よろしくお願いいたします。

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

  • PIC12F683 AD変換について

    PIC12F683のアセンブラの設定についてご教授ください。 以下のように設定したところGP4ピンにてAD変換できませんでした。 init MOVLW   07h MOVWF   CMCON0 BSF     STATUS,RP0 MOVLW   b'00111000' MOVWF   TRISIO MOVLW   070h MOVWF   OSCCON MOVLW   018h MOVWF   ANSEL BCF     STATUS,RP0 MOVLW   b'10001101' MOVWF   ADCON0 「MOVLW 018h」の行を削除すると問題なくAD変換動作します。 しかしその場合「ANSEL」に070hが入るのでGP4がデジタル 入出力になり動作しない用に感じますが、なぜか動作します。 動作するので問題はないのですが、なぜかすっきりしません。 原因が分る方がおられましたら教えていただけますでしょうか? .

  • PICについて

    今PICでの電子工作をやり始めた初心者なのですが、 急にプログラムを書き込んでもLEDが光らなくなりました。 回路などはまったくいじってないです。 プログラムは基本的なプログラムです。 テキストに沿ってやっているので。 LIST P=PIC16F84A INCLUDE P16F84A.INC __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF BSF STATUS, RP0 CLRF TRISA CLRF TRISB BCF STATUS, RP0 MOVLW B'00001111' MOVWF PORTB LOOP GOTO LOOP END プログラムに間違いはないと思います。 きちんとアセンブルもされておりますので。 アセンブルにはMPLAB IDEを使っています。 原因をさぐってみてもわからなかったのですが、 レジスタの値を確認してみたところ、 アドレスが0006のところの値がすべて00となっておりテキストと違う値となっておりました。 これが原因かなと思うのですが、これはうまくアセンブルされていないということでしょうか? アセンブルした結果は次の通りです。ちゃんと成功しているみたいです。 ですが、きちんとLEDが点灯していたときと比べてやたらとWarningの文字が多いような気がします。 初心者でもわかりやすいようにわかる方がいましたらどなたか教えてください。 よろしくお願いします。 Clean: Deleting intermediary and output files. Clean: Deleted file "STEP10.err". Clean: Deleted file "C:\PIC_program\STEP10.cod". Clean: Deleted file "C:\PIC_program\STEP10.hex". Clean: Deleted file "STEP10.lst". Clean: Done. Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F84A "STEP10.asm" /l"STEP10.lst" /e"STEP10.err" Warning[205] C:\PIC_PROGRAM\STEP10.ASM 1 : Found directive in column 1. (LIST) Warning[205] C:\PIC_PROGRAM\STEP10.ASM 2 : Found directive in column 1. (INCLUDE) Warning[205] C:\PIC_PROGRAM\STEP10.ASM 4 : Found directive in column 1. (__CONFIG) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 6 : Found opcode in column 1. (BSF) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 7 : Found opcode in column 1. (CLRF) Message[302] C:\PIC_PROGRAM\STEP10.ASM 7 : Register in operand not in bank 0. Ensure that bank bits are correct. Warning[203] C:\PIC_PROGRAM\STEP10.ASM 8 : Found opcode in column 1. (CLRF) Message[302] C:\PIC_PROGRAM\STEP10.ASM 8 : Register in operand not in bank 0. Ensure that bank bits are correct. Warning[203] C:\PIC_PROGRAM\STEP10.ASM 9 : Found opcode in column 1. (BCF) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 11 : Found opcode in column 1. (MOVLW) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 12 : Found opcode in column 1. (MOVWF) Loaded C:\PIC_program\STEP10.COD. BUILD SUCCEEDED: Sat Nov 20 19:57:55 2010

  • PIC16F877について

    PIC16F877を使っているのですがBポートとCポートの中でマイクロスイッチの入力ができるポートとできないポートがありますコフィングの問題だとおもいますが原因がわかりません __CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF ;__CONFIG _HS_OSC & _RC_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF ORG 0 ; リセットベクタ(0番地)を指定する GPR_1 EQU 020h ; GPRの1バイト目にGPR_1と言う名前を付ける 88移行 GPR_2 EQU 021h ; GPRの2バイト目にGPR_2と言う名前を付ける 88移行 GPR_3 EQU 022h ; GPRの3バイト目にGPR_3と言う名前を付ける 88移行 GPR_4 EQU 023h ; GPRの4バイト目にGPR_4と言う名前を付ける 88移行 GPR_5 EQU 024h ; GPRの5バイト目にGPR_5と言う名前を付ける 88移行 GPR_6 EQU 025h MAIN CLRF PORTA ;初期クリア 0クリア CLRF PORTB ;初期クリア 0クリア CLRF PORTC CLRF PORTD CLRF PORTE BSF STATUS,RP0 ;ファイルレジスタSTATUSのRP0(ビット5)をセット(1)する → バンク1 MOVLW 07H MOVWF ADCON1 MOVLW B'00000000' MOVWF TRISA ; ポートA全出力 MOVLW B'11111111' MOVWF TRISB ; ポートB全入力 MOVLW B'11111111' MOVWF TRISC ; ポートC全入力 MOVLW B'11111111' MOVWF TRISD ; ポートD全入力 MOVLW B'11111111' MOVWF TRISE ; ポートE全入力 BCF STATUS,RP0 ;STATUSのRP0をクリア(0) → バンク0

  • PIC12F683 TMR2の割込がうまくいきませ

    タイトルのPICを使ってTMR2の割込動作を確認しているのですが、割込が全く掛かりません。 TMR2は単独で割込を掛けないで動作することは確認できましたがエラーもあるわけでもなく あれこれやっても解決せず迷走中です。また、割込ルーチンはこれまで動作が確認できたプログラムを埋め込んで使っているので問題はないと思っています。 何方かお助け頂けませんでしょうか。宜しくお願い致します。 ;******************************************* ; PIC初期設定 ;******************************************* START_INI BCF STATUS,RP0    ;BANK【0】 MOVLW 07h MOVWF CMCON0 ;GP0-2はデジタルIO BSF STATUS,RP0    ;BANK【1】 MOVLW B'0000000' MOVWF ANSEL ;A/D変換クロックF/2 デジタルI/O BCF OPTION_REG,7 ;GPIO端子をプルアップ MOVLW B'001000' ;RESET端子有効 MOVWF TRISIO ;GP0,1,2,4,5:OUT GPO3:IN MOVLW B'1000000' ;40h MOVWF OSCCON ;クロック=1MHz ;******************************************* ; TMR2の設定 ;******************************************* BCF STATUS,RP0    ;BANK【0】 MOVLW B'000101' ;ポス=1:1 TMR2=ON プリ=1:4 MOVWF T2CON ; BCF PIR1,TMR2IF    ;Timer2 割込み検出フラグをクリア BSF STATUS,RP0    ;BANK【1】 BSF PIE1,TMR2IE    ;Timer2 有効 MOVLW H'FA' ;250 MOVWF PR2    ;TRM2カウントSET ;******************************************* BCF STATUS,RP0     ;BANK【0】 CLRF TMR2 BSF INTCON,GIE     ;割り込み全体を有効

  • PIC 初歩プログラムについて

    PICの初めてのプログラムを書いたのですがテキストのように動きません。 ORG 0 ; MAIN  BSF STATUS,RP0 MOVLW B'00000000' ;ポートB 出力 MOVWF TRISB ; MOVLW B'00001111' ;ポートA 0,1,2,3入力 MOVWF TRISA ; BCF STATUS,RP0 SW BTFSS PORTA,0 GOTO  LED1 BTFSS PORTA,1 GOTO LED2 GOTO SW LED1 MOVLW B'00000010' MOVWF PORTB GOTO SW LED2 MOVLW B'00000001' MOVWF PORTB GOTO SW END 入力SWを押していないときがHIです。したがって何もしなければSWのループになると思うのですが、LED2に行ってしまいます。BTFSC POARTA,1とすればSWループ状態ですがテキストとは違います。 何かおかしいのでしょうか?

専門家に質問してみよう