PICのテストプログラムでLEDの点灯が同時になってしまう理由は?

このQ&Aのポイント
  • PICのテストプログラムでLEDの点灯が同時になってしまう理由を教えてください。
  • PICのプログラムで予期せずLEDが同時に点灯してしまう問題についてお知恵を拝借したいです。
  • 困っているのですが、PICのテストプログラムを作成したところ、LEDが一斉に点灯してしまいます。どうすれば解決するでしょうか?
回答を見る
  • ベストアンサー

PICのプログラム

PICのテストプログラムを作ったのですが、LEDの点灯が、順々に動くプログラムのはずがすべてのLEDが同時に着いてしまいます。なぜですか???? とても困っています。誰か教えてくれたらありがたいです。 PICは、16F877Aです。 ポートDにLEDがついています。 TITLE "QUARK Test1 PICUN1" LIST p=PIC16F877A __CONFIG _HS_OSC & _CP_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _WRT_OFF & _DEBUG_OFF #INCLUDE "P16F877A.inc" __IDLOCS D'1' matu EQU 020H matu2 EQU 021H matu3 EQU 022H main ORG 0 clrf STATUS clrf INTCON bsf STATUS,RP0 clrf TRISA clrf TRISB clrf TRISC clrf TRISD clrf TRISE clrf STATUS clrf PORTD clrf matu clrf matu2 clrf matu3 mainloop bsf PORTD,2 call matuloop3 bcf PORTD,2 call matuloop3 goto mainloop ;この後にmatuloop1~3が続く。 END よろしくお願いします。

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

  • ベストアンサー
  • take0_0
  • ベストアンサー率46% (370/804)
回答No.3

>そうなのですか。Bankの切り替えをはっきりさせた方がいいんですね。 そういうことではありません。 前回答を詳しく書き直すと・・・ STATUSレジスタには、バンク切り替え以外の機能もありますよね? RP0とRP1以外のビットも、機能を担当しているわけです。 なのに、 clrf STATUS とすると、全て0になりますよね。 データシートをざっと見てみたところ、STATUSのbit 3がWDT、bit 4がSLEEPの切り替えを担当しています。 WDTは最初にOFFしていますから、bit 3を操作しても影響無いと思いますが、bit 4はおそらく影響します。 ということで、STATUSレジスタ全体をクリアするとSLEEP MODEに入ってしまうわけです。 デバッグというのは人間がやるものです。補助ツールはありますが、判断するのは人間。 あなたの意図までは解釈してくれません。 バンク切り替えを忘れていても、「そのバンクのそのレジスタをいじりたいのね」と思って、そのように処理してくれます。 シミュレータで動かしながら、レジスタ値の変化を追っていくのが一番分かりやすいと思います。 シミュレータが使えないのなら、プログラムを1ステップずつ確認していく必要があります。 思い通りの動作をしていれば、RD0のLEDが点灯。そうでなければ何もしないという風に。 ソースコードだけ見ていても、自分の勘違いとかデータシートの読み込み不十分さには気付きません。 私も、12C509にはハードウェアスタックが3段しかないのに気付かず、数日悩んだことがあります。 877は大丈夫だと思いますが、あまりにもcallしすぎてネストが深くなると、引っかかるかもしれません。

seankoba128
質問者

お礼

ありがとうございます。よくわかりました。 やってみたいと思います。

その他の回答 (2)

  • poyo3
  • ベストアンサー率30% (260/857)
回答No.2

call matuloop3の内容は確認してみましたか? 良くありがち(?)かもしれませんがバンクの切替はしっかりしておいたほうが良いかと思います16F877Aは4バンクありますので初期値で設定されている場合でもバンク1を指定する場合はbcf STATUS,RP1 bsf STATUS,RP0 と確実にバンクを設定するほうがよいと思います。 バンクが切り替わっていなくてもアセンブルでエラーは出なかったと思います。

seankoba128
質問者

補足

