打印
[51单片机]

RTX51tiny重新上电的时候时钟频率会自动改变~

[复制链接]
2468|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
南国的鳕|  楼主 | 2014-4-11 14:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 南国的鳕 于 2014-4-14 08:39 编辑

有人遇到过这种情况么,用的C8051F392的CPU。
程序烧进去后大概隔一段时间再上电,系统时钟频率会变化很大。。。

void init() _task_ TASK_INIT{
#if DI_EN
        uchar DIStatus;
//        uchar diData;
#endif
        uchar i;
        uchar keystatus = 0xFF;         
//        uchar SysTickCpy;
//        AD.F_Sumclc=0;
//        ulong EqCpy;
#if DI_EN
        DIStatus=0;
        AD.DIData = 0;
        ResetDICnt();
#endif

        SetSaveSeq=0;
        FAutoZero=0;
        FAutoCal=0;

        ModbusOk = 0;

#if AUTO_CALIBRATION_EN
        DispStr2LEDA(64, 64, 64, 64); //----
        DispStr2LEDB(64, 64, 64, 64); //----
#else
        DispStr2LEDA(_0, _0, _0, _0);
        DispStr2LEDB(_0, _0, _0, _0);
#endif
// ADC init
        TSample1=4;TSample2=0;AD.SamplePoint=0;
//AD.SamplePoint=183;

        Init_Device();

        PIN_485DE_RE=BUS_RE;
       

#if AUTO_CALIBRATION_EN
        RAM_FUN03(ADD_BUS_ADDRESS) = 50;       
        EEPWriteBuff(pbFun03(ADD_BUS_ADDRESS), ADD_EEP_FUN03(ADD_BUS_ADDRESS), 2);

        SysTick = 0;
        while(SysTick<10);
       
        RAM_FUN03(ADD_BAUDRATE_NO)=3;
        EEPWriteBuff(pbFun03(ADD_BAUDRATE_NO), ADD_EEP_FUN03(ADD_BAUDRATE_NO), 2);
       
       

        SysTick = 0;
        while(SysTick<10);
       
        RAM_FUN03(ADD_CT1)=5;
        EEPWriteBuff(pbFun03(ADD_CT1), ADD_EEP_FUN03(ADD_CT1), 2);

        for(i=0; i<4; i++){
                SysTick = 0;
                while(SysTick<10);
                RAM_FUN03(ADD_EP_TOTAL_HIGH+i)=0;
                EEPWriteBuff(pbFun03(ADD_EP_TOTAL_HIGH+i), ADD_EEP_FUN03_E(ADD_EP_TOTAL_HIGH+i), 2);
        }

        SysTick = 0;
        while(SysTick<10);
#endif
       
        SetInit();
    IE |= 0x10;    //Usart中断使能


//        MData.DataMode = MODBUS_IDLE;
       
       
       
        SysTick = 1;
        while(SysTick);
        SysTick = 1;

        while(SysTick);

        RSTSRC    = 0x02;//使能VDD监视器作为复位源

        WorkMode = DEF_WORKMODE;
       
#if DI_EN
        for(i=0; i<11; i++){
                RAM_FUN03(ADD_TEMPERATURE+i)=0;
        }
#else
        for(i=0; i<8; i++){
                RAM_FUN03(ADD_TEMPERATURE+i)=0;
        }
#endif
        RAM_FUN03(ADD_PF)=1000;
//        RAM_FUN03(ADD_I1)=0;
//        RAM_FUN03(ADD_P)=0;
//        RAM_FUN03(ADD_Q)=0;
//        RAM_FUN03(ADD_S)=0;

        SM_BUSY = 0;
       
        WatchDogEnable();
       
        FECalced=0;
       
        os_create_task(TASK_KEYSCAN);
        os_create_task(TASK_COMUNICATE);
       
        while(1){
                EA=0;
                SysTickCpy = SysTick;
                EA=1;
        WatchDog();
                        os_wait(K_IVL, 1, 0);
                ADCalculate();
                if(FlashTimer)FlashTimer--;
                if(ADflag){
                        if(WorkMode<WM_SETMODE)ADDisplay();
                        else if(!FlashTimer){
                        ResetFlashTimer();
                        FlashFlag = ~FlashFlag;
                        if(FlashPos<8) dispbuff.map[FlashPos] = (FlashFlag?DispBuffBack.map[FlashPos]:0);
                        else if(FlashPos==8) (dispbuff.Row[LED_ROW_2]) =
                                (FlashFlag ? (DispBuffBack.Row[LED_ROW_2]):0);
                }
                }
        }
}

