搜索
bottom↓
回复: 14

ATxmega128A1休眠例子

[复制链接]

出0入0汤圆

发表于 2010-3-30 13:04:26 | 显示全部楼层 |阅读模式
一个关于ATxmega128A1休眠例子,使用外部中断唤醒,进入各种休眠模式。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-3-30 13:13:26 | 显示全部楼层
回复【楼主位】firehuohuo
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2010-3-30 13:16:27 | 显示全部楼层
回复【楼主位】firehuohuo
-----------------------------------------------------------------------

还是直接粘程序吧

/***********************************************
****  AVR ATXmega 电源管理_睡眠模式范例      ***
****                                               ***
**** 作者:  firehuohuo                      ***
**** 编译器:WinAVR-20100110                 ***
****                                         ***
****                  2010.3.30                    ***
***********************************************/
/*
        本程序简单的示范了如何令AVR ATXMEGA128A1进入睡眠状态及唤醒
        电源管理及睡眠模式的介绍
        进入最低耗电的掉电模式
        关闭各种模块
        外部中断唤醒
        使用网上购买的Atxmega128A1的最小系统板,并将电源指示LED去掉(LED正常工作电流大概1.1mA[2.7v供电])
    测量的数字万用表是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);
}

出0入0汤圆

发表于 2010-3-31 18:06:11 | 显示全部楼层
顶一下,学习xmega中。

出0入0汤圆

发表于 2010-3-31 18:14:07 | 显示全部楼层
上传文件或图片时,要点击提交按钮下方的“上传文件”。如下图:

(原文件名:上传文件.JPG)

出0入0汤圆

发表于 2010-5-11 18:32:54 | 显示全部楼层
不错 不错

出0入0汤圆

发表于 2010-5-11 20:05:19 | 显示全部楼层
好了吗

出0入0汤圆

发表于 2011-9-15 22:43:27 | 显示全部楼层
楼主还有更多例程序吗 我买了MCUZONE的ATXMEGA128A1开发板,什么例程序都没有带,很需要一点例程序做实验。谢谢楼主

出0入0汤圆

发表于 2011-9-15 23:36:34 | 显示全部楼层
好!!

出0入0汤圆

发表于 2011-9-16 00:09:53 | 显示全部楼层
回复【7楼】smartter  
楼主还有更多例程序吗 我买了mcuzone的atxmega128a1开发板,什么例程序都没有带,很需要一点例程序做实验。谢谢楼主
-----------------------------------------------------------------------

你看xmega 的AN和 datasheet就可以了

欢迎一起学习xmega

出0入0汤圆

发表于 2011-9-16 00:48:42 | 显示全部楼层
记号一下

出0入0汤圆

发表于 2011-9-16 11:46:49 | 显示全部楼层
mark ,不错,收下一了

出0入0汤圆

发表于 2012-3-10 13:28:58 | 显示全部楼层
mark,正要用,谢谢

出0入0汤圆

发表于 2012-9-1 09:13:09 | 显示全部楼层
标记,马上试一下

出0入0汤圆

发表于 2012-10-25 00:44:30 | 显示全部楼层
被迫学习中
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表