我使用的是Atmega8535微控制器和STK200开发板,我尝试使用多个外部中断,但由于某些原因,只有INT0工作,而其他中断什么也不做,以下是相关代码:
;Interrupt Vector Addresses
.equ INT0addr=$001 ;External Interrupt0 Vector Address
.equ INT1addr=$002
.equ INT2addr=$003
.equ INT3addr=$004
.equ INT4addr=$005
//interrupts
.org INT0addr
rjmp INT0 ;External Interrupt0 Vector
.org $0015 ;Program address
.org INT1addr
rjmp INT1 ;External Interrupt1 Vector
.org $0015 ;Program address
.org INT2addr
rjmp INT2 ;External Interrupt0 Vector
.org $0017
.org INT3addr
rjmp INT3 ;External Interrupt0 Vector
.org $0018
.org INT4addr
rjmp INT4 ;External Interrupt0 Vector
.org $0019
;External Interrupt0 Service Routine
INT0: cli ;Prevent any more interrupts while ISR is running
rjmp reset
reti ;Return and enable interrupts again
;External Interrupt1 Service Routine
INT1: cli ;Prevent any more interrupts while ISR is running
rjmp reset
reti ;Return and enable interrupts again
;External Interrupt1 Service Routine
INT2: cli ;Prevent any more interrupts while ISR is running
rjmp reset
reti ;Return and enable interrupts again
;External Interrupt1 Service Routine
INT3: cli ;Prevent any more interrupts while ISR is running
rjmp reset
reti ;Return and enable interrupts again
;External Interrupt1 Service Routine
INT4: cli ;Prevent any more interrupts while ISR is running
rjmp reset
reti ;Return and enable interrupts again发布于 2013-04-25 17:46:35
您可能对此处理器的要求有点过高。根据processor reference (pg.65)该处理器只有3个外部中断INT0、INT1和INT2 (分别在PORTD.2、PORTD.3和PORTB2上) ...同样值得一读的是68ff页!
我没有看到您最初设置了全局中断使能位(SREG的位7),该位在复位后为0,并防止任何中断被处理,而且必须启用单个中断(寄存器GICR)
您的代码中有很多多余的.org (例如,第11、13行)。
为了清晰起见,我建议您包含特定于设备的inc文件,并指定完整的中断向量表,例如
.nolist
.include <m8535def.inc>
.list
.org 0x0000
; .... highest priority
jmp V_RESET ; Reset
jmp V_ExtINT0 ; External Interrupt 0
jmp V_ExtINT1 ; External Interrupt 1
jmp V_NOINT ; Timer/Counter2 Compare Match
jmp V_NOINT ; Timer/Counter2 Overflow
jmp V_NOINT ; Timer/Counter1 Capture Event
jmp V_NOINT ; Timer/Counter1 Compare Match A
jmp V_NOINT ; Timer/Counter1 Compare Match B
jmp V_NOINT ; Timer/Counter1 Overflow
jmp V_NOINT ; Timer/Counter0 Overflow
jmp V_NOINT ; SPI Serial Transfer Complete
jmp V_NOINT ; USART, RX Complete
jmp V_NOINT ; USART Data Register Empty
jmp V_NOINT ; USART, TX Complete
jmp V_NOINT ; ADC Conversion Complete
jmp V_NOINT ; EEPROM Ready
jmp V_NOINT ; Analog Comparator
jmp V_NOINT ; Two-wire Serial Interface
jmp V_ExtINT2 ; External Interrupt Request 2
jmp V_NOINT ; TimerCounter0 Compare Match
jmp V_NOINT ; Store Program Memory Read
; .... lowest priority
V_RESET:
; define stack pointer
; set individual interrupt bits
; initialize ports, etc.
sei ; enable general interrupts
MAIN:
rjmp MAIN
V_ExtINT0:
; INT0 handler
reti
V_ExtINT1:
; INT1 handler
reti
V_ExtINT2:
; INT2 handler
reti
V_NOINT:
; e.g. flash a LED otherwise unused to show abnormal condition
retihttps://stackoverflow.com/questions/16080386
复制相似问题