|
10黑幣
下面的程序使用了一個5ms的定時器,對變量sys_tick進(jìn)行了+1的操作.
程序的功能是使LED燈亮一秒,熄一秒.
目前程序運(yùn)行后,通過邏輯分析儀分析 P2_3的電平輸出,高低電平持續(xù)的時候大部分是準(zhǔn)時的,但是有時會少于1000ms,會出現(xiàn)800多ms,500多ms的情況.
如果每次延遲的時候去掉下面紅字部分的注釋則能正常.請問程序出現(xiàn)的問題在哪?
#include <stdint.h>
void Timer0Init(void) //5毫秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設(shè)置定時器模式
TL0 = 0x00; //設(shè)置定時初值
TH0 = 0x28; //設(shè)置定時初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時器0開始計時
ET0 = 1;
}
typedef uint32_t size_tick;
volatile size_tick sys_tick = 0;
void Timer0Int() __interrupt TF0_VECTOR
{
++sys_tick;
}
void Delay(uint16_t ms)
{
size_tick tick_num = ms / 5;
// sys_tick = 0; // 如果這行注釋去掉的話定時是正確的
size_tick cur_tick = sys_tick;
while (sys_tick - cur_tick < tick_num)
{;}
}
void main()
{
EA = 1; //開總中斷
Timer0Init();
while (1)
{
P2_3 = 0;
Delay(1000);
P2_3 = 1;
Delay(1000);
}
}
另外,我在每次延遲后通過串口輸出 sys_tick的值. 理論上 sys_tick每次輸出的值應(yīng)該是相隔200左右 ( 1000ms/5ms = 200 ).
但是總是在固定時候輸出是啊小于200的.
200
400
600
800
1000
1201
1402
1536
1737
1938
2048
2249
2450
2560
2761
2962
3072
3273
3474
|
|