割り込みを機能させるのに問題があります。
アセンブリで信号機を作りたいのですが、赤/緑、赤/黄、赤/赤、緑/赤のシーケンスが正常に機能しています。問題は割り込みです。割り込みでシステムを「緊急」モードにし、ブース ライトを赤色に点灯させ、1 秒後に黄色に点灯させたいのですが、ボタンを押しても何もしません...
これがコードです。誰かが私を助けてくれることを願っています:
.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
長いコードで申し訳ありませんが、私を助けるために必要なものをすべて提供したいと思います。
前もって感謝します