[请益] 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