解答ありがとうございます。 call matuloop3は、デバッグしてあっていたと思います。バンクの切り替えは、デバッグでは、わからないのですか?

  • take0_0
  • ベストアンサー率46% (370/804)
回答No.1

bank 1への切り替えは bsfSTATUS,RP0 としているのに、bank 0への切り替えは clrfSTATUS としていますね。これは少々乱暴です。 他のステータスビットをクリアしても問題無いことを確認しましたか? 特にbit 3,4がまずいでしょうね。WDTはoffになっているようですから、SLEEPになってしまっているのではないでしょうか。 よくわからないのなら余計に、わかっているbitだけ操作しましょう。 2箇所ある clrf STATUS を、 bcf STATUS,RP0 とすれば所望の動作をすると思います。

seankoba128
質問者

お礼

解答ありがとうございます。 そうなのですか。Bankの切り替えをはっきりさせた方がいいんですね。 いろいろと難しいですね。

関連するQ&A

  • PICのスイッチのプログラムについて

    基本的な事なのですが、よろしくお願いします。 以下のアセンブラのソースでPICを作ってみました。プログラムを変えてみたり、回路を変えてみたりしましたが、改善されませんでした。回路の構成は、LED(仮に、A・Bとします)2個、スイッチ1個、PIC、抵抗器など・・・これを交互にスイッチのオンオフで切り替える。としています。現状の問題点は、スイッチ入力で、LEDAは光るときは綺麗に光りますし、消えるときは綺麗に消えます。問題は、LEDBのほうで、光るときに高速で点滅します。理由と対策が解りません。どなたか教えてください。よろしくお願いします。 list p=16f628a #include<p16f628a.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF ORG 0x000 goto main ORG 0x004 main bcf STATUS,RP0 bcf STATUS,RP1 clrf INTCON clrf PORTA movlw 0x07 movwf CMCON bsf STATUS,RP0 bsf PCON,OSCF clrf TRISB movlw 0x03 movwf TRISA bcf STATUS,RP0 clrf PORTA clrf PORTB main_loop btfsc PORTA,0;この辺りがよくわかりません。 goto loop2 bsf PORTB,0 bcf PORTB,1 goto main_loop loop2 bcf PORTB,0 bsf PORTB,1 goto main_loop END

  • 初歩のPICプログラム

    最近PICはじめたばかりの全くの初心者です。9番ピンのLEDが点滅を繰り返すという16F628用のプログラムがあります。 これを16F84A用に書き換えたいんですが29行目に「Symbol not previously defined (CMCON)」というエラーがでます。どうやら16F84にはCMCONがないからのようです。これをなんとか回避する方法はないんでしょうか。うまく動かない書き換えたプログラムを下におきます。 list p=16f84a w_temp      EQU 0x70 status_temp    EQU 0x71 CNT1         EQU 0x20 CNT2        EQU 0x21       ORG   0x000     goto   main      ORG   0x004     movwf  w_temp     movf  STATUS,W     movwf   status_temp ;ISR Code    movf     status_temp,w    movwf     STATUS    swapf     w_temp,f    swapf     w_temp,w        retfie main    bcf   STATUS,RP0    bcf   STATUS,RP1    clrf   INTCON    clrf   PORTA    movlw   0x07    movwf   CMCON ;ここでエラーがでる    bsf   STATUS,RP0    clrf   TRISA    clrf   TRISB    bcf    STATUS,RP0    clrf    PORTA    clrf    PORTB main_loop    bsf  PORTB,3    call  DLY_250    bcf   PORTB,3    call   DLY_250    goto  main_loop ;Dalay Routine DLY_250   ;250mS 以下省略 空白が文字化けして見にくくてすみません。

  • PICのアセンブラからC言語へ変換のアドバイスです

    C言語ならわたしはわかるのですが、アセンブラは理解できるレベルにありません。機会があればいつか挑戦したいです。話は変わりますが、 以下のアセンブラのソースでLEDの点滅まで出来ましたが、これをC言語で理解したいと思っています。翻訳できる方がいらっしゃればご協力のほどよろしくお願いします。また、そこまでは無理でもわかる範囲でアドバイスを戴けたらと思います。よろしくお願いします。 asmソースです。 list p=16f628a #include<p16f628a.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF w_temp EQU 0x70 status_temp EQU 0x71 CNT1 EQU 0x20 CNT2 EQU 0x21 ORG 0x000 goto main ORG 0x004 movwf w_temp movf STATUS,w movwf status_temp ;ISR Codes movf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie main bcf STATUS,RP0 bcf STATUS,RP1 clrf INTCON clrf PORTA movlw 0x07 movwf CMCON bsf STATUS,RP0 bsf PCON,OSCF clrf TRISA clrf TRISB bcf STATUS,RP0 clrf PORTA clrf PORTB main_loop bsf PORTB,3 call DLY_250 bcf PORTB,3 call DLY_250 goto main_loop ;Delay Routine DLY_250 ; 250ms movlw d'250' movwf CNT1 DLP1;1ms movlw d'200' movwf CNT2 DLP2 nop nop decfsz CNT2,f goto DLP2 decfsz CNT1,f goto DLP1 return END

  • picアセンブラ ビルドは完了するのに動かない

    なんとかかんとかMPLABでLEDが1秒間隔で交互に光るプログラムを 作ったんですが、全く動きません・・・ 考えてたら頭がこんがらがってきてしまいました。 PICは16F628Aです。 何処が悪いのか教えてください。 ポートBにつないだ8個のLEDが4個ずつ 1秒おきに交互に光るプログラムです。 なお、1秒の時間稼ぎですがこれまたこんがらがってきたので とりあえず適当に遅延させています。 ----------------------------- list p=pic16f628a include "p16f628a.inc" __config _boden_off & _cp_off & _pwrte_on & _wdt_off & _lvp_off & _mclre_off & _hs_osc time1 equ 020h time2 equ 021h time3 equ 022h time4 equ 023h org 0 goto start start bsf status,rp0 clrf trisb bcf status,rp0 main movlw b'00001111' movwf portb call jikan movlw b'11110000' movwf portb call jikan jikan movlw d'2' movwf time1 matu1 movlw d'10' movfw time2 matu2 movlw d'200' movfw time3 matu3 movlw d'200' movfw time4 matu4 nop nop decfsz time4,f goto matu4 decfsz time3,f goto matu3 decfsz time2,f goto matu2 decfsz time1,f goto matu1 return 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

  • PIC 16F877A 出力電圧が60Hz発振してしまう

    PIC 16F877A にてLED点灯回路およびプログラムを作成して動作させてみたのですが、LEDが点灯せず困っています。 LED投入電圧が不安定なため、周波数を測定したところ、出力電圧が約60Hzで発振していることが分かりました。考えられる原因・対策を教えて頂けませんでしょうか? よろしくお願いいたします。 <備考> ・はじめてのPICアセンブラ入門(CQ出版社) p67-76に沿って作りました。 ・LEDへの出力は15,24ピンから出しています。 ・振動子はパナソニック, EFOEC8004A4, Resonator, (8MHz)を13,14ピンにつけています。 ・以下ASMファイルの内容です。 list p=16f877a ;pic16f877a pgm declare #include p16f877a.inc ;read header file of pic 16f877a __config _HS_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF ; initialization bcf STATUS, RP0 bcf STATUS, RP1 ;set bank0 clrf PORTC ;set0 to prevent from LED light clrf PORTD ;output 0 clrf PORTE ;output 0 bsf STATUS, RP0 ;set bank1 clrf ADCON1 ;set PORTA analog input movlw 0xff movwf TRISB ;set PORTB digital input bcf OPTION_REG, NOT_RBPU ;enable PORTB weak pull-up clrf TRISC ;set all ports for output clrf TRISD clrf TRISE bcf STATUS, RP0 ;set bank0 ; initialization finished ; led on movlw B'00100001' movwf PORTC goto $ ;endless loop end

  • PICの条件分岐について

    お世話になります。PICについて質問があります。ボタンを押せば、PORTBのLEDに対する出力が変わるという物ですが、意図したようになりません。PORTに対する設定は間違っていないと思うのですが、チャタリングを考慮したプログラムになっており、上手く条件分岐してくれません。条件というのは、PORTAに入力があれば、25ms待機して再度PORTAを見に行きます。そのときにもPORTAに入力があれば、変数に格納した数値を一つずつ減らしていき、そのときに0であればPORTBを設定したとおりに出力するというものです。以下がソースですが、ここがおかしいということだけでも教えてくださると助かります。よろしくお願いします。 list p=16f628a #include<p16f628a.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF SWI equ 0x21 SWI2 equ 0x22 CNT1 EQU 0x20 CNT2 EQU 0x21 ORG 0x000 goto main ORG 0x004 main bcf STATUS,RP0 bcf STATUS,RP1 clrf INTCON clrf PORTA movlw 0x07 movwf CMCON bsf STATUS,RP0 bsf PCON,OSCF clrf TRISB movlw 0x03 movwf TRISA bcf STATUS,RP0 clrf PORTA clrf PORTB clrf SWI main_loop btfss PORTA,1 goto flase_wait_routine goto trues_wait_routine flase_wait_routine goto main_loop trues_wait_routine call DLY_25 btfss PORTA,1 goto main_loop incf SWI,f movf SWI,W movwf SWI2 decfsz SWI2,f goto a_loop_1 bsf PORTB,0 bcf PORTB,1 bcf PORTB,2 bcf PORTB,3 goto main_loop a_loop_1 decfsz SWI2,f goto a_loop_2 bcf PORTB,0 bsf PORTB,1 bcf PORTB,2 bcf PORTB,3 goto main_loop a_loop_2 decfsz SWI2,f goto a_loop_3 bcf PORTB,0 bcf PORTB,1 bsf PORTB,2 bcf PORTB,3 goto main_loop a_loop_3 decfsz SWI2,f goto a_loop_4 bcf PORTB,0 bcf PORTB,1 bcf PORTB,2 bsf PORTB,3 clrf SWI goto main_loop a_loop_4 goto main_loop ;Delay Routine DLY_25 ; 25ms movlw d'25' movwf CNT1 DLP1;1ms movlw d'20' movwf CNT2 DLP2 nop nop decfsz CNT2,f goto DLP2 decfsz CNT1,f goto DLP1 return END

  • 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

  • PICのシミュレーターについて

    下記プログラムはPIC16F84Aを使用してBPORTにつながれた8個のLEDに対して、"AA"を出力することにより一個おきに点灯させるものです。MPLAB X IDE(Ver.3.05)とPICkit3とでプログラムしPICに書き込んでおります。 ハード的には動作は正常ですが、MPLABXのシミュレーターを使用しステップ動作で<Watches>で検証したところ、PCが16でBPORTに”AA”が転送されるはずのところ、PCが12で転送されます。その後PC13にCLRF PORTBがありますのでPC14でクリアされるので支障ありませんが、どうしてPC12で”AA”がBPORTに転送されるのでしょうか?(リセットはステップ操作の前にその度にかけております) ご教授いただければ幸いです。 1 list p=16F84A 2 include  ”p16F84A.inc” 4 __CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _CP_OFF 5;************************************** 6 LED  EQU  0AAH 7;************************************** 8 ORG 0 9 10 BSF STATUS,RP0 11 CLRF TRISB 12 BCF STATUS,RP0 13 CLRF PORTB 14 MOVLW LED 15 MOVWF PORTB 16 WAIT GOTO WAIT 17   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 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。

専門家に質問してみよう