搜索
bottom↓
回复: 22

mega8a 省电模式下T2唤醒有奖求助

[复制链接]

出0入0汤圆

发表于 2015-3-10 09:26:42 | 显示全部楼层 |阅读模式
mega8a 省电模式下T2异步时钟唤醒有奖求助------------------------目标:板子使用内部晶振8M,外接32.768手表晶振,T2作为省电模式下的唤醒源,5秒led闪烁一次。调试通过的话奖一块MSP430的利尔达开发板,如图所示,MSP430开发板自带有仿真器

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

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

出0入0汤圆

 楼主| 发表于 2015-3-10 11:06:27 | 显示全部楼层
哪位大侠帮忙一下

出0入0汤圆

发表于 2015-3-10 11:16:35 | 显示全部楼层
LZ好多飞币呀

出0入0汤圆

发表于 2015-3-10 11:18:43 | 显示全部楼层
楼主有什么问题?

出0入0汤圆

 楼主| 发表于 2015-3-10 11:44:59 | 显示全部楼层
lcw_swust 发表于 2015-3-10 11:18
楼主有什么问题?

发现外部的异步时钟幅度非常小,虽然有起振

出0入0汤圆

 楼主| 发表于 2015-3-10 11:47:45 | 显示全部楼层
/*#pragma interrupt_handler timer2_ovf_isf:5
void timer2_ovf_isf(void)
{
  
  static uchar bflag;
  bflag++;
  //TCNT2 = 0X83;//初值
  //if(time_flag2<5000) time_flag++;
  bflag &=1;
  if(bflag)
  {
          clr_red;
  }
  else
  {
          set_red;
  }
}

出0入0汤圆

 楼主| 发表于 2015-3-10 11:53:10 | 显示全部楼层

头像不错

出0入16汤圆

发表于 2015-3-10 11:54:15 | 显示全部楼层
http://www.eet-china.com/ARTICLE ... DF?SOURCES=DOWNLOAD
AVR有份文档,你看看有没有帮助

出0入0汤圆

 楼主| 发表于 2015-3-10 11:55:39 | 显示全部楼层
howmoney 发表于 2015-3-10 11:54
http://www.eet-china.com/ARTICLES/2003APR/PDF/2003APR04_MPR_EMS_AN5.PDF?SOURCES=DOWNLOAD
AVR有份文档 ...

感谢,我下来看看

出0入0汤圆

发表于 2015-3-10 11:59:35 | 显示全部楼层
lnso 发表于 2015-3-10 11:44
发现外部的异步时钟幅度非常小,虽然有起振

幅度小对功能有影响吗?
看看晶振旁的电容是否合适,单片机内好像也有电容。
还要考虑示波器探头的影响,一般要用10倍衰减档测量。

出0入0汤圆

 楼主| 发表于 2015-3-10 12:34:06 | 显示全部楼层
lcw_swust 发表于 2015-3-10 11:59
幅度小对功能有影响吗?
看看晶振旁的电容是否合适,单片机内好像也有电容。
还要考虑示波器探头的影响, ...

我没有外接电容,

出0入0汤圆

发表于 2015-3-10 22:15:01 | 显示全部楼层
楼主直接Timer2设置1024分频;5/(1024/32768)=160;TCNT2=256-160=96;
Timer2工作周期为5s中断一次,进入中断翻转引脚;其余时间CPU直接进入SLEEP好了,感觉这样好点

出0入4汤圆

发表于 2015-3-11 14:02:33 | 显示全部楼层
省电模式下io口等模块是不工作,只有少数几个模块工作,要退出省电模式,灯灭后再进入省电模式,

出0入0汤圆

 楼主| 发表于 2015-3-11 14:24:34 | 显示全部楼层
贴上代码,各位高手分析一下//外部中断涉及三个寄存器:MCUCR GICR GIFR
void en_int(void)//外部中断1,此程序只用到一个外部中断,即键盘输入检测
{
        GICR = 1<<INT0;
        //GICR = (1<<INT1);
        //MCUCR = 0xa0;//外部中断1为低电平触发方式 源程序掉电模式
        MCUCR = 0xb0;//省电模式
}
void dis_int(void)
{
        GICR = 0;
        MCUCR = 0;
}
//定时计数器0涉及个4寄存器:TCCR0 TIMSK TIFR TCNT0
void en_timer0(void)
{
        TCCR0 = 0x05;                //1024分频 周期: 1/8000000*1024=0.000128S  
        TCNT0 = 0x4b;       //(0X100-0X4B)*0.000128=0.023168S发生一次中断
        TIFR = (0<<TOV0);   //溢出标志
        TIMSK = (1<<TOIE0); //溢出中断使能
}
void dis_timer0(void)
{
        TCCR0 = 0x05;
        TCNT0 = 0x4b;
        TIMSK = (0<<TOIE0);
}
void timer2_init(void)
{
TCCR2 = 0x60;
ASSR  = 1<<AS2; //异步时钟
TCNT2 = 0xff; //定时时间1秒
TCCR2 = (1<<CS22)|(1<<CS21)|(1<<CS20); //分频比1024,0x07
}
#pragma interrupt_handler timer2_ovf_isr:iv_TIMER2_OVF
void timer2_ovf_isr(void)
{
TCNT2 = 0x60;
i++;
if(i==2){PORTC ^= BIT0 ;i=0;}

}

void main (void)
{
        uchar i,j;
        //op_flag = 0;
       
        //uint flagpasswordgroup=0;
        uchar TmpBuff[13];
        //uchar TmpShare[1];
       
        dis_int();
        CLI();
        i=0;
        delay_ms(130);
        beep1();

          E2prom_Read(0x0b, TmpBuff, 9);//
         

       
          
        close_flag=0x01;
        errfp_flag=0x00;
        wakeinit_ports();
        clr_red;  clr_green; clr_leden;
        beep1();
        set_leden;  set_red; set_green;
        //至此,初始化完毕
        //en_time2();
  for (;;) //上电后的大循环
     {
              sleepinit_ports();
        dis_timer0();
        en_int();
        SEI();  
        //en_time2();
        POWERDOWN();//进入休眠模式,等持INT1触发中断        
        wait;wait;                       
        dis_int();
        wakeinit_ports();
        en_timer0();
        while(1)
                {
                //
                }
        }

出0入0汤圆

发表于 2015-3-11 16:54:31 | 显示全部楼层
不知道你的具体问题,从程序上初步看没有找到延时,我用M48时用过这种方法,外接32K,没有用电容,效果很好;
芯片中有一个小缺点,就是在使用异步时钟的时候,睡觉之前一定要等上一个时钟周期,芯片用这一段时间处理内部的定时器,因此,分频在可用的范围要用最小分频,减少这个等待的时间;

出0入0汤圆

发表于 2015-3-11 19:11:58 | 显示全部楼层
AS6.2平台谁用谁知道,挺好的,就是大了点;
/*
* vs_proj_atmega8.c
*
* Created: 2015-3-10 11:17:57
*  Author: keliang.yao
*/


