MiniCat 发表于 2013-1-24 14:49:20

MEGA8A低功耗问题<省电模式+内部8M晶振+定时器2唤醒>

本帖最后由 MiniCat 于 2013-1-24 14:57 编辑

Mega8A,内部8MHz晶振,外部接了个32.768KHz的晶振,省电模式,定时器2溢出中断唤醒,这种方式为什么进入睡眠之后无法唤醒?睡过头啦?
代码:
{       
cli();
port_init();        //IO口初始化
timer2_init();
MCUCR = 0x00;        //单片机工作状态寄存器 INT0 低电平触发 INT1 下降沿触发
TIMSK = 0x45;        //定时器中断1、2、3
sei();
MCUCR |= BIT(SE)|BIT(SM1)|BIT(SM0);
asm volatile ("sleep" : : );//进入省电模式
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
}

//TIMER2 initialize - prescale:1024
// WGM: Normal
// desired value: 5.01Sec
// actual value:5.000Sec (0.2%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR= 0x08; //set async mode
TCNT2 = 0xE0; //setup
OCR2= 0x20;
TCCR2 = 0x07; //start
}

ISR(SIG_OVERFLOW2)
{
        TCCR2=0;
}

MiniCat 发表于 2013-1-24 14:57:22

外接了个32.768K的晶振用于异步驱动定时器2唤醒睡眠中的单片机,不知道为什么,睡着了就再也没醒过

MiniCat 发表于 2013-1-24 16:05:36

今天有人在吗?帮我瞅瞅呀

lcw_swust 发表于 2013-1-24 16:45:04

本帖最后由 lcw_swust 于 2013-1-24 16:47 编辑

仔细看手册


我是这样用的
//--------------------------------------------------
//                T2初始化:CTC模式,匹配中断频率:32768/128=256Hz
//--------------------------------------------------
void timer2_init(void)
{
        TCCR2 = 0x00; //stop
        ASSR= 0x08; //set async mode
        TCNT2 = 0x00; //setup
        OCR2= 0x7f;//0x7f;
        TCCR2 = 0x09; //start
        while(ASSR&0X07);//等待T2操作
}

skynet 发表于 2013-1-24 16:46:52

兄弟,M8搞低功耗真的很累...........
低功耗,永远的430啊430{:lol:}{:tongue:}

MiniCat 发表于 2013-1-24 17:03:58

恩 我也找到原因了,感谢楼上的2位,是因为异步寄存器没有更新完成就进入休眠,所以永远也醒不来了,        while(TCN2UB!=0);
        while(TCR2UB!=0);
        while(OCR2UB!=0);
现在可以了。

MiniCat 发表于 2013-1-25 08:56:48

lcw_swust 发表于 2013-1-24 16:45 static/image/common/back.gif
仔细看手册




还有一个问题想请教下您,AVR在省电模式下要关闭看门狗,在休眠时会不会出现程序跑飞了,永远睡着了的现象呢?

MiniCat 发表于 2013-1-25 08:57:30

skynet 发表于 2013-1-24 16:46 static/image/common/back.gif
兄弟,M8搞低功耗真的很累...........
低功耗,永远的430啊430

是的,M8怎么调功耗都比430要高很多,没办法,领导钟爱AVR,我们只是打工的。

lcw_swust 发表于 2013-1-25 09:11:31

MiniCat 发表于 2013-1-25 08:56 static/image/common/back.gif
还有一个问题想请教下您,AVR在省电模式下要关闭看门狗,在休眠时会不会出现程序跑飞了,永远睡着了的现 ...

我做了个闹钟,也是用的省电模式T2唤醒,一直没开看门狗,到现在用了半年多一直没出问题。

MiniCat 发表于 2013-1-25 10:05:00

lcw_swust 发表于 2013-1-25 09:11 static/image/common/back.gif
我做了个闹钟,也是用的省电模式T2唤醒,一直没开看门狗,到现在用了半年多一直没出问题。 ...

哦哦。。那应该没什么问题滴,我省点模式下有88uA电流,掉电的时候还有6uA,这个省电模式的电流对吗?

lcw_swust 发表于 2013-1-25 10:23:13

MiniCat 发表于 2013-1-25 10:05 static/image/common/back.gif
哦哦。。那应该没什么问题滴,我省点模式下有88uA电流,掉电的时候还有6uA,这个省电模式的电流对吗? ...

参考手册里的那个表格“省电模式电流和VCC的关系“,电流在10uA左右才算正常,具体注意事项参考“最小化功耗”那一章



MiniCat 发表于 2013-1-25 10:45:58

lcw_swust 发表于 2013-1-25 10:23 static/image/common/back.gif
参考手册里的那个表格“省电模式电流和VCC的关系“,电流在10uA左右才算正常,具体注意事项参考“最小化 ...

Thank You!我再研究研究,不明白再问您!

MiniCat 发表于 2013-1-27 16:27:33

lcw_swust 发表于 2013-1-25 10:23 static/image/common/back.gif
参考手册里的那个表格“省电模式电流和VCC的关系“,电流在10uA左右才算正常,具体注意事项参考“最小化 ...

您好,再请教您个问题,我现在AVR上5秒钟内,电流是14uA,5秒钟过后就一直升,升到500uA左右又掉下来,然后就一直掉到60uA左右停止了,现象非常怪异,目前就一个单片机在运行,没有其他任何东西了。

