cr315 发表于 2025-2-18 23:00

Atmel Studio6.2的中断程序

单片机是mega2560,程序已经够短了,PORTB7引脚***都是高电平,中断有点像是复位,我真的没招了


代码::

#include
#include

int main(void)
{
         DDRB=0x80;
         PORTB=0x00;
         EICRA=0x02;
         EIMSK=0x01;
         sei();
   while(1)
   {
         //TODO:: Please write your application code
   }
}

ISR(INT0_vect)
{
         PORTB=~PORTB;
}

求帮忙

huahuagg 发表于 2025-2-21 18:03

试试下面的代码
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h> // 添加看门狗控制头文件

int main(void) {
    wdt_disable();// 关键!禁用看门狗防止复位
    DDRB= 0x80;   // PB7输出,其他输入
    PORTB = 0x00;   // 初始低电平
    EICRA = 0x02;   // INT0下降沿触发
    EIMSK = 0x01;   // 使能INT0中断
    sei();

    while(1) { __asm__ __volatile__("nop"); } // 避免空循环优化
}

ISR(INT0_vect) {
    PORTB ^= (1 << PB7); // 仅翻转PB7,避免副作用
}

huahuagg 发表于 2025-2-21 18:03

‌看门狗复位‌
ATmega芯片默认不启用看门狗,但部分烧录工具可能意外启用。添加wdt_disable()确保看门狗关闭。

‌中断误操作‌
原始代码使用PORTB=~PORTB会翻转所有PORTB引脚(包括输入引脚),可能导致上拉电阻异常。改为精准操作PB7。

‌信号抖动问题

花间一壶酒sd 发表于 2025-2-23 00:12

可能是看门狗定时器未关闭,导致单片机不断复位。

zhuotuzi 发表于 2025-2-24 11:12

上面的代码试过解决了吗

zhuotuzi 发表于 2025-2-24 11:13

INT0_vect发生了中断吗

zhuotuzi 发表于 2025-2-24 11:13

是不是没有配置INT0_vect啊,所以没法进入中断?

zhuotuzi 发表于 2025-2-24 11:14

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

ISR(INT0_vect) {
    PORTB ^= (1 << PORTB7);// 翻转 PORTB7 引脚
}

int main(void) {
    // 配置 PORTB7 为输出
    DDRB |= (1 << DDB7);

    // 配置 INT0 为上升沿触发
    EICRA |= (1 << ISC01) | (1 << ISC00);
    EIMSK |= (1 << INT0);

    // 使能全局中断
    sei();

    while (1) {
      // 主循环
    }
}

zhuotuzi 发表于 2025-2-24 11:14

试一下我的 程序可以不

自动化陈稳 发表于 2025-4-27 01:30

你没有明确控制反转操作的目标引脚,这可能导致不必要的引脚操作。

玛尼玛尼哄 发表于 2025-4-28 21:00

上面的程序可以用吗
页: [1]
查看完整版本: Atmel Studio6.2的中断程序