请务必进来回答---F2812的延时疑问
前天我发了相似的帖子,可能是问题太低级的原因吧,没有人回复。我想,不管水平如何,大家进来说两句。我这两天因为这个睡不着,我大四了,毕业设计做的是dsp电机控制。 现在卡在液晶调试这块,请给我指点一下。很感激。
是这样,我用2812调12864液晶,在写时序上出现问题,以前我用单片机做延时,能够正常显示的程序,现在用dsp来做时序上却出问题了。我想知道怎么用dsp来做延时?
1:原来我想直接调用TI现成的函数DSLAY_US(A),但是发现程序一直停在DSLAY_US(A),不动,不知道什么原因,我想请问怎么调这个函数用。
2:如果我不用DSLAY_US(A),编一个延时函数,你们一般怎么编? 21ic 的技术员很没人情味啊 顶一顶 无语 :( 1. 能把delay_us的程序贴一下吗? 从网上其他的讨论看,好像是有个寄存器ACC没有赋初值,如果ACC很大,要减到小于0退出delay loop要很长时间, 你看看DELAY_US(A)中的A是怎么用的?
2. 自己写,写一个空的for循环,然后让编译器别把这个for循环优化掉,延时长就for循环的时间长一些.
void delay_test(int cnt)
{
volatile int i;
for (i=0; i<cnt; i++)
{
}
}
不用定时器中断的话,只能通过DSP的汇编指令数目来进行延时, 比如DSP执行一条ADD的指令周期是10ns, 那比如延时1us,就需要1us/10ns条ADD指令. 自己写也很简单. 6# aresc
.def _DSP28x_usDelay
.sect "ramfuncs"
.global__DSP28x_usDelay
_DSP28x_usDelay:
SUB ACC,#1
BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0
LRETR
这是Delay函数的定义,汇编的,下面是调用
#define DELAY_US(A)DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L) 本帖最后由 aresc 于 2011-6-12 21:39 编辑
这里http://www.61ic.com/Article/C2000/C28X/201010/27784.html有一个关于F2812的DELAY的详细说明. 从里面的C调用汇编函数,参数值是传给ACC了,程序应该没问题.
在SUB指令那加个断点,用CCS看看第一次进去ACC里的值是不是(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)?
或者把(long double)A换成(unsigned long)试试. 谢谢楼主的提问 我也遇到相同的问题?怎么回事?解决了吗?
页:
[1]