AVR 精确延时loop 计算
Example:
1 2 3 4
| LDI R16, 100 L1: DEC R16 BRNE L1
|
这个小循环
- load R16 用 1 cycle
- R16 从100减到0,一共计算100次,其中,99次计算结果不为0,
Z!=0
,BRNE用 2 cycle,1次计算结果为0,BRNE用 1 cycle。每次自减是 1 cycle。
number of cycles=LDI+(100−1)×(BRNE(z!=0)+DEC)+1×(BRNE(z=0)+DEC)=1+(100−1)×(2+1)+1×(1+1)=100×3=300
delay 1s:
1 2 3 4 5 6 7 8 9 10 11 12
| ldi r16, 82 ldi r17, 43 ldi r18, 0 L1: dec r18 brne L1 dec r17 brne L1 dec r16 brne L1 lpm nop
|
对于这个:
ncycle=r18从0自减到0(256−1)×3+2+1+r17从43自减到0(43−1)×(256×3+2)r18从0自减到0+2+1r17+r16从82自减到0(82−1)×[(256×3+2)×256+2]+2+1+3+1=16000000
用时:
16MHz1∗16000000cycles=1s
怎么反推呢,知道时间,写代码?
http://darcy.rsgc.on.ca/ACES/TEI4M/AVRdelay.html
到着推的话,先算出82,再算出43,再算出256
(3×256+2)×256+216000000+1=82.1680≈82......