如何让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
相关产品推荐
相关产品推荐

