PICのテストプログラムでLEDの点灯が同時になってしまう理由は?
- 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 よろしくお願いします。
- seankoba128
- お礼率66% (6/9)
- その他(趣味・娯楽・エンターテイメント)
- 回答数3
- ありがとう数2
- みんなの回答 (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しすぎてネストが深くなると、引っかかるかもしれません。
その他の回答 (2)
- poyo3
- ベストアンサー率30% (260/857)
call matuloop3の内容は確認してみましたか? 良くありがち(?)かもしれませんがバンクの切替はしっかりしておいたほうが良いかと思います16F877Aは4バンクありますので初期値で設定されている場合でもバンク1を指定する場合はbcf STATUS,RP1 bsf STATUS,RP0 と確実にバンクを設定するほうがよいと思います。 バンクが切り替わっていなくてもアセンブルでエラーは出なかったと思います。
補足
解答ありがとうございます。 call matuloop3は、デバッグしてあっていたと思います。バンクの切り替えは、デバッグでは、わからないのですか?
- take0_0
- ベストアンサー率46% (370/804)
bank 1への切り替えは bsfSTATUS,RP0 としているのに、bank 0への切り替えは clrfSTATUS としていますね。これは少々乱暴です。 他のステータスビットをクリアしても問題無いことを確認しましたか? 特にbit 3,4がまずいでしょうね。WDTはoffになっているようですから、SLEEPになってしまっているのではないでしょうか。 よくわからないのなら余計に、わかっているbitだけ操作しましょう。 2箇所ある clrf STATUS を、 bcf STATUS,RP0 とすれば所望の動作をすると思います。
お礼
解答ありがとうございます。 そうなのですか。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
- ベストアンサー
- C・C++・C#
- 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 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。
- ベストアンサー
- その他(インターネット・Webサービス)
お礼
ありがとうございます。よくわかりました。 やってみたいと思います。