[51单片机] RTX51tiny重新上电的时候时钟频率会自动改变~

[复制链接]
3231|26
 楼主| 南国的鳕 发表于 2014-4-11 14:41 | 显示全部楼层 |阅读模式
本帖最后由 南国的鳕 于 2014-4-14 08:39 编辑

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

  1. void init() _task_ TASK_INIT{
  2. #if DI_EN
  3.         uchar DIStatus;
  4. //        uchar diData;
  5. #endif
  6.         uchar i;
  7.         uchar keystatus = 0xFF;         
  8. //        uchar SysTickCpy;
  9. //        AD.F_Sumclc=0;
  10. //        ulong EqCpy;
  11. #if DI_EN
  12.         DIStatus=0;
  13.         AD.DIData = 0;
  14.         ResetDICnt();
  15. #endif

  16.         SetSaveSeq=0;
  17.         FAutoZero=0;
  18.         FAutoCal=0;

  19.         ModbusOk = 0;

  20. #if AUTO_CALIBRATION_EN
  21.         DispStr2LEDA(64, 64, 64, 64); //----
  22.         DispStr2LEDB(64, 64, 64, 64); //----
  23. #else
  24.         DispStr2LEDA(_0, _0, _0, _0);
  25.         DispStr2LEDB(_0, _0, _0, _0);
  26. #endif
  27. // ADC init
  28.         TSample1=4;TSample2=0;AD.SamplePoint=0;
  29. //AD.SamplePoint=183;

  30.         Init_Device();

  31.         PIN_485DE_RE=BUS_RE;
  32.        

  33. #if AUTO_CALIBRATION_EN
  34.         RAM_FUN03(ADD_BUS_ADDRESS) = 50;       
  35.         EEPWriteBuff(pbFun03(ADD_BUS_ADDRESS), ADD_EEP_FUN03(ADD_BUS_ADDRESS), 2);

  36.         SysTick = 0;
  37.         while(SysTick<10);
  38.        
  39.         RAM_FUN03(ADD_BAUDRATE_NO)=3;
  40.         EEPWriteBuff(pbFun03(ADD_BAUDRATE_NO), ADD_EEP_FUN03(ADD_BAUDRATE_NO), 2);
  41.        
  42.        

  43.         SysTick = 0;
  44.         while(SysTick<10);
  45.        
  46.         RAM_FUN03(ADD_CT1)=5;
  47.         EEPWriteBuff(pbFun03(ADD_CT1), ADD_EEP_FUN03(ADD_CT1), 2);

  48.         for(i=0; i<4; i++){
  49.                 SysTick = 0;
  50.                 while(SysTick<10);
  51.                 RAM_FUN03(ADD_EP_TOTAL_HIGH+i)=0;
  52.                 EEPWriteBuff(pbFun03(ADD_EP_TOTAL_HIGH+i), ADD_EEP_FUN03_E(ADD_EP_TOTAL_HIGH+i), 2);
  53.         }

  54.         SysTick = 0;
  55.         while(SysTick<10);
  56. #endif
  57.        
  58.         SetInit();
  59.     IE |= 0x10;    //Usart中断使能


  60. //        MData.DataMode = MODBUS_IDLE;
  61.        
  62.        
  63.        
  64.         SysTick = 1;
  65.         while(SysTick);
  66.         SysTick = 1;

  67.         while(SysTick);

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

  69.         WorkMode = DEF_WORKMODE;
  70.        
  71. #if DI_EN
  72.         for(i=0; i<11; i++){
  73.                 RAM_FUN03(ADD_TEMPERATURE+i)=0;
  74.         }
  75. #else
  76.         for(i=0; i<8; i++){
  77.                 RAM_FUN03(ADD_TEMPERATURE+i)=0;
  78.         }
  79. #endif
  80.         RAM_FUN03(ADD_PF)=1000;
  81. //        RAM_FUN03(ADD_I1)=0;
  82. //        RAM_FUN03(ADD_P)=0;
  83. //        RAM_FUN03(ADD_Q)=0;
  84. //        RAM_FUN03(ADD_S)=0;

  85.         SM_BUSY = 0;
  86.        
  87.         WatchDogEnable();
  88.        
  89.         FECalced=0;
  90.        
  91.         os_create_task(TASK_KEYSCAN);
  92.         os_create_task(TASK_COMUNICATE);
  93.        
  94.         while(1){
  95.                 EA=0;
  96.                 SysTickCpy = SysTick;
  97.                 EA=1;
  98.         WatchDog();
  99.                         os_wait(K_IVL, 1, 0);
  100.                 ADCalculate();
  101.                 if(FlashTimer)FlashTimer--;
  102.                 if(ADflag){
  103.                         if(WorkMode<WM_SETMODE)ADDisplay();
  104.                         else if(!FlashTimer){
  105.                         ResetFlashTimer();
  106.                         FlashFlag = ~FlashFlag;
  107.                         if(FlashPos<8) dispbuff.map[FlashPos] = (FlashFlag?DispBuffBack.map[FlashPos]:0);
  108.                         else if(FlashPos==8) (dispbuff.Row[LED_ROW_2]) =
  109.                                 (FlashFlag ? (DispBuffBack.Row[LED_ROW_2]):0);
  110.                 }
  111.                 }
  112.         }
  113. }

  114. ////////////////////////////////////////////////////////////////
  115. ////////////////////////////////////////////////////////////////
  116. ////////////////////////////////////////////////////////////////
  117. ////////////////////////////////////////////////////////////////
  118. ////////////////////////////////////////////////////////////////
  119. ////////////////////////////////////////////////////////////////
  120. ////////////////////////////////////////////////////////////////
  121. ////////////////////////////////////////////////////////////////
  122. void KeyScan() _task_ TASK_KEYSCAN{
  123. //        os_wait(K_TMO, 1, 0);

  124.         while(1){

  125.                 WatchDog();

  126.        
  127.         ///// key Scan
  128. //        if(SysTickCpy % 4 == 0){ // 10ms

  129.                
  130.                
  131.                 keystatus <<= 1;
  132.                 keystatus |= 0x11;
  133.                
  134.                 if(AD.KeyData12 < 20);                                                 //NK
  135.                 else if(AD.KeyData12 < 90)        keystatus &= 0xFE;         //k1
  136.                 else if(AD.KeyData12 < 170)        keystatus &= 0xEF;        //K2
  137.                 else keystatus &= 0xEE;                                         //k1k2
  138.                
  139.                 ////////////////////
  140.                
  141. #if USER_INTERFACE_EN
  142. #if FUNCTION_TYPE==FUN_AUTOCAL
  143.                 switch(keystatus){
  144.                         case 0x80:               
  145.                         case 0x08:                //k1k1
  146.                         case 0x88:
  147.                                 if(WorkMode < WM_SETMODE){
  148.                                         WorkMode=WM_SETMODE;
  149.                                         SetLedA(-1);
  150.                                         SetLedB(-1);
  151.                                 }
  152.                                 else{
  153.                                         WorkMode = DEF_WORKMODE;
  154.                                 }
  155.                                 break;
  156.                         case K_FUN:                //k1        K_FUN
  157.                                 if(WorkMode < WM_SETMODE)WorkMode = MODE_SWITCH_K_FUN[WorkMode];
  158.                                 break;
  159.                         case K_V_A:                //k2 K_VA
  160.                                 if(WorkMode < WM_SETMODE)WorkMode = MODE_SWITCH_K_VA[WorkMode];
  161.                                 break;
  162.                 }
  163. #else
  164.                 switch(keystatus){
  165.                         case 0x80:               
  166.                         case 0x08:                //k1k2
  167.                         case 0x88:
  168.                                 if(WorkMode < WM_SETMODE){
  169.                                         WorkMode=WM_SETMODE;
  170.                                         EnterPasswordInit();
  171.                                         if(SetData != version)
  172.                                         DispIntSet(LEDB,SetData);
  173.                                         FlashFlag =0;
  174.                                 }
  175.                                 else {
  176.                                         WorkMode = DEF_WORKMODE;
  177. //                                        SaveModbusSet();
  178.                                         CheckInitSet();
  179.                                 }
  180.                                 KeyCode = K_SET;
  181.                                 break;
  182.                         case K_FUN:                //k1        K_FUN
  183.                                 if(KeyCode==K_SET){
  184.                                         KeyCode = K_IDEL;
  185.                                         break;
  186.                                 }
  187.                         #if FUNCTION_TYPE==FUN_3I || FUNCTION_TYPE==FUN_3U
  188.                                 VTmain=0;
  189.                         #endif
  190.                                 if(WorkMode>=WM_SETMODE && KFunProcTbl[WorkMode-WM_SETMODE]){
  191.                                         KFunProcTbl[WorkMode-WM_SETMODE]();
  192.                                         FlashFlag =0;
  193.                                                                         if(SetData != version)

  194.                                         DispIntSet(LEDB,SetData);
  195.                                 }
  196.                                 WorkMode = MODE_SWITCH_K_FUN[WorkMode];
  197.                                 #if CLEAR_E_EN
  198.                                         if(WorkMode == WM_CLEAR_E){
  199.                                                 DispYesNo();
  200.                                         }
  201.                                 #endif
  202.                                 break;
  203.                                
  204.                         case K_V_A:                //k2 K_VA
  205.                                 if(KeyCode==K_SET){
  206.                                         KeyCode = K_IDEL;
  207.                                         break;
  208.                                 }
  209.                         #if FUNCTION_TYPE==FUN_3I || FUNCTION_TYPE==FUN_3U
  210.                                 VTmain=0;
  211.                         #endif
  212.                                 WorkMode = MODE_SWITCH_K_VA[WorkMode];
  213.                                 if(WorkMode>=WM_SETMODE && KVAProcTbl[WorkMode-WM_SETMODE]){
  214.                                         KVAProcTbl[WorkMode-WM_SETMODE]();
  215.                                 #if DI_EN
  216.                                 //        if(WorkMode!=WM_DISP_DI)
  217.                                 #endif
  218.                                 #if CLEAR_E_EN
  219.                                         if(WorkMode == WM_CLEAR_E){
  220.                                                 DispYesNo();
  221.                                         }
  222.                                         else
  223.                                 #endif
  224.                                                                         if(SetData != version)

  225.                                         DispIntSet(LEDB,SetData);
  226.                                         FlashFlag =1;
  227.                                         FlashTimer=0;
  228.                                 }
  229.                                 break;
  230.                         case 0xFF:
  231.                                 KeyCode = K_IDEL;
  232.                                 break;
  233.                 }
  234. #endif
  235. #endif


  236. //        }

  237.          if(SysTickCpy == 0xFF){ // 640ms
  238.                 if(!EpEqChangeFlag)ESaveSeq=-1;
  239.                 if(--ESaveSeq==1){
  240. //                        if(EpEqChangeFlag & ( 1<< ESaveSeq)){
  241. //                                ESaveSeq = ~(1<<ESaveSeq);
  242.                                 EEPWriteBuff(pbFun03(ADD_EP_TOTAL_HIGH),ADD_EEP_FUN03_E(ADD_EP_TOTAL_HIGH), 4);
  243.                         }
  244.                 else if(ESaveSeq==0){
  245.                         EEPWriteBuff(pbFun03(ADD_EQ_TOTAL_HIGH),ADD_EEP_FUN03_E(ADD_EQ_TOTAL_HIGH), 4);
  246.                         EpEqChangeFlag=0;
  247.                 }
  248.         }
  249.         while(SysTickCpy == SysTick);

  250. //       
  251.         }
  252. }


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
程序问题

