[請益] 8051 microsecond級 delay 的問題

作者: shaoweei (朽唯)   2013-06-27 18:01:00
各位好,
小弟最近在寫一支自動控制的工作程式。
需要讓步進馬達可以高轉速運作
因此希望每一步之間的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
作者: maxlighter (燕窩燕窩摸摸衣洛酷蘿霸)   2013-06-27 18:13:00
可以去看一下進出中斷的ASM碼
作者: shaoweei (朽唯)   2013-06-27 18:38:00
看了一下 T0_int的函數也只有30行左右@@應該也不用上百微秒
作者: ksmrt0123 (ksmrt)   2013-06-30 00:14:00
要設定timer除數要用算的不應用量的. 你要100uS(=10KHz)所以從XTAL要除3000, 所以timer要除250既然timer只需除250, 用mode2(auto reload)比較好另建議是把stpm的控制直接放在timer isr內作掉就好
作者: WolfLord (呆呆小狼￾ ￾ N￾ ￾ )   2013-06-30 02:51:00
他的問題只在於忘記把TIMER的PR提高而已啦 XD
作者: lion21 (好歹我也是個夕陽武士)   2013-06-30 03:09:00
建議可以換 1T的相容產品 .
作者: WolfLord (呆呆小狼￾ ￾ N￾ ￾ )   2013-06-30 05:41:00
@Lion21 UART 跟TIMER ISR優先權不解決用0.5T/133MHZ也是無法解決時間會飄的問題....
作者: ksmrt0123 (ksmrt)   2013-06-30 20:49:00
光改timer isr priority沒用, 因為在stpm兩個steps間uart interrupt還是會發生
作者: WolfLord (呆呆小狼￾ ￾ N￾ ￾ )   2013-06-30 22:24:00
TIME優先下在TIMER時不會發生UART,在UART會發生TIMER所以TIMER只要扣除ISR進入的時間就可以穩定執行了。反過來,TIMER內會有UART或UART跟TIMER競爭TIMER就會飄
作者: shaoweei (朽唯)   2013-07-01 01:38:00
原來如此 受教了>< ~~~~~~
作者: ksmrt0123 (ksmrt)   2013-07-02 00:18:00
光改timer int priority沒用, 以原po的 timertest()來說P2=0xFF與P2=0x00間還是會發生uart int, 造成P2信號輸出時間受影響事實上把timer int設高priority只有保證timer isr不會受到uart的干擾, 所以要把需要精準計時的動作放到ISR內做上一段的說法不夠正確... 不過原po的程式只改timer intpriority不夠是肯定的
作者: shaoweei (朽唯)   2013-07-03 20:28:00
多謝k大指點 我再試試把要用的程式一起包到ISR裡面@@

Links booklink

Contact Us: admin [ a t ] ucptt.com