程序架构为定时调度任务,周期为4.5ms;任务一:扫描四个LED,每4.5ms; 任务二:TLC549的串口AD数据读取,每一秒:任务三:数据转换,更新LED数据区;现发现LED基本上没闪烁,但偶尔会闪一下. 自己理解为,其中一个任务时间过长,导致扫描LED任务偶尔延迟,从而闪烁.但由KEIL 测得的各个任务时间分别是:0.420ms1.768ms2.486ms;照这样看,我的理解应该不合理,将周期4.5ms改为3.0ms,跳动明显点,显示基本还是稳定的. 其中LED任务和另两个任务之一会存在同时请求执行的时刻. 定时器采用T0,16位手动装载方式. 这里只有几个小任务,功能也很单一,完全可以用其他的结构,但想知道问题在那里. 请赐教 renwu1: void LED_Display(void) { if (++Digit_G == 4) { Digit_G = 0; } switch (Digit_G) { case 0: { LED_DIGIT_0 = 0; LED_DIGIT_1 = 1; LED_DIGIT_2 = 1; LED_DIGIT_3 = 1; break; }
case 1: { LED_DIGIT_0 = 1; LED_DIGIT_1 = 0; LED_DIGIT_2 = 1; LED_DIGIT_3 = 1; break; }
case 2: { LED_DIGIT_0 = 1; LED_DIGIT_1 = 1; LED_DIGIT_2 = 0; LED_DIGIT_3 = 1; break; }
case 3: { LED_DIGIT_0 = 1; LED_DIGIT_1 = 1; LED_DIGIT_2 = 1; LED_DIGIT_3 = 0; } } LED_DATA_PORT = 255 - led[Digit_G];//显示 }
renwu 2: void adc_conv(void) { unsigned char i; unsigned char value=0; Clock=0; ChipSelect=1; ChipSelect=0; for(i=0;i<8;i++) { value<<=1; Clock=1; if(DataOut==1) value|=0x01;//value+=1; Clock=0; } ChipSelect=1; temp=(float)value; k=log(temp/(255-temp)) ; temp=k/3380+1/298.15; }
renwu3: void volage_cov_temp(void) { temp=1/temp-273.15; tmp=(unsigned int)(temp*100); led[0]=LED_Table_G[tmp%10]; led[1]=LED_Table_G[tmp%100/10]; led[2]=LED_Table_G[tmp%1000/100]; led[3]=LED_Table_G[tmp/1000]; } |