- 締切済み
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ビットのみ)とせよ。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- take0_0
- ベストアンサー率46% (370/804)
間違いがあったので、訂正しておきます。すみません。 誤:あと、MOVFとMOVLFの使い方に誤解があるようです。 正:あと、MOVFとMOVLWの使い方に誤解があるようです。 なお、補足に書かれているソースは、字下げを全角スペースで行っています。 もし元のソースもそうなら、タブに直してください。 これってまともにアセンブラ通るんでしたっけ?
- take0_0
- ベストアンサー率46% (370/804)
補足ありがとうございます。 マイクロチップのオリジナルアセンブラですね。 まず、変数と定数の定義を混同しています。 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の使い方に誤解があるようです。 全体的に見直してみてください。 特に初心者は、一気に全部書かず、少しずつテストした方が良いですよ。
- take0_0
- ベストアンサー率46% (370/804)
プログラミング環境も色々あるので、まずは何を使っているのか示しましょう。 アセンブラで組む人もいるし、Cで組む人も居る。 アセンブラと一口に言っても、独自拡張された言語もあれば、Microchipオリジナルで組む場合もあります。 とりあえず自分で書いてみたものも無いのですか? それを叩き台にせず、全部書けと言われても時間がかかります。 初期化部分とかは大丈夫? そこから説明が必要? RB0の割り込みは何に使うのですか? 同時に点灯しているLEDは1個で、その位置が変わるのですか? これくらいの情報は明示しましょう。
補足
情報が足りず申し訳ありません。 使用しているソフトは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
補足
回答ありがとうございます。 ネットで調べて友人に尋ねて書き直してみました。 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