Попытка создать процедуру отмены таймера / прерывания на pic16 i asm

#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 бит) могут быть настроены на прерывание при переполнении, и оба могут иметь предварительный таймер.