chen1986sl 发表于 2013-3-24 15:38:25

LGT POWER_off 模式下 RTC唤醒 RTC中断程序分析

#include <avr/io.h>
#include <iolgt8f0xa.h>
#define F_CPU 16000000
#include <util/delay.h>
#include <avr/interrupt.h>

#define uchar unsigned char
#define uintunsigned int
#define ulong unsigned long


SIGNAL(RTC_vect)
{
        if(RTCISR & (1 << WKUF))   {RTCSR = RTCSR & 0xfe; }//撤消 POWEROFF 模式

        RTCISR&=~(1<<IF);//清除RTC溢出   //不能使用写1清除 PDF 中有问题

        RTCTOPH=0X00;
        RTCTOPM=0X02;
        RTCTOPL=0X80;        //RTCOP=0X000280AT128HZ5S
       
        PORTA=(1<<PA1);//A1=1
        _delay_ms(100);
        PORTA&=~(1<<PA1);//A1=0
        RTCSR|=(1 << POWOFF);   // 系统掉电
}

int main(void)
{
    CLKPR=0X80;
    CLKPR=0X80;
        DDRA=0XFF;
        PORTA=0X00;
       
        PMCR |= (1 << RC1KEN);   //ENRC1K
        _delay_ms(5);             //等待内部RC1K稳定


        RTCTOPH=0X00;
        RTCTOPM=0X02;
        RTCTOPL=0X80;        //RTCOP=0X0002080AT128HZ5S
       
        RTCISR&=~(1<<IF);//清除RTC溢出   //不能使用写1清除 PDF 中有问题
        RTCISR|=(1<<IEN);//使能RTC中断
       
        SREG|=0X80;   //开总中断
       
       
        while(!(RTCSR & 0x80));   //判断是不是写入有效       
       
        //RTCSR |= (1 << CWEN);   //使能RTC唤醒
        //RTCSR |= (1 << LOAD);   //加载计数
        //RTCSR |= (1 << EN);      //使能RTC//注意这个地方 PDF中是CEN头文件配置是EN

        RTCSR|=(1 << CWEN)|(1 << LOAD)|(1 << EN)|(1 << POWOFF);   
       

    while(1);
}


上面这程序
在RTCSR|=(1 << CWEN)|(1 << LOAD)|(1 << EN)|(1 << POWOFF);   
这个地方不能加入(1 << POWOFF),让LGT 进入掉电模式,否则LGT一直在POWER-OFF模式 进入不了中断

如果不让LGT 进入POWER-OFF模式,可以进入中断,问题又来了:

理想状态是POWER-OFF模式下, 中断程序每5秒进入一次让PA1闪一下,实际引用中采集下外设信息后马上再进入POWER-OFF模式

现在的问题是:头5秒LGT是POWER-OFF模式,观察电流能看到,后5秒LGT是正常工作模式。

贴先上来。继续研究程序。。






chen1986sl 发表于 2013-3-24 22:10:37

晚上又来折腾了2个小时,还是和下午一样的结果。。。

呼叫蛋痛猫。呼叫蛋痛猫。

shoot_123 发表于 2013-3-24 22:41:53

在中断程序中RTCSR|=(1 << POWOFF);这句前加上while(!(RTCSR & 0x80));   试试。

chen1986sl 发表于 2013-3-25 10:09:13

shoot_123 发表于 2013-3-24 22:41 static/image/common/back.gif
在中断程序中RTCSR|=(1

下午发帖的时候 在没加while(!(RTCSR & 0x80));
晚上想来想去,有加上 效果还是一样。

shoot_123 发表于 2013-3-25 17:23:59

      while(!(RTCSR & 0x80));   //判断是不是写入有效      
      
      //RTCSR |= (1 << CWEN);   //使能RTC唤醒
      //RTCSR |= (1 << LOAD);   //加载计数
      //RTCSR |= (1 << EN);      //使能RTC//注意这个地方 PDF中是CEN头文件配置是EN

      RTCSR|=(1 << CWEN)|(1 << LOAD)|(1 << EN);   
//   while(!(RTCSR & 0x80));   //判断是不是写入有效
//                RTCSR|=(1 << POWOFF);
                asm("nop");
                asm("nop");
                asm("nop");

                asm("nop");
                asm("nop");
                asm("nop");
        while(1)                        
        {        if((RTCISR&(1<<IF))==0x02)
                {
                        PORTA=(1<<PA1);
                        _delay_ms(1000);
        //                RTCISR|=(1<<IF);//可以清0
                        RTCISR&=~(1<<IF); //不能清掉
                        if((RTCISR&(1<<IF))!=0x02)
                        PORTA&=~(1<<PA1);
                }
    }

shoot_123 发表于 2013-3-25 17:25:43

进入POWEROFF RTC唤醒后的中断是不执行的。
页: [1]
查看完整版本: LGT POWER_off 模式下 RTC唤醒 RTC中断程序分析