#assembly #timer #interrupt #pic #mplab
#сборка #таймер #прерывание #рис #mplab
Вопрос:
Я пытаюсь разобраться в том, как работают эти таймеры и прерывания, и я подумал, что процедура отмены для кнопки будет хорошим способом начать, поскольку она мне нужна для проекта в школе
Я настроил этот код как можно лучше, но я уверен, что что-то не так. На самом деле у меня нет оборудования для его тестирования, но я хотел бы подготовить его к школе через несколько дней.
Не мог бы кто-нибудь, пожалуйста, взглянуть на этот код и сказать мне, на правильном ли я пути? идея состоит в том, чтобы запустить прерывание на timer0, а затем подсчитать, сколько раз кнопка отскакивает в том же временном окне, когда timer0 снова начнет обратный отсчет. Если кнопка «нажата» 20 раз, я надеюсь, что прошло достаточно времени, чтобы кнопка перестала подпрыгивать.
Q1 могу ли я использовать timer0 как для указания коду, как часто запускать прерывание, так и использовать его для проверки, ощущается ли 20 нажатий в течение времени, отсчитываемого timer0?
У меня такое чувство, что либо я действительно близок, либо я полностью отключен. Пожалуйста, помогите мне, я чувствую, что мне чего-то не хватает (например, повторной настройки)
Я не включил всю часть инициализации кода и не включил объявление переменной, сброс и настройку вектора ввода, но это так же, как в таблице данных
BANKSEL INTCON
MOVLW B'10100000'
MOVWF INTCON
BANKSEL OPTION_REG
MOVLW B'11000111' ;FOSC4mhz/4, 1:256 prescaler
MOVWF OPTION_REG
BANKSEL TMR0
MOVLW B'10110010' ;178 to get a cycle of around 20mS
MOVWF TMR0
MOVLW B'00010100'
MOVWF BOUNCECOUNTER ;count down from 20
GOTO MAIN
ISR
BTFSC INTCON, 2 ;TEST TIMER0 OVERFLOW FLAG
RETFIE
GOTO TEST
TEST
BTFSC INTCON, 2
GOTO DECIDE
DECFSZ TMR0
BTFSC PORTA, 0 ;TEST FOR BUTTON PRESS
GOTO DECIDE
DECFSZ BOUNCECOUNTER ;DECREMENT BOUNCECOUNTER EVERY TIME A HIGH TO LOW ON PORTA
GOTO TEST
GOTO DECIDE
DECIDE
BTFSC INTCON, 2 ;TEST TIMER0 OVERFLOW FLAG
BTFSS STATUS, Z ;TEST IF BOUNCECOUNTER REACHES ZERO
GOTO TEST
BTFSS INTCON, 2
GOTO NOTPRESSED
GOTO BPRESSED ;LOOP TIMER0 AND TEST FOR BUTTON PRESS
BPRESSED
BCF INTCON, 2 ;CLEAR TIMER0 OVERFLOW FLAG
MOVLW 0x000
MOVWF BOUNCECOUNTER
;TOGGLE BETWEEN AWESOME STUFF
NOTPRESSED
BCF INTCON, 2
MOVLW 0x000
MOVWF BOUNCECOUNTER
RETFIE
MAIN
GOTO MAIN
END
Комментарии:
1. Мой способ — протестировать нажатие кнопки в ISR с таймером свободного запуска, работающем, скажем, на частоте 50 Гц. Увеличьте счетчик, если кнопка нажата, обнулите счетчик, если он не нажат. Когда достигается необходимое (скажем, 3) количество отсчетов, событие нажатия кнопки помечается для «пользователя». Определение кнопки выполняется с уровня ввода, а не с его перехода.
2. если я вас правильно понимаю. вы бы использовали отдельный таймер для запуска во время подсчета нажатий кнопок?
3. Я не считаю нажатия кнопок, я считаю, сколько раз ввод находится в «нажатом» состоянии при обычном прерывании по таймеру. Мой счетчик увеличивается, ваш уменьшается, но в вашем коде вы не сбрасываете этот счетчик так, как вы его сначала инициализируете — вы устанавливаете его на 0. В более общем плане, если вы не возражаете, я обнаружил во встроенной работе, что обычное прерывание «сердцебиения» полезно для многих вещей, и у меня всегда есть одно, например, вы можете поддерживать счетчик, который полезен для часов, и для синхронизации в целом для «пользовательских» функций, подобныхдля использования
clock()
в программах на C.4. не могли бы вы привести мне пример того, как вы пишете этот код прерывания peace of heartbeat?
5. Все это есть в листе данных. Таймер 0 (8 бит) и таймер 1 (16 бит) могут быть настроены на прерывание при переполнении, и оба могут иметь предварительный таймер.