lnso 发表于 2015-3-10 09:26:42

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

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

lnso 发表于 2015-3-10 11:06:27

哪位大侠帮忙一下

shower.xu 发表于 2015-3-10 11:16:35

LZ好多飞币呀{:titter:}

lcw_swust 发表于 2015-3-10 11:18:43

楼主有什么问题?

lnso 发表于 2015-3-10 11:44:59

lcw_swust 发表于 2015-3-10 11:18
楼主有什么问题?

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

lnso 发表于 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;
}
}

lnso 发表于 2015-3-10 11:53:10

shower.xu 发表于 2015-3-10 11:16
LZ好多飞币呀

头像不错

howmoney 发表于 2015-3-10 11:54:15

http://www.eet-china.com/ARTICLES/2003APR/PDF/2003APR04_MPR_EMS_AN5.PDF?SOURCES=DOWNLOAD
AVR有份文档,你看看有没有帮助

lnso 发表于 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有份文档 ...

感谢,我下来看看

lcw_swust 发表于 2015-3-10 11:59:35

lnso 发表于 2015-3-10 11:44
发现外部的异步时钟幅度非常小,虽然有起振

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

lnso 发表于 2015-3-10 12:34:06

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

我没有外接电容,

yklstudent 发表于 2015-3-10 22:15:01

楼主直接Timer2设置1024分频;5/(1024/32768)=160;TCNT2=256-160=96;
Timer2工作周期为5s中断一次,进入中断翻转引脚;其余时间CPU直接进入SLEEP好了,感觉这样好点

kcfoo1 发表于 2015-3-11 14:02:33

省电模式下io口等模块是不工作,只有少数几个模块工作,要退出省电模式,灯灭后再进入省电模式,

lnso 发表于 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;
        //uchar TmpShare;
       
        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)
              {
              //
              }
        }

mcu5i51 发表于 2015-3-11 16:54:31

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

yklstudent 发表于 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();
}
写了个楼主自己看看,有没有问题楼主自己验证啊

lnso 发表于 2015-3-17 11:17:27

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

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

lcw_swust 发表于 2015-3-17 11:31:42

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

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

yklstudent 发表于 2015-3-17 13:24:31

是不是唤醒后,立即就去读按键?
手册好像说唤醒后要等一段时间,系统稳定后再工作吧

lnso 发表于 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)
                   {
                            //
                   }
       }
}

lnso 发表于 2015-3-17 17:22:35

唤醒后,T0也开始工作了,T0有做按键超时退出处理

yklstudent 发表于 2015-3-17 21:59:05

估计代码处理多半也有问题

lnso 发表于 2015-3-17 22:20:48

yklstudent 发表于 2015-3-17 21:59
估计代码处理多半也有问题

在线吗?发源码给你,帮我看看
页: [1]
查看完整版本: mega8a 省电模式下T2唤醒有奖求助