打印

12f508 休眠唤醒时 数据丢失

[复制链接]
956|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fzjqc2001|  楼主 | 2016-3-18 16:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问PIC12F508在休眠唤醒后如何获得休眠前的数据。
单片机要休眠唤醒后重新复位。数据也完全清空了。虽然可以知道是为什么复位,但休眠前的数据没有了,请问各位是如何操作的?谢谢!
沙发
NE5532| | 2016-3-18 16:40 | 只看该作者
只要没有失去供电,单片机自己是不会清除RAM里的数据的,检查你自己的程序是不是清除了内存。
另外休眠唤醒也不等于复位,可以继续运行原来的程序,检查你的设计是不是有错。

使用特权

评论回复
板凳
fzjqc2001|  楼主 | 2016-3-18 16:43 | 只看该作者
508是不是从SLEEP();后面运行,是从头开始运行

使用特权

评论回复
地板
fzjqc2001|  楼主 | 2016-3-18 17:13 | 只看该作者

508不是从SLEEP();后面运行,是从头开始运行,我做了测试,确实数据丢失了。但不知道各位是通过什么方法使数据保存下来的?

/***************************************************************************************
目的:由按键产生长亮,长按三秒为暴闪。。
。 3脚输出********************************
      飞凌单片机该型号与PIC12C508相同,但是pic为8脚,8pb513B为6脚,其中,PIC2\7脚不用,
      其他管脚通用。
      日期:2015.4.28
      修改:增加了100MS,50MS,10MS,5MS,1MS,200US,10US,6US,等几种延时的实测值,以备以后产生脉冲时
      可以使用。该实测值为4M晶振4个指令周期,即一条指令1US的情况。使用定时器
日期:2016.3.17

****************************************************************************************/


//#include<pic12f508.h>
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
#define M1 GP1
//#define M2 GP2
//#define M3 GP3
//#define TTLIN GP4
#define TTLOUT GP4
char mos=0;
uint i,time;
char flag;
  __CONFIG(0x0a);
  
  void initio()
  {
          //OSCCAL=0x00;
          TRISGPIO=0b00000010;//
          //OPTION=0xf0;//64分频
          //TMR0=0x00;//使用分频器时初值计算:
          //初值=256-定时时间\(指令周期*分频比))+14/分频比;当分频比大于16时可以不必修正
          //指令周期为4         
          //如 1S定时:256-1000000/(4*64)+14/2=256-6.25+7
          //不分频初值=256-定时时间*指令周期
                    TTLOUT=0;
                    OPTION=OPTION&0X7F;//使能电平变化唤醒功能TRISGPIO清0后OPTION也会清0;
         }
/***************************************************************************
***************************************************************************
****************************延时程序***************************************/
Delay100ms()//实测99.992MS
        {        int x=3702;
                while(x--)
                asm("nop");       
        }
Delay50ms()//实测49.98MS
        {        int x=1851;
                while(x--)
                asm("nop");
               
                       
        }
Delay10ms()//实测10.001MS
        {        int x=369;
                while(x--)
                asm("nop");       
        }
Delay5ms()//实测5.006MS
        {        int x=184;
                while(x--)
                asm("nop");       
        }
Delay1ms()//实测1.01MS
        {        int x=36;
                while(x--)
                asm("nop");       
        }
Delay200us()//实测200us
        {        int x=6;
                while(x--)
                asm("nop");       
        }
Delay100us()//实测100us
        {        int x=2;
                while(x--)
                asm("nop");
                asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
                asm("nop");asm("nop");asm("nop");asm("nop");       
        }
Delay10us()//10US,用于循环结束延时8M4.5US//实测10us
        {       
        asm("nop");asm("nop");asm("nop");asm("nop");
                         
        }
Delay6us()//6US,用于循环结束延时8M4.5US//实测6uS
        {       

                         
        }       

/***************************************************************************
******************************************************************************
****************************延时程序结束***************************************/               
        void main()
        {
          initio();
          //if((GPWUF==0))
          //flag=0;
          
          //mos=0;
          //flag=0;
          
          //if(GPWUF==1)flag=1;//如果为1,说明是休眠唤醒引起的复位
         // else flag=0;
          while(1)
          {         
                  if(M1==0)
                   { //Delay1ms();
                           if(M1==0)
                            {
                                    time=0;
                                    while(M1==0)
                                       {
                                             Delay10ms();  
                                             time++;
                                             if((mos==2)&(time%5==0))
                                               {
                                                       TTLOUT=~TTLOUT;
                                                       
                                                      }  
                                          //if (time==310)break;
                                              }
                                             
                                         if(time<300)
                                         {
                                                 if(mos==0)
                                                 {
                                                         if(flag==0)mos=1;
                                                         else if(flag==1)mos=2;
                                                         
                                                        }
                                                 else mos=0;
                                        //         if((mos==0)&(flag==0)) mos=1;
                                        //          else if((mos==0)&(flag==1)) {mos=3;}
                                        //          else if((mos==1)|(mos==3)) {mos=0; }
                                                 
                                                }
                                        else
                                        {
                                         if(mos==1 ) {mos=2;flag=1;}
                                         else if((mos==2) ){ mos=1; flag=0; }
                                        }                                      
                                   }
                          }
                        switch(mos)
                        {
                        case 0: {//关闭
                                 TTLOUT=0;
                                 M1=M1;
                                 SLEEP();
                                } break;
                        case 1: {//长亮
                                 TTLOUT=1;
                                 
                                } break;
                        case 2: {//10HZ爆闪
                                 TTLOUT=1;
                                 Delay50ms();
                                 TTLOUT=0;
                                 Delay50ms();
                                } break;
                       
                    default:break;
                 }   
                 }
                 
                 }
               

使用特权

评论回复
5
fzjqc2001|  楼主 | 2016-3-18 17:28 | 只看该作者
我需要在唤醒后flag的值为休眠前的值不变。

使用特权

评论回复
6
wuhenyouyu| | 2016-3-21 09:51 | 只看该作者
你用的C编译器,它会自己加一小段初始化程序,用于初始化全部变量。查查你的编译器手册,有个关键字可以防止复位初始化.

使用特权

评论回复
7
yklstudent| | 2016-3-21 10:18 | 只看该作者
楼主应该找出复位的原因

使用特权

评论回复
8
NE5532| | 2016-3-21 10:48 | 只看该作者
1.去找复位的原因,PIC12的狗我不熟悉,但是16的狗是可以弄醒了接着跑的。
2.如果你的狗只能复位,不能接着跑也没关系,RAM不要去清除就可以了。
3.你的RAM复位清除是C编译器干的,怎么关问你的技术支持。
4.12F这么小的单片机,你写C语言写不了几句,都是写汇编,所以我压根就没想过你会有C清除RAM的问题。

使用特权

评论回复
9
fzjqc2001|  楼主 | 2016-3-21 11:31 | 只看该作者
多谢各位!

使用特权

评论回复
10
baoshi_libo| | 2016-3-23 16:04 | 只看该作者
12F508准确的说,是休眠唤醒后,单片机处于复位状态
要想休眠唤醒,程序继续执行,要选择单片机,比如12F629

使用特权

评论回复
11
JY-DX-JY| | 2016-3-23 16:21 | 只看该作者
没用过休眠。如果休眠唤醒后,单片机处于复位状态,感觉这种休眠唤醒功能就不能用。

使用特权

评论回复
12
fzjqc2001|  楼主 | 2016-3-24 17:22 | 只看该作者
忘记说了,已经解决了,是编译器自动初始化了。只需要加条指令就可以。谢谢大家了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

0

粉丝