请问可能是程序哪方面的问题呢~
 楼主| 南国的鳕 发表于 2014-4-11 18:50 | 显示全部楼层
coody 发表于 2014-4-11 16:35
RTX51仅仅是一个OS内核,跟硬件频率无直接关联

恩我也觉得是程序问题,但是不知道问题出在哪。本来是没有系统正常工作的程序,我现在加了个RTX内核而已。
ningling_21 发表于 2014-4-11 22:01 | 显示全部楼层
南国的鳕 发表于 2014-4-11 18:50
恩我也觉得是程序问题,但是不知道问题出在哪。本来是没有系统正常工作的程序,我现在加了个RTX内核而已 ...

程序中改变了系统时钟频率...
ayb_ice 发表于 2014-4-12 06:58 来自手机 | 显示全部楼层
直接用默认时钟试试
张志辉 发表于 2014-4-12 07:11 | 显示全部楼层
程序问题!
湖北泽翔 发表于 2014-4-12 11:47 | 显示全部楼层
软件问题啊   
湖北泽翔 发表于 2014-4-12 11:48 | 显示全部楼层
 楼主| 南国的鳕 发表于 2014-4-12 19:38 来自手机 | 显示全部楼层
ningling_21 发表于 2014-4-11 22:01
程序中改变了系统时钟频率...

