尝试在pic16上进行去抖定时器/中断例程asm

时间:2016-10-14 16:08:13

标签: assembly timer interrupt pic mplab

我试图了解这些定时器和中断的工作原理 而且我认为按钮的去抖动例程是一个很好的开始,因为我需要它用于学校的项目

我尽可能地设置了这段代码,但我确定有些错误。 我没有真正的硬件来测试它,但我想在几天内准备好上学。

有谁能请看一下这段代码并告诉我,我是否走在正确的轨道上? 我们的想法是在timer0上触发一个中断,然后计算按钮在同一时间窗口反弹的次数,因为timer0将再次倒计时。如果按下"按下" 20次,我希望已经过了足够的时间,以便按钮完成弹跳。

我可以使用timer0来告诉代码触发中断的频率,并使用它来测试在timer0计数的时间内是否感受到20次按下?

我有一种感觉,要么我真的很接近,要么我完全离开了。请帮我 我觉得我错过了一些东西(比如一个retfie)

我没有包含代码的所有初始化部分,我省略了变量声明和重置以及int向量设置,但它就像在数据表中一样

 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 

0 个答案:

没有答案