打印
[AVR单片机]

atmega128低功耗

[复制链接]
1365|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
西瓜2011|  楼主 | 2019-6-13 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对低功耗不熟,原有atmega128硬件外接8M晶振,现在要改成低功耗,定时器溢出中断唤醒,,这样的话 睡眠模式是不是只能采用ADC噪声抑制模式?貌似功耗也是ma级的啊,用其它睡眠模式的话,要怎么改呢?

使用特权

评论回复

相关帖子

沙发
airwill| | 2019-6-15 17:15 | 只看该作者
如果你需要更低的睡眠模式, 可以选用其他模式, 比如 掉电模式, Standby 模式
看你软件怎么安排咯

使用特权

评论回复
板凳
阿泉爱学习| | 2019-6-18 09:07 | 只看该作者
atmega128不是内部有晶振么   

使用特权

评论回复
地板
西瓜2011|  楼主 | 2019-6-18 14:45 | 只看该作者
airwill 发表于 2019-6-15 17:15
如果你需要更低的睡眠模式, 可以选用其他模式, 比如 掉电模式, Standby 模式
看你软件怎么安排咯 ...

掉电模式能用定时器溢出中断唤醒吗?看手册上好像是只能外部中断唤醒啊

使用特权

评论回复
5
西瓜2011|  楼主 | 2019-6-18 14:55 | 只看该作者
阿泉爱学习 发表于 2019-6-18 09:07
atmega128不是内部有晶振么

要实现定时器溢出中断唤醒,看手册上好像只能用异步时钟,不知道是不是这样

使用特权

评论回复
6
airwill| | 2019-6-18 21:01 | 只看该作者
掉电模式只能外部中断唤醒, 但可以用看门狗唤醒

使用特权

评论回复
7
jcdzxh| | 2019-6-23 21:53 | 只看该作者
用慢时钟驱动异步tim

使用特权

评论回复
8
西瓜2011|  楼主 | 2019-7-8 15:02 | 只看该作者
好尴尬,怎么试都不行原来是钟振加错了地方。。

使用特权

评论回复
9
西瓜2011|  楼主 | 2019-7-8 15:06 | 只看该作者
本帖最后由 西瓜2011 于 2019-7-8 15:15 编辑

这是一个测试程序,有不足的地方希望兄弟们指点一下(M128的18、19脚加了一个32.768钟振。熔丝:低位E4,高位D9,扩展位FF。 休眠状态下电流25ua)
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/sleep.h>

#define  F_CPU   8000000UL
/*********************************/  
#define        bit(x)        (1 << (x))      
#define        led_1   (PORTE |= bit(3))//--1
#define led_0        (PORTE &= ~bit(3))//--0
#define        LED1        (PINE & 0X08)
/*********************************/
unsigned int t0_s;
unsigned char led_flag;
/*******************************/
void Init_Timer(void)
{
        TIMSK = 0x00;
        ASSR  = 0x08;        //设置AS0以选择异步时钟源

        TCCR0 = 0x07;        //1024分频
        TCNT0 = 0xF0;   //32.768K辅助晶振 0.5S溢出
        OCR0  = 0x00;

        TIMSK = 0x01;        //仅使能定时器0
}
void Init_Port(void)
{
        PORTA= 0xFF;
        PORTB= 0xFF;
        PORTC= 0xFF;
        PORTD= 0xFF;
        PORTE= 0xFF;
        PORTF= 0xFF;
        PORTG= 0xFF;
        //--
    DDRA = 0;
        DDRB = 0;
        DDRC = 0;
        DDRD = 0;
        DDRE = (1<<DDE3);
        DDRF = 0;
        DDRG = 0;
}
void Init_Mcu()
{
        cli();
        //--
        ACSR=0x80; //禁用模拟比较器
        //--
        Init_Timer();
        Init_Port();
        //---
        wdt_reset();
        WDTCR |= (1<<WDCE)|(1<<WDE);
        WDTCR |= (1<<WDP2)|(1<<WDP1)|(1<<WDP0);
        //---
        sei();
}

void Led_Run()
{
        if(led_flag)
        {
                led_flag=0;
                led_0;
                _delay_ms(50);
                led_1;        
        }
}
/*************************/
int main()
{
        Init_Mcu();
//        led_0;
        //---
        while(1)
        {
                wdt_reset();
                //--
                Led_Run();

                  while(ASSR & (1<<TCN0UB));
//                   set_sleep_mode(SLEEP_MODE_ADC);          //ADC噪声抑制模式
//                set_sleep_mode(SLEEP_MODE_PWR_DOWN);         //掉电模式
//                set_sleep_mode(SLEEP_MODE_PWR_SAVE);         //省电模式
//                set_sleep_mode(SLEEP_MODE_STANDBY);          //STANDBY模式
                set_sleep_mode(SLEEP_MODE_EXT_STANDBY); //扩展STANDBY模式

                   cli();
                 sleep_enable();
                   sei();
                  sleep_cpu();
                  sleep_disable();
                 sei();
                //参考https://blog.csdn.net/huangxb_csu/article/details/3125861
        }
}

/*************************************************************************定时器0中断*****/
ISR(TIMER0_OVF_vect)
{
        sei();
         TCNT0=0xF0;//0.5s        
        //--
        if(t0_s++>=20)
        {
                t0_s=0;
                led_flag=1;
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

2

粉丝