PIC18Fマイコンの使い方

このQ&Aのポイント
  • 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

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

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.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

papashiroSooke
質問者

お礼

早速のご回答、有難うございます。 基本を勉強してから、再度挑戦してみます。

関連する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 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。

  • 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 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。

専門家に質問してみよう