0

私のコードは次のように表示されます。プッシュ ボタンを使用して LED のオンとオフを切り替えようとしています。そのため、一度押すとオンになり、もう一度ボタンを押すまでオンのままになります。

ただし、コンパイル中に「アドレス ラベルが重複しているか、2 番目のパスで異なります」というエラーが 1 つ発生します。

ここで何が間違っていますか?

前もって感謝します。:)

;Program name: T code

;CPU Configuration
processor 16F84A
include <p16f84a.inc>

__config _XT_OSC & _WDT_OFF & _PWRTE_ON

;Register Label Equates
PORTA   equ 05
PORTB   equ 06
Count   equ 0C

;Register Bit Label Equates
Input   equ 4   ;PUSH BUTTON INPUT RA4
LED1    equ 0   ;LED OUTPUT RB0

;*****Program Start*****

org 0

;Initialize  (Default = Input)
movlw   B'00000000'     ;Define Port B output
tris    PORTB       ; and set bit direction
goto    check

;Main Loop
check   BTFSS   PORTA,Input     ;If button is OFF, goto check, and keep waiting for button       HIGH condition.
    goto    check       ;
bsf PORTB,LED1        ;Turn the LED ON

check   BTFSS   PORTA,Input     ;Assuming the LED is currently ON, keep checking for a button press...
    goto    check
bcf PORTB,LED1        ;Turn the LED OFF
goto    check       ;repeat always

END
4

2 に答える 2

2

という 2 つの異なるラベルがcheckあるため、アセンブラーはジャンプ先を決定できません。それらのラベルのいずれかの名前を変更します。

于 2013-11-01T12:47:43.733 に答える
1

このプログラムにはいくつかのエラーがあります:

タグがcheck2 回あります。名前を変更する必要があります。

2 つのコード ブロックは本質的に同一であるため、各BTFSSディレクティブはボタンを押すまで実行を一時停止し、その後コードが迅速に実行されます。ボタンを放すとLEDがオンまたはオフになり(ランダムに)、ボタンを押している間は半分明るくなると思います。

次のようなものが必要です。

check_a    BTFSS PORTA,Input ; Wait for button push
           GOTO check_a 

           ; You need a delay here to debounce the switch
           MOVLW D'1000' ; You need to tune this value, I'm just guessing
           MOVWF Delay
delay_a    DECFSZ Delay, 1
           GOTO delay_a

check_b    BTFSC PORTA,Input ; Wait for button release
           GOTO check_b     

           ; You need a delay here to debounce the switch
           MOVLW D'1000' ; You need to tune this value, I'm just guessing
           MOVWF Delay
delay_b    DECFSZ Delay, 1
           GOTO delay_b

           BTG PORTB,LED1    ; Toggle LED on or off
           GOTO check_a

機械式プッシュボタンには小さな金属板があり、人間が認識できるよりも速く接触したり切断したりしますが、マイクロコントローラーが認識できるよりもはるかに遅いため、1 回のボタン押しがマイクロコントローラーへの複数回の迅速な押しとして表示されるため、デバウンスは重要です。私は通常、20 ミリ秒程度の遅延を使用します。

現時点では、これを試すための開発ボードを持っていないため、デバッグが必要になる可能性があります。

于 2013-11-04T01:56:56.710 に答える