MSP430 - 使用BUTTON_ISR中的jmp进行装配

时间:2018-03-29 04:48:39

标签: assembly msp430

我目前已将 BUTTON_ISR 设置为增加 r9 ,其中包含程序当前所处的模式)然后是否为模式如果是0或1,它将跳转到闪烁红色LED的循环,如果它处于模式2或3,它将转到空循环,因此灯不闪烁。但是,我的按钮只能工作一次所以我可以进入模式1,但之后当我按下我板上的按钮时,没有任何反应。任何人都知道为什么这个代码打破我的按钮?我认为这与跳出按钮isr而不是使用reti有关,但我不确定如何解决这个问题,谢谢。

BUTTON_ISR:
    push    r15
    push    r14

    ; button code here

    inc r9

.Ldebounce:

    bit.b   #0x08, &P1IN
    jnz     .Ldebounce
    mov     #120, r15
    call    #delay_ms

    bic.b   #BIT3, &P1IFG
    pop     r14
    pop     r15

    cmp #0, r9
    jeq .Lloop

    cmp #1, r9
    jeq .Lloop

    cmp #2, r9
    jeq .Loff

    cmp #3, r9
    jeq .Loff

    mov #0, r9
    jmp .Lloop


    reti

1 个答案:

答案 0 :(得分:0)

使用R9的值的决定是在中断处理程序中执行的,并且根据R9寄存器中的值,您可以跳转到标签.Lloop.Loff。这些例程无法返回到此处的中断函数,更重要的是,您的上一次跳转是无条件跳转,无法返回到RETI中断函数的末尾。

你应该有一个短暂的中断函数,它最好在RAM中设置一个模式值,并设置一些主要的后台代码来轮询这个位置以查看要采取的操作。如果您的中断函数返回并且任何主代码使用R9寄存器,则以您的方式使用R9寄存器将会失败。这个失败要么是R9寄存器的值可以在中断之间改变,所以你期望的递增序列不会发生,或者你的主代码会失败,因为R9中的值会在某些随机时间增加计算