////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
void KeyScan() _task_ TASK_KEYSCAN{
//        os_wait(K_TMO, 1, 0);

        while(1){

                WatchDog();

       
        ///// key Scan
//        if(SysTickCpy % 4 == 0){ // 10ms

               
               
                keystatus <<= 1;
                keystatus |= 0x11;
               
                if(AD.KeyData12 < 20);                                                 //NK
                else if(AD.KeyData12 < 90)        keystatus &= 0xFE;         //k1
                else if(AD.KeyData12 < 170)        keystatus &= 0xEF;        //K2
                else keystatus &= 0xEE;                                         //k1k2
               
                ////////////////////
               
#if USER_INTERFACE_EN
#if FUNCTION_TYPE==FUN_AUTOCAL
                switch(keystatus){
                        case 0x80:               
                        case 0x08:                //k1k1
                        case 0x88:
                                if(WorkMode < WM_SETMODE){
                                        WorkMode=WM_SETMODE;
                                        SetLedA(-1);
                                        SetLedB(-1);
                                }
                                else{
                                        WorkMode = DEF_WORKMODE;
                                }
                                break;
                        case K_FUN:                //k1        K_FUN
                                if(WorkMode < WM_SETMODE)WorkMode = MODE_SWITCH_K_FUN[WorkMode];
                                break;
                        case K_V_A:                //k2 K_VA
                                if(WorkMode < WM_SETMODE)WorkMode = MODE_SWITCH_K_VA[WorkMode];
                                break;
                }
#else
                switch(keystatus){
                        case 0x80:               
                        case 0x08:                //k1k2
                        case 0x88:
                                if(WorkMode < WM_SETMODE){
                                        WorkMode=WM_SETMODE;
                                        EnterPasswordInit();
                                        if(SetData != version)
                                        DispIntSet(LEDB,SetData);
                                        FlashFlag =0;
                                }
                                else {
                                        WorkMode = DEF_WORKMODE;
//                                        SaveModbusSet();
                                        CheckInitSet();
                                }
                                KeyCode = K_SET;
                                break;
                        case K_FUN:                //k1        K_FUN
                                if(KeyCode==K_SET){
                                        KeyCode = K_IDEL;
                                        break;
                                }
                        #if FUNCTION_TYPE==FUN_3I || FUNCTION_TYPE==FUN_3U
                                VTmain=0;
                        #endif
                                if(WorkMode>=WM_SETMODE && KFunProcTbl[WorkMode-WM_SETMODE]){
                                        KFunProcTbl[WorkMode-WM_SETMODE]();
                                        FlashFlag =0;
                                                                        if(SetData != version)

                                        DispIntSet(LEDB,SetData);
                                }
                                WorkMode = MODE_SWITCH_K_FUN[WorkMode];
                                #if CLEAR_E_EN
                                        if(WorkMode == WM_CLEAR_E){
                                                DispYesNo();
                                        }
                                #endif
                                break;
                               
                        case K_V_A:                //k2 K_VA
                                if(KeyCode==K_SET){
                                        KeyCode = K_IDEL;
                                        break;
                                }
                        #if FUNCTION_TYPE==FUN_3I || FUNCTION_TYPE==FUN_3U
                                VTmain=0;
                        #endif
                                WorkMode = MODE_SWITCH_K_VA[WorkMode];
                                if(WorkMode>=WM_SETMODE && KVAProcTbl[WorkMode-WM_SETMODE]){
                                        KVAProcTbl[WorkMode-WM_SETMODE]();
                                #if DI_EN
                                //        if(WorkMode!=WM_DISP_DI)
                                #endif
                                #if CLEAR_E_EN
                                        if(WorkMode == WM_CLEAR_E){
                                                DispYesNo();
                                        }
                                        else
                                #endif
                                                                        if(SetData != version)

                                        DispIntSet(LEDB,SetData);
                                        FlashFlag =1;
                                        FlashTimer=0;
                                }
                                break;
                        case 0xFF:
                                KeyCode = K_IDEL;
                                break;
                }
#endif
#endif


//        }

         if(SysTickCpy == 0xFF){ // 640ms
                if(!EpEqChangeFlag)ESaveSeq=-1;
                if(--ESaveSeq==1){
//                        if(EpEqChangeFlag & ( 1<< ESaveSeq)){
//                                ESaveSeq = ~(1<<ESaveSeq);
                                EEPWriteBuff(pbFun03(ADD_EP_TOTAL_HIGH),ADD_EEP_FUN03_E(ADD_EP_TOTAL_HIGH), 4);
                        }
                else if(ESaveSeq==0){
                        EEPWriteBuff(pbFun03(ADD_EQ_TOTAL_HIGH),ADD_EEP_FUN03_E(ADD_EQ_TOTAL_HIGH), 4);
                        EpEqChangeFlag=0;
                }
        }
        while(SysTickCpy == SysTick);

//       
        }
}