但只要不断电,基本都可以保持在那个频率
 楼主| 南国的鳕 发表于 2014-4-12 19:39 来自手机 | 显示全部楼层
ayb_ice 发表于 2014-4-12 06:58
直接用默认时钟试试

默认的跑不了-_-#程序功能略复杂
 楼主| 南国的鳕 发表于 2014-4-12 19:41 来自手机 | 显示全部楼层
che180 发表于 2014-4-12 16:44
你咋米知道时钟变化大?你咋米判断是时钟变化了?
很有可能是你应用程序部稳定引起的 ...

是个led闪烁显示,只要不断电重启,闪烁频率就不会改变,掉电重启也不一定都会改变
 楼主| 南国的鳕 发表于 2014-4-12 19:42 来自手机 | 显示全部楼层
张志辉 发表于 2014-4-12 07:11
程序问题!

就是三个任务而已,实在想不通哪里会影响到
 楼主| 南国的鳕 发表于 2014-4-12 19:43 来自手机 | 显示全部楼层
湖北泽翔 发表于 2014-4-12 11:47
软件问题啊

就是三个任务而已,实在想不通哪里会影响到。
 楼主| 南国的鳕 发表于 2014-4-13 20:23 来自手机 | 显示全部楼层
还是木有解决这个问题o(≧ o ≦)o
ningling_21 发表于 2014-4-13 21:50 | 显示全部楼层
南国的鳕 发表于 2014-4-13 20:23
还是木有解决这个问题o(≧ o ≦)o

上程序...
 楼主| 南国的鳕 发表于 2014-4-14 08:40 | 显示全部楼层
ningling_21 发表于 2014-4-13 21:50
上程序...

还有一个Modbus的任务没贴上去,然后还有一堆中断- -||
ayb_ice 发表于 2014-4-14 08:52 | 显示全部楼层
你这程序一个字"乱"啊,完全没有章法

在OS下
        SysTick = 0;
        while(SysTick<10);
这样的程序都出来了
ayb_ice 发表于 2014-4-14 08:55 | 显示全部楼层
你这一看就是使能了轮转,

但任务间好像没有使用信号量的概念
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

13

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部