启用呼叫时Atmel ASM无法正常工作

时间:2014-08-26 22:28:47

标签: assembly arduino atmel atmega

我是一名学生应用计算机科学,在年底我们有一个任务,为骰子创建硬件并在程序集中编程。硬件由2个按钮和7个LED组成,LED如下图所示(其中+是LED,点是什么都没有(间距))

+...+
+.+.+
+...+

其中一个按钮是throw按钮,它会在循环中不断检查,程序会相应地动作。另一个按钮用于历史模式,对于骰子来说有点额外。我已经为历史模式的骰子实现了完整的汇编代码,但它没有工作(没有任何反应),但当我注释掉我对setupHistory和clearHistory的调用时,它正常工作(但没有历史模式)。

代码将在带有Atmega328P芯片的Arduino Uno R3上运行。

这些是我的定义:

.DEF TMP = R16
.DEF RND = R17
.DEF PRM = R18
.DEF RTN = R19
.DEF BUTTON_STATE = R20         ; bit 0: cur throw button state
.DEF PREV_BUTTON_STATE  = R21   ; bit 0: prev throw button state
.DEF ANIMATION_STATE = R22      
.DEF COUNTER = R23

历史记录的数据段:

.DSEG

.ORG 0x0100
h1: .BYTE 1 ; History 1
h2: .BYTE 1 ; History 2
h3: .BYTE 1 ; History 3
h4: .BYTE 1 ; History 4
h5: .BYTE 1 ; History 5

中断向量表:

.CSEG
.ORG 0x0000                 ; Reset interrupt
    RJMP main
.ORG INT0addr                   ; Int0 interrupt
    RJMP INT0_interrupt
.ORG OVF1addr                   ; Timer/Counter1 Compare Match A
    RJMP timer1_overflow        
.ORG OVF0addr                   ; Timer/Counter0 Overflow
    RJMP timer0_overflow        

主要方法'初始化一切:

.ORG 0x0033
main:
CLI                     ; Disable interrupts

CALL initializeStack    ; Initialize the stack
CALL loadRegisters      ; Load default register values
CALL setupPorts         ; Setting up ports

                        ; Clear interrupts
CALL setupTimer0        ; Setting up Timer 0
CALL setupTimer1        ; Setting up Timer 1

;CALL setupHistory      ; History button
;CALL clearHistory      ; Clear history

SEI                     ; Enable interrupts

RJMP loop               ; Jump to loop

这就是问题发生的地方,当取消注释setupHistory和clearHistory的调用时,骰子不再工作(当评论它正常工作时)。

这是跳转到的代码:

setupHistory:
LDI TMP, 0b00000011 ; 0b00000011
STS EICRA, TMP  ; Rising edge

LDI TMP, (1 << INT0)
OUT EIMSK, TMP

RET

INT0_interrupt:
IN PRM, PORTB

// Display h1
LDS TMP, h1
OUT PORTB, TMP
RCALL DELAY_HALF_SECOND

// Display h2
LDS TMP, h2
OUT PORTB, TMP
RCALL DELAY_HALF_SECOND

// Display h3
LDS TMP, h3
OUT PORTB, TMP
RCALL DELAY_HALF_SECOND

// Display h4
LDS TMP, h4
OUT PORTB, TMP
RCALL DELAY_HALF_SECOND

// Display h5
LDS TMP, h5
OUT PORTB, TMP
RCALL DELAY_HALF_SECOND

// Restore state
OUT PORTB, PRM

RETI

; PRM -> New number to store
; RTN -> Number that is removed
StoreToSram:
CLI

LDS TMP, h1
STS h1, PRM

LDS PRM, h2
STS h2, TMP

LDS TMP, h3
STS h3, PRM

LDS PRM, h4
STS h4, TMP

LDS RTN, h5
STS h5, PRM

SEI

RET

// TODO
clearHistory:
LDI TMP, 1  ; Keep vcc

STS h1, TMP
STS h2, TMP
STS h3, TMP
STS h4, TMP
STS h5, TMP

RET

如果需要更多信息请求它,你就会得到它!

0 个答案:

没有答案