• 締切済み

PICによるLED制御について

大学の講義でPICのLED制御の課題がよくわかりません。 どなたか教えていただけないでしょうか? [問]  PIC16F84Aにおいて、動作を実現するプログラムを示せ。  メインルーチンでLED出力の点燈箇所を1秒ごとに巡回させる。   RA3=Low(OFF)のとき、左向きに巡回シフト(RLF命令)させる。   RA3=High(ON)のとき、右向きに巡回シフト(RRF命令)させる。  また割り込みルーチンによって、RA0~RA2の3ビットの値に応じて  点灯速度を変化させる(値が大きいほど速く)  ただし、ポートAは全て入力モード、ポートBはRB0以外を出力モードとし(RB0は割り込み用)、ポートBの初期出力を0000100*(LED出力の初期点燈位置は第3ビットのみ)とせよ。

この投稿のマルチメディアは削除されているためご覧いただけません。

みんなの回答

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

間違いがあったので、訂正しておきます。すみません。 誤:あと、MOVFとMOVLFの使い方に誤解があるようです。 正:あと、MOVFとMOVLWの使い方に誤解があるようです。 なお、補足に書かれているソースは、字下げを全角スペースで行っています。 もし元のソースもそうなら、タブに直してください。 これってまともにアセンブラ通るんでしたっけ?

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

補足ありがとうございます。 マイクロチップのオリジナルアセンブラですね。 まず、変数と定数の定義を混同しています。 CNT1~DDまではOKですが、LED~INT_NGは定数にしたいのですよね? このままだと、LEDは08HなのでEEDATA、 PB_Dは01HなのでTMR0にアクセスしようとしています。 また、INT_NGはTMP_Wとアドレスが重複しています。 INCLUDEと変数定義の間に、 #define PB_D 01H #define INT_OK 90H #define INT_NG 10H とでも書いておけばOKです。 LEDは変数で使いたいようなので、 LED EQU 14H として、MAINルーチンの最初で08Hを代入してください。 その他の変数を初期化せずに使っているのも駄目ですね。 RB0の割り込みによって割り込みルーチンで初期化しようとしているようですが、最初に割り込みがかかることが保証されているのですか? そうでなければ、LEDをWレジスタにロードした時点でおかしなことになります。 普通は、最初にゼロで初期化するか、初期値を代入しておきます。 また、     RLF LED,0     BTFSC STATUS,C     MOVLW 02H     BTFSC STATUS,C     MOVWF LED だと、LEDが左端までいってキャリーが出たときは所望の動作をしますが、キャリーが出ていないときはLEDの値が変化しません。つまり、LEDの値は初期値から動きません。     RLF LED,0     BTFSC STATUS,C     MOVLW 02H     MOVWF LED とすれば、所望の動作をします。RRFも同じ。 LOOPAで、     BTFSC PORTA,0     GOTO LOOPB     GOTO LOOPA としてRA0をテストしていますが、回転方向制御はRA3ですよね? あと、MOVFとMOVLFの使い方に誤解があるようです。 全体的に見直してみてください。 特に初心者は、一気に全部書かず、少しずつテストした方が良いですよ。

ayase-satuki
質問者

補足

回答ありがとうございます。 ネットで調べて友人に尋ねて書き直してみました。 CNT1 EQU 0CH CNT2 EQU 0DH CNT3 EQU 0EH CNT4 EQU 0FH TMP_W EQU 10H TMP_S EQU 11H SPEED EQU 12H DD EQU 13H NUMBER EQU 14H PB_D EQU 01H INT_OK EQU 90H INT_NG EQU 10H ORG 0 GOTO MAIN ;割込 ORG 4 MOVWF TMP_W MOVF STATUS,W MOVWF TMP_S MOVLW INT_NG MOVWF INTCON CLRF PORTB ;表示スピード MOVLW D'100' MOVWF SPEED BTFSC PORTA,3 CALL ADJ_DD MOVF PORTA,W MOVWF DD BTFSC STATUS,Z GOTO FINISH MINUS MOVLW D'13' SUBWF SPEED DECFSZ DD,F GOTO MINUS GOTO FINISH ADJ_DD MOVLW 08H SUBWF PORTA,W RETURN FINISH MOVLW INT_OK MOVWF INTCON MOVF TMP_S,W MOVWF STATUS MOVF TMP_W,W RETFIE MAIN BSF STATUS,RP0 MOVLW INT_OK MOVWF INTCON BSF OPTION_REG,INTEDG MOVLW 1FH MOVWF TRISA MOVLW PB_D MOVWF TRISB BCF STATUS,RP0 BCF STATUS,C MOVLW D'100' MOVWF SPEED MOTION MOVLW LEDD MOVWF PORTB CALL TIMER1 BTFSC PORTA,3 CALL RIGHT CALL LEFT RIGHT BTFSC LEDD,1 CALL RESETR RRF LEDD,F GOTO MOTION LEFT BTFSC LEDD,7 CALL RESETL RLF LEDD,F GOTO MOTION RESETR MOVLW LEDDR MOVWF LEDD CALL TIMER1 RETURN RESETL MOVLW LEDDL MOVWF LEDD CALL TIMER1 RETURN TIMER1 MOVLW D'2' MOVWF CNT1 LOOP1 NOP CALL TIMER2 DECFSZ CNT1, F GOTO LOOP1 RETURN TIMER2 MOVF SPEED,W MOVWF CNT2 LOOP2 NOP CALL TIMER3 DECFSZ CNT2, F GOTO LOOP2 RETURN TIMER3 MOVLW D'100' MOVWF CNT3 LOOP3 NOP CALL TIMER4 DECFSZ CNT3, F GOTO LOOP3 RETURN TIMER4 MOVLW D'62' MOVWF CNT4 LOOP4 NOP DECFSZ CNT4,F GOTO LOOP4 RETURN END よろしくお願いいたしますm(_ _)m

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

