2013-11-01 4 views
0

Мой код показан ниже, я пытаюсь использовать кнопку включения и выключения светодиода. Поэтому нажатие на него однажды включит его, и оно останется включенным, пока кнопка не будет нажата снова.PIC Assembly - Проверка состояния кнопки

Однако во время компиляции я получаю одну ошибку - «метка адреса дублируется или различна во втором проходе» Ошибка указывает на второе появление строки, начинающейся с «check BTFSS».

Что я здесь делаю неправильно?

Заранее спасибо. :)

;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 
+1

Не программист ПИК, но мне кажется, что вы отметили две строки 'check', что путает ассемблер. Возможно, вы должны пометить их 'check1' и' check2'. –

ответ

2

У вас есть две разные метки, называемые check, так как ассемблер не может решить, куда перейти. Переименуйте одну из этих ярлыков.

+0

Спасибо за быстрый ответ. Я изменил его, как вы сказали, теперь он компилируется, но есть логическая ошибка, так как светодиод остается постоянно включенным, кнопка ничего не делает ... –

+1

Эти проверки будут происходить так быстро, что одно нажатие кнопки будет регистрироваться десятки, если не сотни (в зависимости от тактовой частоты) кнопок. Вы захотите добавить задержку, как только обнаружите нажатие кнопки. Также убедитесь, что ваши gotos правильны, так как вы изменили этикетки. –

1

Там несколько ошибок в этой программе:

Вы имеете check тег там дважды, вам нужно переименовать его.

Два блока кода по существу идентичны, поэтому каждая из директив BTFSS приостанавливает выполнение до тех пор, пока вы не нажмете кнопку, а затем быстро выполнится код. Я предполагаю, что ваш светодиод будет либо включен, либо выключен, когда вы отпустите кнопку (случайная по отношению к которой), а затем она будет на полпути ярче, пока вы удерживаете кнопку.

Вам нужно что-то вдоль линий:

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 

дребезга имеет решающее значение, поскольку механические кнопки имеют небольшие металлические листы, которые сделали и размыкающие контакт быстрее, чем люди могут сказать, но гораздо медленнее, чем микроконтроллер может сказать, так одно нажатие кнопки показывает, что несколько быстрых нажатий на микроконтроллер. Обычно я использую задержку в 20 миллисекунд или около того.

На данный момент у меня нет платы разработки, чтобы попробовать это, поэтому есть вероятность, что потребуется отладка.

Смежные вопросы