压缩包 包含所有调试程序以及 AVR studio仿真文件
ICCAVR环境编译,还有AVR软件延时计算工具(C-Free写的,支持中文)
呵呵,在网上找了一下AVR单片机的软件延时程序,
觉得不怎么方便,于是就自己做了一个软件
很方便的,只要输入你所需要的延迟时间
得到所需延时的代码函数,直接调用就可以了
希望对有需要的朋友有用^_^
,'''╭⌒╮⌒╮.',''',,',.'',,','',.
╱◥██◣''o',''',,',.''.'',,',.
|田|田田│ '',,',.',''',,',.''
╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
二重循环do_while(不可传递参数)
调试记录:
/*--------------------------------------------------------------*/
//ICC-AVR application builder : 2009-7-21 10:46:10
// Target : M8
// Crystal: 1.000Mhz
/*--------------------------------------------------------------*/
1、C语言程序:
/*--------------------------------------------------------------*/
//二重循环(不传递参数)
void delay(void)
{
unsigned char i, j;
j = 6; do{i = 5; do{i--;}while(i); j--;}while(j);
}
2、编译后的汇编程序:
_delay:
j --> R16
i --> R18 机器周期
0033 E006 LDI R16,6 1
0034 E025 LDI R18,5 1
0035 952A DEC R18 1
0036 2322 TST R18 1
0037 F7E9 BNE 0x0035 2/1
0038 950A DEC R16 1
0039 2300 TST R16 1
003A F7C9 BNE 0x0034 2/1
003B 9508 RET 4
0040 EF8F LDI R24,0xFF 1
0041 BB85 OUT 0x15,R24 1
0042 DFF0 RCALL _delay 3
0043 2422 CLR R2 1
0044 BA25 OUT 0x15,R2 1
0045 DFED RCALL _delay 3
◆赋值:i = 5; j = 6;
WINAVR 调试记录
40 us
193 us
193-40 = 153
LDI OUT RCALL _delay
153 = 1 + 1 + 3 + 148
DEC TST BNE i BNE LDI DEC TST BNE j LDI BNE RET
148 = {[(1 + 1 + 2) * 5 - 1] + 1 + 1 + 1 + 2} * 6 + 1 - 1 + 4
◆推出公式:
T = 4*[(i+1)*j+1]
◆验证:
4*[(5+1)*6+1] = 148 ok!
◆结论:
所以加上RCALL,总共延迟时间:T = 4*[(i+1)*j+1] + 3
◆赋值:i = 8; j = 9;
40 us
373 us
373-40 = 333
333 = 2 + 331
◆验证:
4*[(8+1)*9+1] + 3 = 331 ok! \(0^◇^0)/
/*--------------------------------------------------------------*/
★最终结论(机器周期为1us/振荡时钟为1MHz):
延迟时间T: T = 4*[(i+1)*j+1] + 3 us
最小延迟时间:T_min = 15 us
最大延迟时间:T_max = 261127 us
最小步进时间:T_step= 4 us
/*--------------------------------------------------------------*/
xucun915_925777961 2009-11-6 13:25
用户1513245 2009-8-9 21:58
用户222124 2009-7-25 08:06