Arduino UNO中断大会

时间:2013-10-31 18:47:25

标签: assembly arduino interrupt

我遇到了使中断工作的问题。

我想在装配中制作红绿灯,红/绿,红/黄,红/红和绿/红的顺序正常。问题在于中断。我希望中断让系统进入“紧急”模式,并在黄色一秒钟之后将摊位灯设为红色,但是当我按下按钮时它没有做任何事情......

这是代码。希望有人能帮助我:

.nolist
.include "m328pdef.inc" ; ATMega328p definition file
.list
;---------------------------------------------------
; Semaphore definition
; (to be adjusted case by case)
;---------------------------------------------------
.equ semaphore=PORTB
.equ GreenNS=0 ; Bit 0
.equ YellowNS=1 ; Bit 1
.equ RedNS=2 ; Bit 2
.equ GreenEW=3 ; Bit 3
.equ YellowEW=4 ; Bit 4
.equ RedEW=5 ; Bit 5

.equ    fq  = 16000000      ;xtal frequency

;----------------------------------------------------
.dseg ; Variable definition in SRAM
;----------------------------------------------------
.org SRAM_START
state: .db 0 ; present state
;----------------------------------------------------
.cseg ; Code segment
;----------------------------------------------------

.org 0
    rjmp main

RESET:
    rjmp main


.org 0x0002
;mov r19, r16

in r16, SREG

rjmp State_emr0

;reti   

;rjmp main


main:
rcall initsystem

dispatcher:

lds r16,state

cpi r16,0
breq State0
cpi r16,1
breq State1
cpi r16,2
breq State2
cpi r16,3
breq State3
cpi r16,4
breq State4
cpi r16,5
breq State5
cpi r16,6
breq State6

; more code with the states

; and now the part with the initializations and the interrupt function

State_emr0:
;---------------------------------------------------

ldi r16,(1<<YellowEW)+(1<<YellowNS)
out semaphore,r16

;wait 1s
ldi r16, 10
rcall r16delay

;ldi r16,10
;sts state, r16

ldi r16,(1<<RedEW)+(1<<RedNS)
out semaphore,r16

;wait 15s
ldi r16, 150
rcall r16delay

;ldi r16, 7
;sts state, r16

out SREG, r16


reti

    initsystem:

ldi r16,LOW(RAMEND)
out SPL,r16
ldi r16,HIGH(RAMEND)
out SPH,r16

ldi r16, 0b00111111     ;set PB0, 1, 2, 3, 4 and 5 as output
out DDRB, r16
out PORTB, r16

ldi r16, 0x00                ; 
out DDRD, r16              ; set port D as input (signal from button          
out PORTD, r16               ; arrives on pin 2)


ldi r16, 0b00000001     ; activate INT0
sts EIMSK, r16

ldi r16, 0b00000101     ; set both INT's to be triggered by any logical                                                 
sts EICRA, r16             ; change


ldi r16,0 ; define initial state
sts state, r16

ldi r19,0

sei


 rjmp dispatcher

很抱歉长代码,但我想为您提供帮助我所需的一切。

提前致谢

0 个答案:

没有答案