相关帖子

沙发
ayb_ice| | 2014-4-11 15:36 | 只看该作者
程序问题

使用特权

评论回复
板凳
coody| | 2014-4-11 16:35 | 只看该作者
RTX51仅仅是一个OS内核,跟硬件频率无直接关联

使用特权

评论回复
地板
南国的鳕|  楼主 | 2014-4-11 18:49 | 只看该作者
ayb_ice 发表于 2014-4-11 15:36
程序问题

请问可能是程序哪方面的问题呢~

使用特权

评论回复
5
南国的鳕|  楼主 | 2014-4-11 18:50 | 只看该作者
coody 发表于 2014-4-11 16:35
RTX51仅仅是一个OS内核,跟硬件频率无直接关联

恩我也觉得是程序问题,但是不知道问题出在哪。本来是没有系统正常工作的程序,我现在加了个RTX内核而已。

使用特权

评论回复
6
ningling_21| | 2014-4-11 22:01 | 只看该作者
南国的鳕 发表于 2014-4-11 18:50
恩我也觉得是程序问题,但是不知道问题出在哪。本来是没有系统正常工作的程序,我现在加了个RTX内核而已 ...

程序中改变了系统时钟频率...

使用特权

评论回复
7
ayb_ice| | 2014-4-12 06:58 | 只看该作者
直接用默认时钟试试

使用特权

评论回复
8
张志辉| | 2014-4-12 07:11 | 只看该作者
程序问题!

使用特权

评论回复
9
湖北泽翔| | 2014-4-12 11:47 | 只看该作者
软件问题啊   

使用特权

评论回复
10
湖北泽翔| | 2014-4-12 11:48 | 只看该作者

使用特权

评论回复
11
南国的鳕|  楼主 | 2014-4-12 19:38 | 只看该作者
ningling_21 发表于 2014-4-11 22:01
程序中改变了系统时钟频率...

但只要不断电,基本都可以保持在那个频率

使用特权

评论回复
12
南国的鳕|  楼主 | 2014-4-12 19:39 | 只看该作者
ayb_ice 发表于 2014-4-12 06:58
直接用默认时钟试试

默认的跑不了-_-#程序功能略复杂

使用特权

评论回复
13
南国的鳕|  楼主 | 2014-4-12 19:41 | 只看该作者
che180 发表于 2014-4-12 16:44
你咋米知道时钟变化大?你咋米判断是时钟变化了?
很有可能是你应用程序部稳定引起的 ...

是个led闪烁显示,只要不断电重启,闪烁频率就不会改变,掉电重启也不一定都会改变

使用特权

评论回复
14
南国的鳕|  楼主 | 2014-4-12 19:42 | 只看该作者
张志辉 发表于 2014-4-12 07:11
程序问题!

就是三个任务而已,实在想不通哪里会影响到

使用特权

评论回复
15
南国的鳕|  楼主 | 2014-4-12 19:43 | 只看该作者
湖北泽翔 发表于 2014-4-12 11:47
软件问题啊

就是三个任务而已,实在想不通哪里会影响到。

使用特权

评论回复
16
南国的鳕|  楼主 | 2014-4-13 20:23 | 只看该作者
还是木有解决这个问题o(≧ o ≦)o

使用特权

评论回复
17
ningling_21| | 2014-4-13 21:50 | 只看该作者
南国的鳕 发表于 2014-4-13 20:23
还是木有解决这个问题o(≧ o ≦)o

上程序...

使用特权

评论回复
18
南国的鳕|  楼主 | 2014-4-14 08:40 | 只看该作者
ningling_21 发表于 2014-4-13 21:50
上程序...

还有一个Modbus的任务没贴上去,然后还有一堆中断- -||

使用特权

评论回复
19
ayb_ice| | 2014-4-14 08:52 | 只看该作者
你这程序一个字"乱"啊,完全没有章法

在OS下
        SysTick = 0;
        while(SysTick<10);
这样的程序都出来了

使用特权

评论回复
20
ayb_ice| | 2014-4-14 08:55 | 只看该作者
你这一看就是使能了轮转,

但任务间好像没有使用信号量的概念

使用特权

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

本版积分规则

1

主题

13

帖子

0

粉丝