ATmega32 模拟比较器代码中断不工作

ATmega32 analog comparator code with interrupts not working

我为我的 ATmega32 编写了一个代码,使用模拟比较器的中断来点亮 LED,但 ISR 不会执行。我正在 Proteus 上测试。

#define F_CPU 8000000UL

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

#define LED_DDR     DDRA                ///< DDR of indicator LED.
#define LED_PORT    PORTA               ///< Port of indicator LED.
#define LED_PIN     PA0                 ///< Pin of indicator LED.

void PORT_INIT(void);
void COMPARATOR_INIT(void);

/*!
 *  @brief ISR for Analog Comparator Interrupt; turn on LED if an interrupt occurs.
 */

ISR(ANA_COMP_vect){
    LED_PORT |= (1<<LED_PIN);
}

int main(void){
    PORT_INIT();
    COMPARATOR_INIT();
    
    sei();                              ///< Enable global interrupts.
    
    while(1);
}

/*!
 *  @brief Initialize ports.
 */

void PORT_INIT(void){
    LED_DDR |= (1<<LED_PIN);
}

/*!
 *  @brief Initialize Analog Comparator.
 */

void COMPARATOR_INIT(void){
    ACSR = 0x00;                    ///< Enable Analog Comparator by setting ACD to 0.
    ACSR |= (ACIE)|(ACIS1);         ///< Enable Analog Comparator Interrupt and set Interrupt Mode to Falling Output Edge.
}

我添加了一行代码来在 while 循环之间切换另一个引脚,以查看是否有任何中断发生,但 while 循环内的引脚一直在切换。我在这里遗漏了什么吗?

编辑:

ATMega32 位宏是实际的位号 (0, 1),当用于寄存器的按位表达式时需要左移。

ACSR |= (ACIE)|(ACIS1);
应该是
ACSR |= (1 << ACIE)|(1 << ACIS1);


这里有很多地方可能出错。而且我没有看到任何明显的错误(除了上述内容)。

I added a line of code to toggle another pin between the while loop to see if any interrupts at all occur but the pin inside the while loop keeps toggling

我不明白这是什么意思 - 你能为这个测试添加一个代码片段吗?

下面是我会采取的一些故障排除步骤。

  1. 你能验证这段代码可以点亮 LED 吗?

这可以隔离 LED 代码/电路的问题。
试试这样的主要功能:

#include <util/delay.h>
//...
int main(void){
    PORT_INIT();
    //COMPARATOR_INIT();
        
    //sei();                              ///< Enable global interrupts.
        
    while(1)
    {
        LED_PORT |= (1<<LED_PIN);
        _delay_ms(1000);
        LED_PORT = 0;
        _delay_ms(1000);
    }
}

}
  1. 如果可行,还有更多需要使用比较器检查的内容。

你是如何刺激比较器输入的?你有电压表来验证应该触发比较器吗?您要向哪些引脚施加电压?