You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让ATtiny24A MCU进入睡眠模式?代码失效问题求助

ATtiny24A 睡眠模式无法正常进入问题

问题背景

ATtiny24A无法进入睡眠模式,此前同型号MCU上的睡眠代码可正常工作,程序修订及其他模块测试后,新代码失效。

硬件情况

自行设计ATtiny24A编程转接板:

  • 板载LED连接MCU引脚8(对应PORTA5)
  • 外接按键连接MCU引脚13(对应PINA0)

测试代码

为单独验证睡眠模式,编写如下测试代码:

#define F_CPU 1000000UL

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

#define LED PORTA5 //pin 8
#define BT PINA0  //pin 13

int main(void){
   uint8_t clk = 0;

   //SETUP IO PINS 
   DDRA |= 1 << LED;  //setting up LED pin 
   DDRA &= ~(1 << BT);  //setting up tactile button pin
  
   //SETUP INTERRUPT 
   GIMSK |= 1 << PCIE0;
   PCMSK0 |= 1 << PCINT0;
   sei();
   
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);  //setting sleep mode 
   PORTA |= 1 << LED;  //initialize LED on  

   for(uint8_t i = 0; i < 3; i++ ){
       _delay_ms(1000);
   }
   
   sleep_mode(); //enter sleep mode 
   
   while(1){
      PORTA ^= 1 << LED;
      _delay_ms(500);

      if(clk > 5){
           clk = 0;
           sleep_mode();
      }
      clk += 1;

   }
   return 0;
}

ISR(PCINT0_vect, ISR_NAKED);

现象与排查尝试

  • 初始代码上传后,LED持续常亮,从未进入while循环前的首次睡眠。已确认sleep和io库函数、属性有效,编译无警告或错误。
  • 替换为直接寄存器位操作:将set_sleep_mode(SLEEP_MODE_PWR_DOWN)改为MCUCR |= 1 << SM1,sleep_mode()改为MCUCR |= 1 << SE,此时LED亮3秒后持续闪烁,完全忽略循环中的睡眠指令。
  • 改用指针直接操作寄存器(*((volatile unsigned char *) 0x55)) |= 1 << 4设置SM1位,*((volatile unsigned char *) 0x55)) |= 1 << 5设置SE位),现象与上述操作一致。
  • 该MCU上运行LED闪烁、Timer1 PWM输出、引脚变化中断触发等代码均正常;更换同型号MCU后,睡眠问题仍存在。

寻求问题原因及解决方案。


内容的提问来源于stack exchange,提问作者Charles Florestal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:44:51