firehuohuo 发表于 2010-3-30 13:04:26

ATxmega128A1休眠例子

一个关于ATxmega128A1休眠例子,使用外部中断唤醒,进入各种休眠模式。

firehuohuo 发表于 2010-3-30 13:13:26

回复【楼主位】firehuohuo
-----------------------------------------------------------------------

第一次发新帖,不熟悉,也不知道例子的附件放上去没有!

firehuohuo 发表于 2010-3-30 13:16:27

回复【楼主位】firehuohuo
-----------------------------------------------------------------------

还是直接粘程序吧

/***********************************************
****AVR ATXmega 电源管理_睡眠模式范例      ***
****                                           ***
**** 作者:firehuohuo                      ***
**** 编译器:WinAVR-20100110               ***
****                                       ***
****                2010.3.30                  ***
***********************************************/
/*
        本程序简单的示范了如何令AVR ATXMEGA128A1进入睡眠状态及唤醒
        电源管理及睡眠模式的介绍
        进入最低耗电的掉电模式
        关闭各种模块
        外部中断唤醒
        使用网上购买的Atxmega128A1的最小系统板,并将电源指示LED去掉(LED正常工作电流大概1.1mA)
    测量的数字万用表是UNI-T UT60E,分辨率0.01uA
        这个程序需要MCU进入休眠状态,未关闭JTAG接口,通过LED的变化来观察程序的运行。
        这个实验里面,用MKII-cn下载线来烧录。
*/

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
//时钟定为内部RC 2MHz,F_CPU=2000000 也可以采用其他时钟
#include <avr/sleep.h>

//管脚定义
#define LED                        0   //PK0 驱动LED,低电平有效

void delay_10ms(unsigned int t)
{
/*
        由于内部函数_delay_ms() 最高延时较短
        262.144mS@1MHz / 32.768ms@8MHz / 16.384ms@16MHz
        故编写了这条函数,实现更长的延时,并能令程序能适应各种时钟频率
*/
        while(t--)
                _delay_ms(10);
}
volatile int sleeptime;
int main(void)
{
        unsigned char i;
        unsigned int tmp;
        sleeptime=0;
    //上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
        cli();
        PORTA.OUT=0xFF;                //不用的管脚使能内部上拉电阻。
        PORTB.OUT=0xFF;
        PORTC.OUT=0xFF;
        PORTD.OUT=0xFF;
        PORTE.OUT=0xFF;
        PORTF.OUT=0xFF;
        PORTH.OUT=0xFF;
        PORTJ.OUT=0xFF;
        PORTK.OUT=0xFF;
        PORTQ.OUT=0xFF;
        PORTR.OUT=0xFF;
        PORTK.DIR=(1<<LED); //Port K的第0口控制LED闪烁
           
        /*
        看门狗定时器(上电默认是关闭的)
        如果系统无需利用看门狗,这个模块也可以关闭。
        若使能,则在任何休眠模式下都持续工作,从而消耗电流。
        在深层次的睡眠模式下,这个电流将占总电流的很大比重。
       
        假设看门狗定时器使能了,关闭程式如下
        1. 在同一个指令内对WDTOE 和WDE 写"1“,即使WDE 已经为"1“
        2. 在紧接的4 个时钟周期之内对WDE 写"0”
        */       
         //1<<WDT_CEN_bp 看门狗修改使能,1<<WDT_ENABLE_bp 使能看门狗,看门狗定时器控制寄存器-WDT.CTRL
        WDT.CTRL=(1<<WDT_CEN_bp)|(1<<WDT_ENABLE_bp);        
         WDT.CTRL=(0<<WDT_ENABLE_bp); //关闭看门狗
        /*
        模数转换器(上电默认是关闭的)
        使能时, ADC在睡眠模式下继续工作。
        为了降低功耗,在进入睡眠模式之前需要禁止ADC。
        重新启动后的第一次转换为扩展的转换。
       
        假设模数转换器使能了,关闭程式如下       
        */
//ADC 控制和状态寄存器A -ADCSRA, 1<<ADC_ENABLE_bp: ADC 使能,0<<ADC_ENABLE_bp: ADC 关闭

        ADCA.CTRLA=(0<<ADC_ENABLE_bp);           
//        MCU.MCUCR=(1<<MCU_JTAGD_bp); //此命令关闭JTAG接口,谨慎使用
//        MCU.MCUCR=(1<<MCU_JTAGD_bp);
       

        //使用PORTC 的第0口作为中断唤醒,低电平唤醒【注:在使用SLEEP_MODE_PWR_DOWN模式时,只能使用电平唤醒,而不能使用上升、下降沿唤醒】
        PORTC.PIN0CTRL=PORT_OPC_TOTEM_gc|PORT_ISC_LEVEL_gc;
        PORTCFG.MPCMASK=0x01;

        PORTC.DIR=(1<<0);
        PORTC.INTCTRL=(PORTC.INTCTRL&~PORT_INT0LVL_gm)|PORT_INT0LVL_MED_gc;
        PORTC.INT0MASK=0x01;
        PMIC.CTRL|=PMIC_MEDLVLEN_bm;
                                               
        while(1)
        {
                sei(); //使能全局中断
                if(sleeptime>=4)
                {
                        sleeptime=0;
                }
                else
                {
                        sleeptime++;
                }
                //Port K的第0口控制LED闪烁
                for (i=0;i<sleeptime+1;i++)//LED闪动是sleep+1次后进入掉电模式的睡眠状态
                {
                        delay_10ms(10);
                        PORTK.OUT&=~(1<<LED);        //点亮LED
                        delay_10ms(10);                       
                        PORTK.OUT|=(1<<LED);        //熄灭LED
                }
                //通过判断sleep值,来进入不同的休眠模式
                switch(sleeptime)
                {
                        case 0:
                        {
                                set_sleep_mode(SLEEP_MODE_PWR_DOWN);        //设定为掉电模式 47.94uA
                        }
                        break;
                        case 1:
                        {
                                set_sleep_mode(SLEEP_MODE_IDLE);                 //868.1uA
                        }
                        break;
                        case 2:
                        {
                      set_sleep_mode(SLEEP_MODE_PWR_SAVE);        //47.95uA
                        }
                        break;
                        case 3:
                        {
                            set_sleep_mode(SLEEP_MODE_STANDBY);                //150.44uA
                        }
                        break;
                        case 4:
                        {
                            set_sleep_mode(SLEEP_MODE_EXT_STANDBY);        //150.48uA
                        }
                        break;
                }
                sleep_mode();                                                                        //进入睡眠状态
        }
}

