首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Atmega8535 INT0 INT1 INT2 INT3

Atmega8535 INT0 INT1 INT2 INT3
EN

Stack Overflow用户
提问于 2013-04-18 18:23:41
回答 1查看 1.7K关注 0票数 0

我使用的是Atmega8535微控制器和STK200开发板,我尝试使用多个外部中断,但由于某些原因,只有INT0工作,而其他中断什么也不做,以下是相关代码:

代码语言:javascript
复制
;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
EN

回答 1

Stack Overflow用户

发布于 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文件,并指定完整的中断向量表,例如

代码语言:javascript
复制
.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
    reti
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16080386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档