#include "../src/user_config.h"

void SysControlCPU(BOOL cpu_status)
{
        set_sleep_mode(SLEEP_MODE_PWR_SAVE);
        cli();
        if(cpu_status == true)
        {
                sleep_enable();
                sei();
                sleep_cpu();
                sleep_disable();       
        }
        sei();
}

int main(void)
{
        Init_System();
        for(uint8_t i=0; i<10; i++)
        {
                _delay_ms(200);
        }
        SysControlCPU(true);
    while(true)
    {
        //TODO:: Please write your application code
                SysControlCPU(true);
                _BIT_XOR(PORTC, 0);
#if 0
                _BIT_SET(PORTC, PORTC4);
                _delay_ms(500);
                _BIT_CLR(PORTC, PORTC4);
                _delay_ms(500);
#endif
    }
        return (0);
}

ISR(INT0_vect)
{
        cli();
        _BIT_SET(PORTC, PORTC0);
        sei();
}

ISR(INT1_vect)
{
        cli();
        _BIT_CLR(PORTC, PORTC0);
        sei();
}

ISR(TIMER2_OVF_vect)
{
        cli();
        TCNT2 = 96;
        sei();
}
写了个楼主自己看看,有没有问题楼主自己验证啊

出0入0汤圆

 楼主| 发表于 2015-3-17 11:17:27 | 显示全部楼层
lcw_swust 发表于 2015-3-10 11:59
幅度小对功能有影响吗?
看看晶振旁的电容是否合适,单片机内好像也有电容。
还要考虑示波器探头的影响, ...

硬件的问题,换了一块板子后T2可以在省电模式下唤醒,但是问题又来了,就是我唤醒后,如何保证只有我的外部中断触发,单片机才响应呢?现在是T2唤醒后,我没有外部触发他,按键也会相应的动作

出0入0汤圆

发表于 2015-3-17 11:31:42 | 显示全部楼层
lnso 发表于 2015-3-17 11:17
硬件的问题,换了一块板子后T2可以在省电模式下唤醒,但是问题又来了,就是我唤醒后,如何保证只有我的外 ...

楼主的意思是外中断引脚电平未变化,却进入了外中断函数?
不会吧,是否休眠前改变了引脚?

出0入0汤圆

发表于 2015-3-17 13:24:31 | 显示全部楼层
是不是唤醒后,立即就去读按键?
手册好像说唤醒后要等一段时间,系统稳定后再工作吧

出0入0汤圆

 楼主| 发表于 2015-3-17 16:22:49 | 显示全部楼层
对,唤醒后,我按按键是有反应的,我要做的是只有外部中断触发了按键才会工作,现在就是T2唤醒后,我按按键依然会有工作,而且省电模式电流在25uA左右
for (;;) //上电后的大循环
     {
        sleepinit_ports();
        dis_timer0();
        en_timer2();
        en_int();
        SEI();
              POWERDOWN();//进入休眠模式,等持INT0触发中断        
        wait;wait;
        
               
                TCCR2 = 0x00; //stop
                //clr_red;
                delay_ms(250);
                delay_ms(250);
    //    TIMSK &= 0x3F;//关闭T/C2中断
    //    TIFR &= 0X3F;  //清零T/C2的中断标志            
        dis_int();
        //TIMSK= 0<<TOIE2;
       // TIMSK  = 0<<TOIE2;
       //dis_timer2();
        wakeinit_ports();
        en_timer0();

      // en_timer2();
          
          
          //set_red;
          //set_green;
          
        delay_ms(250);
        delay_ms(250);
       
      
        
        //timer2_init();
        if(wake_flag==0x02)
        {
             while(1)
                   {
                            //
                   }
       }
}

出0入0汤圆

 楼主| 发表于 2015-3-17 17:22:35 来自手机 | 显示全部楼层
唤醒后,T0也开始工作了,T0有做按键超时退出处理

出0入0汤圆

发表于 2015-3-17 21:59:05 | 显示全部楼层
估计代码处理多半也有问题

出0入0汤圆

 楼主| 发表于 2015-3-17 22:20:48 | 显示全部楼层
yklstudent 发表于 2015-3-17 21:59
估计代码处理多半也有问题

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

本版积分规则

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

GMT+8, 2024-7-23 12:28

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

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