//使用PORTC 的第0口作为中断唤醒
ISR(PORTC_INT0_vect)
{
        cli();        //禁用全局中断
        delay_10ms(1);
}

shdzbsl 发表于 2010-3-31 18:06:11

顶一下,学习xmega中。

shdzbsl 发表于 2010-3-31 18:14:07

上传文件或图片时,要点击提交按钮下方的“上传文件”。如下图:
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_542610.JPG
(原文件名:上传文件.JPG)

myyule 发表于 2010-5-11 18:32:54

不错 不错

mpu666 发表于 2010-5-11 20:05:19

好了吗

smartter 发表于 2011-9-15 22:43:27

楼主还有更多例程序吗 我买了MCUZONE的ATXMEGA128A1开发板,什么例程序都没有带,很需要一点例程序做实验。谢谢楼主

lixupeng 发表于 2011-9-15 23:36:34

好!!

marco.ma 发表于 2011-9-16 00:09:53

回复【7楼】smartter
楼主还有更多例程序吗 我买了mcuzone的atxmega128a1开发板,什么例程序都没有带,很需要一点例程序做实验。谢谢楼主
-----------------------------------------------------------------------

你看xmega 的AN和 datasheet就可以了

欢迎一起学习xmega

sunicecream 发表于 2011-9-16 00:48:42

记号一下

iamrhq55 发表于 2011-9-16 11:46:49

mark ,不错,收下一了

dzk0620 发表于 2012-3-10 13:28:58

mark,正要用,谢谢

mountainsheep 发表于 2012-9-1 09:13:09

标记,马上试一下

944522464 发表于 2012-10-25 00:44:30

被迫学习中
页: [1]
查看完整版本: ATxmega128A1休眠例子