1:我用的REALICE,它的特点是烧完程序后自动运行,但这个时候它的RCON的值不会是手册上给的状态,所以不会走我预想的真正上电的那个程序分支,但恐怖的是,在我认为的另外一个非上电复位的分支有保存数据到EEPROM,所以就把一些混乱的数据保存了,等我再次重新彻底上电,MCU从真正的上电复位程序开始运行,从EEPROM抓出数据,就是刚才的混乱数据,我想这个问题只有那些烧完程序后,彻底断电复位才能运行的仿真烧写器才能解决. 2:那么我选择的上电复位程序的办法就是把教主的两种方法一起用:-),比如 volatile unsigned int RAN_INIT_CODE; void main(void) { unsigned char Buff; RCON &= 0x1f;//Note: Close IPEN if ( RCONbits.RI && RCONbits.TO && RCONbits.PD && (!RCONbits.POR) && (!RCONbits.BOR)) // {//是初次上电 if ( RAN_INIT_CODE != 0xaa55 ) { RAN_INIT_CODE = 0xaa55; RCONbits.POR = 1; RCONbits.BOR = 1; ASensorSingleDoNum = 0;//A传感器单只工作次数 BSensorSingleDoNum = 0;;//B传感器单只工作次数 PulseAvailTemp = 0; //脉冲有效寄存器 Key.allbits = 0; RunFlag.allbits = 0; ScanFlag.allbits = 0; BJFLAG.allbits = 0; ChooseFLag.allbits = 0; EETORam(); ReturnRunFlag(); } } else {//不是初次上电 if( RAN_INIT_CODE == 0xaa55) { if( !RCONbits.RI ) RCONbits.RI = 1;//Do RESET CheckRAM(); if( BJFLAG.Bits.RamCrcErr) { ReturnRunFlag(); BJFLAG.Bits.RamCrcErr = 0; GasValueToEE(); OtherDataToEE(); MonthUseToEE(); } }else{ RAN_INIT_CODE = 0xaa55; RCONbits.POR = 1; RCONbits.BOR = 1; ASensorSingleDoNum = 0;//A传感器单只工作次数 BSensorSingleDoNum = 0;;//B传感器单只工作次数 PulseAvailTemp = 0; //脉冲有效寄存器 Key.allbits = 0; RunFlag.allbits = 0; ScanFlag.allbits = 0; BJFLAG.allbits = 0; ChooseFLag.allbits = 0; EETORam(); ReturnRunFlag(); } } } 3:其实我觉得说不定只要用判断RAM一个特殊值的办法就可以搞定了,不用这么复杂 不知道小生的理解对不对 |