プログラミング環境も色々あるので、まずは何を使っているのか示しましょう。 アセンブラで組む人もいるし、Cで組む人も居る。 アセンブラと一口に言っても、独自拡張された言語もあれば、Microchipオリジナルで組む場合もあります。 とりあえず自分で書いてみたものも無いのですか? それを叩き台にせず、全部書けと言われても時間がかかります。 初期化部分とかは大丈夫? そこから説明が必要? RB0の割り込みは何に使うのですか? 同時に点灯しているLEDは1個で、その位置が変わるのですか? これくらいの情報は明示しましょう。

ayase-satuki
質問者

補足

情報が足りず申し訳ありません。 使用しているソフトはAkizukiのPIC Programmer V3です。 同時に点灯しているLEDは1個でその位置が変わります。 とりえず自分で書いてみたものを載せます。 よろしくお願いいたします。 LIST P=PIC16F84A INCLUDE "P16F84A.INC" CNT1 EQU 0CH CNT2 EQU 0DH CNT3 EQU 0EH TMP_W EQU 10H TMP_S EQU 11H SPEED EQU 12H DD EQU 13H LED EQU 08H PB_D EQU 01H INT_OK EQU 90H INT_NG EQU 10H     ORG 0     GOTO MAIN     ORG 4     MOVWF TMP_W     MOVF STATUS     MOVWF TMP_S     MOVLW INT_NG     MOVWF INTCON     CLRF PORTB     MOVLW D'195'     MOVWF SPEED     MOVF PORTA,W     MOVWF DD     BTFSC STATUS,Z     GOTO FINISH     DECFSZ DD,W     GOTO FINISH     BCF DD,0 AGAIN  MOVLW D'10'     SUBWF SPEED,F     DECFSZ DD,F     GOTO AGAIN FINISH MOVLW INT_OK     MOVWF INTCON     MOVF TMP_S,W     MOVWF STATUS     MOVF TMP_W,W     RETFIE MAIN  BSF STATUS,RP0     MOVLW INT_OK     MOVWF INTCON     BSF OPTION_REG,INTEDG     MOVLW 0FFH     MOVWF TRISA     MOVLW PB_D     MOVWF TRISB     BCF STATUS,RP0     MOVLW D'195'     MOVWF SPEED     MOVLW LED     CLRF PORTB     BTFSC PORTA,0     GOTO LOOPB     GOTO LOOPA LOOPA  BCF STATUS,C     MOVLW LED     MOVWF PORTB     CALL TIMER1     RLF LED,0     BTFSC STATUS,C     MOVLW 02H     BTFSC STATUS,C     MOVWF LED     BTFSC PORTA,0     GOTO LOOPB     GOTO LOOPA LOOPB  BCF STATUS,C     MOVLW LED     MOVWF PORTB     CALL TIMER1     RRF LED,0     BTFSC LED,1     MOVWF PORTB     BTFSC LED,1     MOVLW 80H     BTFSC LED,1     MOVWF LED     BTFSS PORTA,0     GOTO LOOPA     GOTO LOOPB TIMER1 MOVF SPEED,W     MOVWF CNT1 LOOP1  NOP     CALL TIMER2     DECFSZ CNT1,F     GOTO LOOP1     RETURN TIMER2 MOVLW D'100'     MOVWF CNT2 LOOP2  NOP     CALL TIMER3     DECFSZ CNT2,F     GOTO LOOP2     RETURN TIMER3 MOVLW D'61'     MOVWF CNT3 LOOP3  NOP     DECFSZ CNT3,F     GOTO LOOP3     RETURN     END

関連するQ&A