ISR_INT0_PD2将不起作用,但主要功能是无限地起作用ATMEGA32

问题描述 投票:0回答:1

下面是在按下PD2时启用中断INT0_vect的代码。该代码永远不会执行ISR,但始终会在主函数的PORT C的7段中执行从0到9的计数器循环。还尝试了sei();而不是在SREG中启用I位。有什么想法吗?


        #include <avr/io.h>
        #include <avr/interrupt.h>
        #include <util/delay.h>

        #define    ISR_INT0_PD2    INT0_vect  

        ISR( ISR_INT0_PD2 ){
            PORTC = 0x00;
           _delay_ms(100);
        }
        int main(void)
        {
            int i=0;
            DDRC=0xff;          //portc is o/p
            PORTC=0x00;         // all pins on portc is 0 volt
            MCUCR |= (1<<1);   // falling edge
            GICR |=(1<<6);     // enable INT0 set pin6
            SREG |=(1<<7);     // set GIE pin7
            while(1)
            {
                for(i=0;i<10;i++)
                {
                    PORTC=i;
                    _delay_ms(1000);
                }
            }
        }
c microcontroller interrupt atmega32
1个回答
2
投票
要执行中断,您需要调用在sei()中定义的<avr/interrupt.h>

https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html#gaad5ebd34cb344c26ac87594f79b06b73

编辑:当我根据与SREG |= (1 << 7)等效的链接删除sei();行时,我犯了一个错误。写完下面的示例后,我意识到寄存器在ATMega32上的命名是不同的,因此很遗憾,下面的代码会丢失'运行。

根据ATMega32的数据表,您的代码应该可以工作,您是否尝试过删除for循环并将PORTC驱动为逻辑高电平(例如PORTC = 255)?我注意到在编写ATMega168的代码时,我使用的LED与while循环中的代码非常暗。

这是在我的ATMega168上运行的代码,如果我将寄存器名称交换为在ATMega32上使用的寄存器名称,则最终得到您的代码:

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define ISR_INT0_PD2 INT0_vect ISR( ISR_INT0_PD2 ){ // If there is a logic change on any pin hold the pins attached to PORTC low for 100ms. PORTC = 0; _delay_ms(100); // Relase PORTC to logic high. PORTC = 255; } int main(void) { DDRC = 255; // Set all pins on PORTC to be outputs. PORTC= 255; // Set all pins on PORTC to be logic high. EIMSK = 0b00000001; // Set external interupt request enable. EICRA = 0b00000001; // Set the external interrupt control register A to so that // any logical change on INT0 generates an interrupt request. sei(); // Set global interupts enable. while(1) { PORTC=255; // Blink the entire PORTC bank. _delay_ms(20); PORTC=0; _delay_ms(20); } }

© www.soinside.com 2019 - 2024. All rights reserved.