• ベストアンサー

PICのプログラム

PIC16F84Aのサンプルプログラムを見ると  MOVWF 01F PORAT B GOTO MAIN でRB0のLEDのみ点灯になってるんですが、自分的にはB'00000001' のほうがわかりやすいと思いこれに変更したのですが上手く出来ません。どういう感じでプログラミングすればいいんでしょうか? RB0からRB7まで1個づつドライブさせたいです。

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

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

若干写し間違いだと思いますが、そのまま回答しますね。 正確に写すと答えやすいです。(^^; MOVWFはWレジスタの値を指定したレジスタに格納する命令です。 ですので、その前にWレジスタに値を積んでおく必要があります。 その前の行にこういう命令がありませんか? MOVLW 0x08 もしくは、MOVWF 0x08,0 または、MOVWF 0x08,W そこを、 MOVLW B'00000001' にすれば動くと思います。

関連するQ&A

  • 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ループ状態ですがテキストとは違います。 何かおかしいのでしょうか?

  • PIC16F84のプログラム

    PIC16F84のプログラムでこのようなものを作りました。 revel1   movlw 75        movwf tm3        movlw 255        movwf tm4 no1_on   mov rb,#11110000b     ;(1)        mov rb,#10000000b        mov rb,#11000000b        mov rb,#10100000b        mov rb,#11000000b        mov rb,#10000000b    ;(2)        decfsz tm4,1        goto no1_on        decfsz tm3,1        goto no1_on これは、(1)~(2)の動作を75×255=19125回(多分)繰り返すという物です。 同様の処理を多数行ないたいのですが、プログラムしてみたところ、容量オーバーの為か?アセンブルできませんでした。これを同様の動作でもう少しシンプルに出来ないでしょうか?よろしくお願いします。

  • PICで1秒間の豆の数をカウントするプログラム

     PIcの初心者です。回路図を見て、基板を作れる程度、プログラムは書いてあるのを打ち込める程度で、意味はまったくわかりません。  PIC16F84のPICでカウントする公開の回路を見つけて、光りセンサ-回路でON.OFFさせるかいろも作りました。プログラムは作成者のものです。 見て書き込んで、なんとか見事にカウントしました。合計数は、わかりました。 質問は、 1,このプログラムを直して、1秒間あたり、何粒落ちるかカウントしたいと考えました。  どのように、すれば良いのか教えてください。 2,合計のカウンタ-と秒速何粒落ちているかプログラムを1つのPICに入れて、動作の最初に選択 できるようにしたいのですが、どのようにしたらよいでしょうか。  PICの回路図とプログラム(テキスト形式)を添付しています。   お願いします。私の連休中の宿題で困っています。 7セグメントLED表示4桁カウンタ ; (クロック 4MHz) ; [ ご注意 ] ;PIC プログラムには秋月電子製のライター・キットを使用しているため、アセン ;ブルにはキットに付属のアセンブラを使用しています。 ;プログラム本体は PIC の基本命令だけでの構成に書き替えていますが、ヘッ ;ダー部分などが異なる場合がありますので、他のアセンブラを使用する場合は ;適宜変更してご利用下さい。 include 16f84.h .16f84 .osc hs .pwrt on .wdt off .protect off countsw equ rb.0 ;カウント入力ポート org 0ch d1 ds 1 ;カウント用 d2 ds 1 d3 ds 1 d4 ds 1 swlc ds 1 ;swait でのループ回数 sd ds 1 ;表示データ (0~9) lc ds 1 ;汎用、ループ用 org 0 goto start org 4 goto start start ;初期設定 bsf 3h,5 ;ページ 1 movlw 10000b movwf 85h ;ポート ra の初期化 movlw 00000001b movwf 86h ;ポート rb の初期化 bcf 3h,5 ;ページ 0 clrf d1 ;カウントデータの初期化 clrf d2 clrf d3 clrf d4 ct10: btfsc countsw ;入力が 0 なら次をスキップ goto ct12 call swait btfsc countsw ;入力が 0 なら次をスキップ goto ct12 ;確かでないなら戻る incf d1,1 ;加算 movlw 10 subwf d1,0 btfss 3h,2 goto ct11 clrf d1 incf d2,1 movlw 10 subwf d2,0 btfss 3h,2 goto ct11 clrf d2 incf d3,1 movlw 10 subwf d3,0 btfss 3h,2 goto ct11 clrf d3 incf d4,1 movlw 10 subwf d4,0 btfss 3h,2 goto ct11 clrf d4 ct11: call swait btfss countsw ;入力が 1 なら次をスキップ goto ct11 ;入力が 1 になるのを待つ call swait btfss countsw ;確かに入力が 1 に戻ったかを確認 goto ct11 ct12: movlw 11111110b movwf rb movlw 01101b movwf ra ;桁4へ表示 movf d4,0 movwf sd call l7ptset call wait movlw 11111110b movwf rb movlw 01110b movwf ra ;桁 3 へ表示 movf d3,0 movwf sd call l7ptset call wait movlw 11111110b movwf rb movlw 00111b movwf ra ;桁 2 へ表示 movf d2,0 movwf sd call l7ptset call wait movlw 11111110b movwf rb movlw 01011b movwf ra ;桁 1 へ表示 movf d1,0 movwf sd call l7ptset call wait goto ct10 ;********************************************************************* l7ptset: ;sd に指定された 0~9 の数字をセットする bcf 3h,0 ;キャリフラグのクリア rlf sd,1 ;4倍 rlf sd,1 movf sd,0 ;sd の値を w にコピー addwf pc,1 ;プログラム・カウンタに加算 movlw 00000010b ;0 movwf rb goto pt10 nop movlw 11100110b ;1 movwf rb goto pt10 nop movlw 10010000b ;2 movwf rb goto pt10 nop movlw 11000000b ;3 movwf rb goto pt10 nop movlw 01100100b ;4 movwf rb goto pt10 nop movlw 01001000b ;5 movwf rb goto pt10 nop movlw 00001100b ;6 movwf rb goto pt10 nop movlw 11100010b ;7 movwf rb goto pt10 nop movlw 00000000b ;8 movwf rb goto pt10 nop movlw 01100000b ;9 movwf rb pt10: return ;********************************************************************* swait: ;カウント入力時のウェイト・ルーチン movlw 6 ;6回のループ movwf swlc swt10 movlw 11111110b movwf rb movlw 01101b movwf ra movf d4,0 movwf sd call l7ptset call wait movlw 11111110b movwf rb movlw 01110b movwf ra movf d3,0 movwf sd call l7ptset call wait movlw 11111110b movwf rb movlw 00111b movwf ra movf d2,0 movwf sd call l7ptset call wait movlw 11111110b movwf rb movlw 01011b movwf ra movf d1,0 movwf sd call l7ptset call wait decfsz swlc,1 goto swt10 return ;********************************************************************* wait: ;ウェイトルーチン(1桁の表示時間) movlw 100 movwf lc wt10 decfsz lc,1 goto wt10 return

  • 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

  • このプログラムがどういう流れで動いてるか教えてください

    PICのプログラミングで以下の課題が学校ででました。 PB0~PB5まで1秒ごとに交互に点灯するプログラムを書くというものです。 CNT1 EQU 20H CNT2 EQU 21H main MOVLW B'00010101' MOVWF PORTB CALL TIM2 MOVLW B'00001010' MOVWF PORTB CALL TIM2 GOTO main TIM1 MOVLW 0F9H MOVWF CNT1 TIMLP1 NOP DECFSZ CNT1,F GOTO TIMLP1 RETURN TIM2 MOVLW 08H MOVWF CNT2 TIMLP2 CALL TIM1 DECFSZ CNT2,F GOTO TIMLP2 RETURN END 上記のプログラムで動きました。 だけど、このプログラムの流れがわからないため 説明できません。 誰かこのプログラムの流れをわかりやすく説明してください。 特にCALLとRETURN、DECFSZがどう動くかわかりません。

  • 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 簡単なプログラミングで行き詰まりました

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

  • 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マイコン16F84Aを使った入出力でつまづいてます。

    とても初心者な質問です。 色々調べましたがわかりませんでしたので質問させていただきます。 要するに、PORTAを書き換えてRA0~4につないだ任意のLEDを点灯させたいだけなんですが、うまいこといきません。 LEDの極性は間違いないようです。 以下がソースです。 このソースではb'11111'を転送する事で全てのポートAのLEDを点灯させたいつもりなのですが、実際のテストボードでは何故か RA0,RB3,RB5,RB7が点灯して、もうわけわかりません。どなたかご教授お願いします。 LIST P=PIC16F84A ; INCLUDE P16F84A.INC ; __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ORG 0 INIT BSF STATUS,RP0     CLRF TRISA CLRF  TRISB BCF STATUS,RP0 ; <メイン> LOOP MOVLW b'11111' MOVWF PORTA GOTO LOOP END

専門家に質問してみよう