[信息发布] Atmel Studio6.2的中断程序

[复制链接]
 楼主| cr315 发表于 2025-2-18 23:00 | 显示全部楼层 |阅读模式
单片机是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 | 显示全部楼层
试试下面的代码
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <avr/wdt.h> // 添加看门狗控制头文件

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

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

  13. ISR(INT0_vect) {
  14.     PORTB ^= (1 << PB7); // 仅翻转PB7,避免副作用
  15. }
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 | 显示全部楼层
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>

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

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

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

  12.     // 使能全局中断
  13.     sei();

  14.     while (1) {
  15.         // 主循环
  16.     }
  17. }
zhuotuzi 发表于 2025-2-24 11:14 | 显示全部楼层
试一下我的 程序可以不
自动化陈稳 发表于 2025-4-27 01:30 | 显示全部楼层
你没有明确控制反转操作的目标引脚,这可能导致不必要的引脚操作。
玛尼玛尼哄 发表于 2025-4-28 21:00 | 显示全部楼层
上面的程序可以用吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1448

主题

4810

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部