[請益] 8051 microsecond級 delay 的問題
各位好,
小弟最近在寫一支自動控制的工作程式。
需要讓步進馬達可以高轉速運作
因此希望每一步之間的delay可以用100μs為單位控制
MCU 新唐W78E516DDG (8052)
振盪器 30MHz
Keil C
電路運作正常
方式1是用一般的timer0中斷
#define tv 248 //用2.5GS/s 示波器量 1ms時 timer0值為2481
#define TH (65536 - tv)/256;
#define TL (65536 - tv)%256;
int x1ms;
void delay100us(int count1)
{
x1ms = count1;
IE = 0x92; //timer0為計時中斷 timer1為uart中斷
TMOD = 0x21; //timer0為計時中斷 timer1為uart中斷
TH0 = TH;
TL0 = TL;
TR0 = 1;
while(x1ms != 0);
}
void T0_int(void) interrupt 1
{
TR0 =0;
x1ms-- ;
TH0 = TH;
TL0 = TL;
TR0 =1;
}
信號測量程式
void timertest(int delaytime) //透過uart給定delaytime
{
while(1)
{
P2 = 0xff;
delay100us(delaytime);
P2 = 0x00;
delay100us(delaytime);
}
}
這樣timertest(1);
跑出來延遲大約是384 μs,
OK,雖然差滿多的,那我調整一下tv參數應該就可以了吧
調整到tv = 150
跑出來為360 μs左右...這樣其他指令也跑太久了吧@@"
再來問題就更大了,我把tv值調得更小
函數timertest()就無法運作 .........也就是最低只能到360μs
也試過把timer0改成mode0 結果相同,完全不知道原因在哪裡...
理論上不是0~65536嗎..
因為中斷搞不定,我改用跑迴圈的方法:
void delayL(int t) //延遲tx1ms 副程式
{
int i = 0;
while(i != t)
{
i++;
}
}
Keil C編譯的結果如下:
79: int i = 0;
C:0x125D 8B4C MOV 0x4C,R3
C:0x125F 8A4D MOV 0x4D,R2
C:0x1261 894E MOV 0x4E,R1
80: while(i != t)
81: {
82: i++;
C:0x1263 BF0116 CJNE R7,#0x01,C:127C
83: }
C:0x1266 7F80 MOV R7,#P0(0x80)
C:0x1268 7E00 MOV R6,#0x00
C:0x126A 12162A LCALL write_inst(C:162A)
84: }
結果
timertest(1);
跑了542 μs....................這不科學
也試過for迴圈的寫法,差異不大。
想請教:
1.為何tv參數不能更小?或是寫法哪裡有問題@@?
2.delayL 迴圈寫法 跑一圈花的時間也太長了吧...why...我以為頂多幾十μs
3.想要有100 μs的delay函數 不知道要從哪邊下手呢。
*先不考慮timertest(1)和timertest(10)的差異。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 42.70.50.235
推
06/27 18:13, , 1F
06/27 18:13, 1F
→
06/27 18:38, , 2F
06/27 18:38, 2F
→
06/27 18:38, , 3F
06/27 18:38, 3F
Hi All:
後來我在計時中斷時關閉UART中斷,tv參數就可以小到100以下了
void delay100us(int count1) //計時設定副程式
{
x1ms = count1;
IE = 0x82;
TMOD = 0x01;
TH0 = TH;
TL0 = TL;
TR0 = 1;
while(x1ms != 0);
IE = 0x92; //打開UART中斷
TMOD = 0x21;
}
delayL我另外開一個單純的project就正常了...應該也是UART設定的問題....
※ 編輯: shaoweei 來自: 42.70.50.235 (06/27 19:11)
推
06/30 00:14, , 4F
06/30 00:14, 4F
→
06/30 00:15, , 5F
06/30 00:15, 5F
→
06/30 00:18, , 6F
06/30 00:18, 6F
→
06/30 00:19, , 7F
06/30 00:19, 7F
推
06/30 02:51, , 8F
06/30 02:51, 8F
推
06/30 03:09, , 9F
06/30 03:09, 9F
→
06/30 05:41, , 10F
06/30 05:41, 10F
→
06/30 05:41, , 11F
06/30 05:41, 11F
推
06/30 20:49, , 12F
06/30 20:49, 12F
→
06/30 20:49, , 13F
06/30 20:49, 13F
→
06/30 22:24, , 14F
06/30 22:24, 14F
→
06/30 22:24, , 15F
06/30 22:24, 15F
→
06/30 22:25, , 16F
06/30 22:25, 16F
→
07/01 01:38, , 17F
07/01 01:38, 17F
推
07/02 00:18, , 18F
07/02 00:18, 18F
→
07/02 00:20, , 19F
07/02 00:20, 19F
→
07/02 00:20, , 20F
07/02 00:20, 20F
推
07/02 00:23, , 21F
07/02 00:23, 21F
→
07/02 00:24, , 22F
07/02 00:24, 22F
→
07/02 00:24, , 23F
07/02 00:24, 23F
→
07/02 00:51, , 24F
07/02 00:51, 24F
→
07/02 00:51, , 25F
07/02 00:51, 25F
→
07/03 20:28, , 26F
07/03 20:28, 26F
ASM 近期熱門文章
PTT數位生活區 即時熱門文章