PIC18Fマイコンの使い方
- PIC18Fマイコンの使い方についての質問です。
- 質問者はアセンブラーのプログラムを書いてPIC18Fマイコンに書き込んだが、回路が正常に動作しない。詳細を教えてほしい。
- 評価ボード上のLEDとスイッチの回路が正常に動作せず、RB7の電位が0VになってもRB3の電位が上がらない。原因を教えてほしい。
- ベストアンサー
PIC18Fマイコンの使い方
次のような簡単なアセンブラーのプログラムを書いてアセンブルし、PICkit2を使ってマイコン(PIC18F4685)に書き込みましたが、添付の回路図のように組んだLEDとスイッチの回路が働きません。RB7のスイッチを押すとRB3のLEDが点灯し、RB6のスイッチを押すとRB1のLEDが点灯すると思ったのですが。 スイッチを押すとRB7の電位が0Vに落ちますが、RB3の電位はあがりません。 PICマイコンはNorthMicro の評価ボードに乗っていて、Vddは5Vあります。 発振素子はついていません。どこが悪いのでしょうか?詳しい方、どうか教えてください。 Main: ; *** main code goes here *** Memory EQU 0x0C Mem1 EQU Memory+0 ; Mem1 at 0C Time1 EQU Memory+1 ; Time1 at 0D Time2 EQU Memory+2 ; Time2 at 0E Time3 EQU Memory+3 ; Time3 at 0F ; ORG 0 GOTO Start Start ; setting of Port B ; BSF STATUS, RP0 ; 18Fには不要なのでコメントアウト MOVLW b'110000' ; bit 7 & 6 =1, Bit 6 to 0 =0 MOVWF TRISB ; specify port in/out function ; BCF STATUS, RP0 ;18Fには不要なのでコメントアウト MOVLW b'00001010' MOVWF PORTB ; output the data to port B ; main loop Repeat MOVF PORTB, 0 ; read the port B data into W reg ANDLW b'110000' MOVWF Mem1 BTFSS Mem1, 7 ; if 7th bit is '1' then skip the next line ; else execute the next line CALL RotateR BTFSS Mem1,6 ; if 6th bit is '1' then skip the next line ; else execute the next line CALL RotateL GOTO Repeat ; infinite loop ; end of main loop RotateR MOVLW b'00001000' MOVWF PORTB RETURN RotateL MOVLW b'00000010' MOVWF PORTB RETURN
- papashiroSooke
- お礼率90% (479/532)
- その他(プログラミング・開発)
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
pic18fの入門書は読みましたか? config命令なし、bank設定なし、アナログよりデジタルポートへ切り換えなし スイッチのプルアップ抵抗が100Ωでは、出力ポートに設定ミスするとpicが壊れます、->10kΩ スイッチにてGNDへつながるようになっていますが、ここに1k-470Ωの抵抗を入れると、出力ポートに設定ミスをしても壊れません LEDの制限抵抗も100Ωでは、小さすぎPICの定格を超えます、->330-470Ω http://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E7%89%88-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE-PIC18F%E6%9C%AC%E6%A0%BC%E6%B4%BB%E7%94%A8%E3%82%AC%E3%82%A4%E3%83%89-%E5%BE%8C%E9%96%91-%E5%93%B2%E4%B9%9F/dp/477413449X
関連するQ&A
- 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
- 締切済み
- その他(趣味・娯楽・エンターテイメント)
- マイコンPIC16F84Aについて
BSF STATUS,RP0 BSF TRISA,0 CLRF TRISB BCF STATUS,RP0 LOOP MOVLW05h MOVWF,PORTB MAIN BTFSC PORT,0 こんな感じです。 入力にセンサーを使用してオンしたらLEDが点灯する回路にしたいのですがプログラムに詳しい方がいましたら教えていただけないでしょうか?
- 締切済み
- その他(プログラミング・開発)
- PIC16F819とMAX232Cについて困っています。
まだ駆け出しでわからないことだらけで、以下のプログラムをふまえてPIC16F819とMAX232C(RS232C?)を接続したいのですが、どうプログラム(アセンブラ)を追加したら、また回路的にどうしたらいいのかわからないので教えてください。以下のプログラム(コメント省略)は、電圧変化により出力(LEDの点灯数の変化)を行ったものです。 LIST p=PIC16F819 #include <P16F819.inc> __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _LVP_OFF AD_DATA_H EQU 20h AD_DATA_L EQU 21h WAITCOUNT EQU 22h ORG H'00' GOTO START ORG H'04' GOTO START ;------------------------------ ; 初期設定 ;------------------------------ START BSF STATUS, RP0 BCF ADCON1, ADFM BCF ADCON1, ADCS2 BSF ADCON1, PCFG3 BSF ADCON1, PCFG2 BSF ADCON1, PCFG1 BCF ADCON1, PCFG0 MOVLW B'00000001' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB BCF STATUS, RP0 CLRF ADCON0 CLRF PORTA CLRF PORTB ;------------------------------- ; メインルーチン ;------------------------------- MAIN CALL AD_CONVERT MOVLW b'10000000' SUBWF AD_DATA_H, W BTFSC STATUS, C GOTO V_UPPER_HALF GOTO V_LOWER_HALF V_UPPER_HALF MOVLW b'11000000' SUBWF AD_DATA_H, W BTFSC STATUS, C GOTO V_3_4 GOTO V_1_2 V_LOWER_HALF MOVLW b'01000000' SUBWF AD_DATA_H, W BTFSC STATUS, C GOTO V_1_4 GOTO V_ZERO V_3_4 MOVLW b'00000111' MOVWF PORTB GOTO MAIN V_1_2 MOVLW b'00000011' MOVWF PORTB GOTO MAIN V_1_4 MOVLW b'00000001' MOVWF PORTB GOTO MAIN V_ZERO MOVLW b'00000000' MOVWF PORTB GOTO MAIN ;--------------------------------- ; A/D 変換サブルーチン ;--------------------------------- AD_CONVERT MOVLW B'10000001' MOVWF ADCON0 CALL WAIT_100U BSF ADCON0, GO BTFSC ADCON0, GO GOTO ADLOOP MOVF ADRESH, W MOVWF AD_DATA_H MOVF ADRESL, W MOVWF AD_DATA_L RETURN ;------------------------------------------------------------ ; 100usec ( 100usec = 0.2u/Cycle at 20MHz x 500 ) ;------------------------------------------------------------ WAIT_100U MOVLW D'165' MOVWF WAITCOUNT WAIT_100UL DECFSZ WAITCOUNT,F GOTO WAIT_100UL RETURN END 長くなりましたがご教授どうかお願いします。
- 締切済み
- その他(プログラミング・開発)
- PIC16F84Aで入力があるとスタートするプログラム
PIC16F84Aで、アセンブリ言語でプログラムをしています。 RA4を入力端子とし、入力があればプログラムがスタートするということをしたいんですけどうまくいきません。 私の作ったプログラムはこのようになっています。 listp=16f84A include <p16f84A.inc> __CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF tim1 EQU 0x20 org 0x00 NOP GOTO start start BSF STATUS,RP0 MOVLW B'00010000' MOVWF TRISA CLRF TRISB BCF STATUS,RP0 MOVLW B'00010000' MOVWF PORTA CLRF PORTB main MOVLW 001h MOVWF tim1 timlp1 BTFSC PORTA,5 CALL playball GOTO main playball MOVLW B'00001111' MOVWF PORTA MOVLW B'11111111' MOVWF PORTB RETURN 修正点などありましたら教えて下さい。
- ベストアンサー
- その他(プログラミング・開発)
- PICアセンブラ、これって変?
PIC16F84でのアセンブラなのですが、下記のプログラムで・・・。 MAIN MOVLW B'00000000' MOVWF PORTB BTFSC PORTA,3 GOTO FINISH GOTO MAIN FINISH MOVLW B'11111111' MOVWF PORTB END PortAが入力、Bが出力なのですが、MAINでループしながら待機、 PortAの3bitめがHになったらPortBをすべて立てて終了という感じに なると思いますが、上手くいかないんです。 3bit目にあらかじめ+5Vを印加しておくと、一瞬でPortBがすべて立つのですが、 ループ中にやっても何も変化がありません。 ループしていないか、判定ができていないかのどちらかなのですが・・・。 デバッグしてみても、きちんとループ・判定できているのですが いざ焼いてみると動作しません。わかりますでしょうか。
- ベストアンサー
- その他(プログラミング・開発)
- 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アセンブラを出来る方、教えてください!
初めに、カテゴリー間違ってたら、ごめんなさい。 大学の授業でライントレースロボットのアセンブラプログラムをやっています。 「以下のプログラムをセンサ入力をPORTA、モータドライブをPORTBとしプログラムを完成させよ(本講義で用いる装置はそのような回路になっていないので実行できない)。」 という問題なんですが分かる方居ますでしょうか? ;改造するプログラム ーーーーLIST P=PIC16F628A ーーーーinclude "P16F628A.inc" ーーーー__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _CP_OFF STATUS EQU 3 RP0 EQU 5 PORTA EQU H'05' PORTB EQU H'06' TRISA EQU H'85' TRISB EQU H'86' LR EQU D'7' LL EQU D'0' FRONT EQU B'00011000' RIGHT EQU B'00001000' LEFT EQU B'00010000' ーーBSF STATUS,RP0 ーーCLRF TRISA ーーMOVLW B'11000011' ーーMOVWF TRISB ーーBCF STATUS,RP0 ーーCLRF PORTA ーーCLRF PORTB LINE BTFSC PORTB,LL ーーGOTO MIGI ーーBTFSC PORTB,LR ーーGOTO HIDARI ーーGOTO MAE MAE MOVLW FRONT ーーIORWF PORTB,1 ーーMOVLW B'11011011' ーーANDWF PORTB,1 ーーGOTO LINE MIGI MOVLW RIGHT ーーIORWF PORTB,1 ーーMOVLW B'11001011' ーーANDWF PORTB,1 ーーGOTO LINE HIDARI MOVLW LEFT ーーIORWF PORTB,1 ーーMOVLW B'11010011' ーーANDWF PORTB,1 ーーGOTO LINE ーーEND 私が今、予想しているのは MOVLW B'11111111' MOVWF TRISA CLRF TRISB とするのではないかな、くらいです。(合ってるか分かりませんが) この問題を解ける方、いましたらお願いします。 (注)プログラムがスペースが分かりにくくなっていますが、本当のプログラムはちゃんとスペースが空いて、列も揃っています。行の先頭に付いているーは強制的に左寄せになるのを、すこしでも見やすくするための物で、意味はありません。
- ベストアンサー
- その他(プログラミング・開発)
- 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 簡単なプログラミングで行き詰まりました
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サービス)
- 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 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。
- 締切済み
- その他(プログラミング・開発)
お礼
早速のご回答、有難うございます。 基本を勉強してから、再度挑戦してみます。