MiniCat 发表于 2013-1-27 16:30:52

本帖最后由 MiniCat 于 2013-1-27 16:48 编辑

lcw_swust 发表于 2013-1-25 10:23 static/image/common/back.gif
参考手册里的那个表格“省电模式电流和VCC的关系“,电流在10uA左右才算正常,具体注意事项参考“最小化 ...void OS_Sleep(void)
{
        SFIOR |=BIT(PUD);
        ACSR |=BIT(ACD);
        ADCSRA &=~BIT(ADEN);
        LED_OFF;
        wdt_disable();
        MCUCR = BIT(SE)|BIT(SM1)|BIT(SM0);
        asm volatile ("sleep" : : );//进入省电模式
        asm volatile ("nop");
        asm volatile ("nop");
        asm volatile ("nop");
        asm volatile ("nop");
        asm volatile ("nop");
        asm volatile ("nop");
        MCUCR &=~BIT(SE);
}
void OS_WakeUp(void)
{
        watchdog_init();
        SFIOR &=~BIT(PUD);
        ACSR &=~BIT(ACD);
}基本每次唤醒了再睡着了,都会是这样一个过程,电流很不稳定。IO口目前只有一个灯在用,其余都悬空了。

MiniCat 发表于 2013-1-27 16:40:27

本帖最后由 MiniCat 于 2013-1-27 16:48 编辑

lcw_swust 发表于 2013-1-25 10:23 static/image/common/back.gif
参考手册里的那个表格“省电模式电流和VCC的关系“,电流在10uA左右才算正常,具体注意事项参考“最小化 ...

我一个一个试过去,发现是内部上拉电阻的问题,关闭上拉电阻,电流14uA,不稳定,不关闭上拉电阻,电流是97uA,就不会出现跳变的现象,这咋子解释呢?

lcw_swust 发表于 2013-1-28 10:38:28

MiniCat 发表于 2013-1-27 16:40 static/image/common/back.gif
我一个一个试过去,发现是内部上拉电阻的问题,关闭上拉电阻,电流14uA,不稳定,不关闭上拉电阻,电流是 ...

楼主可不可以把电路图弄出来看看?
关闭上拉电阻电流不稳定是因为输入口容易受干扰出现高低电平,IO内部电路翻转会消耗电流。
就算是IO不翻转,当输入口的电压位于1/2VCC附近也会消耗较大的电流。

MiniCat 发表于 2013-1-30 11:06:44

lcw_swust 发表于 2013-1-28 10:38 static/image/common/back.gif
楼主可不可以把电路图弄出来看看?
关闭上拉电阻电流不稳定是因为输入口容易受干扰出现高低电平,IO内部 ...


系统供电3.3V。
没用的IO口悬空了,刚才量了下,不加上拉的时候,这些IO口的电平有的是0.36V,有的是1.33V,然后在进入休眠后 这些电平会有小幅度的变化,0.38V、1.36V,所以可以判定那些电流是这些空闲的IO口产生的,怎么才能消除这些电平呢?我初始化的时候已经给他们一个明确的电平了0或者1,难道不加上拉的时候,这些电平都不能稳定的达到预定值?

MiniCat 发表于 2013-1-30 11:08:37

lcw_swust 发表于 2013-1-28 10:38 static/image/common/back.gif
楼主可不可以把电路图弄出来看看?
关闭上拉电阻电流不稳定是因为输入口容易受干扰出现高低电平,IO内部 ...

目前测试的时候只有一个MCU在工作,其他的器件我全都拆下去了。

lcw_swust 发表于 2013-1-30 11:39:25

MiniCat 发表于 2013-1-30 11:06 static/image/common/back.gif
系统供电3.3V。
没用的IO口悬空了,刚才量了下,不加上拉的时候,这些IO口的电平有的是0.36V,有的是1.3 ...

楼主用的Mega48?
貌似与Mega8有些区别。
IO口悬空时,若用万用表去量直流电压,应该接近0V才对,因为万用表电压档内阻约10M欧。
建议用示波器测量IO口,看单片机是否正常。
不知楼主使能内部上拉电阻时是不是先写DDR后写PORT?

MiniCat 发表于 2013-1-30 14:25:33

lcw_swust 发表于 2013-1-30 11:39 static/image/common/back.gif
楼主用的Mega48?
貌似与Mega8有些区别。
IO口悬空时,若用万用表去量直流电压,应该接近0V才对,因为万用 ...

用的是mega8 原理图是48的,没改。
是用外用表量的,我用示波器试试去,先写的PORTX 后写DDRX。

lcw_swust 发表于 2013-1-30 14:55:53

MiniCat 发表于 2013-1-30 14:25 static/image/common/back.gif
用的是mega8 原理图是48的,没改。
是用外用表量的,我用示波器试试去,先写的PORTX 后写DDRX。 ...

听说,若要使能内部上拉电阻,得先写DDR,后写PORT。
想要降低功耗,一般不允许输入脚悬空,需要使能上拉或设置为输出。

zl_123 发表于 2014-7-15 10:44:37

mark                                          
页: [1]
查看完整版本: MEGA8A低功耗问题<省电模式+内部8M晶振+定时器2唤醒>