Delay40mks:
push Temp
ldi Temp,0
Loop:
dec Temp
brne Loop
pop Temp
ret
И хотелось бы узнать а как расчитать например на 10,15,20 мks.
Код: Выделить всё
Delay:
ldi Temp,0
ldi Temp1,10
loop: dec Temp
brne loop
dec Temp1
brne loop
ret
Тогда по этим расчетам получается что первый кусок прграммы равен не 40mks а 76,7 mks если идти по вашему описанию: 256*3-1=767 тактовНа самом деле - для столь точных временных задержек существует таймер.
А вообще - считается очень просто. Допустим, есть прога задержки:
Код:
Delay:
ldi Temp,0
ldi Temp1,10
loop: dec Temp
brne loop
dec Temp1
brne loop
ret
Сначала 256 раз мотается первый цикл (уменьшение Temp на 1). Каждый раз, когда мы проваливаемся из этого цикла, Temp1 уменьшается на 1, и так происходит 10 раз.
Известно (из даташита, разумеется), что команда dec выполняется за 1 такт, команда brne - в случае перехода - за два, иначе - за один. Считаем: 255 циклов первой задержки имеют длину 3 такта, 1 цикл - 2 такта. То есть, однократное выполнение - 256*3-1 = 767 тактов
Вторая задержка также выполняется за 3 такта. Это происходит каждый раз, когда мы проваливаемся из первой задержки во вторую. Итого - 10 раз. То есть, в сумме - 30 тактов.
В сумме получаем:
(767*10)+30 = 7700 тактов.
Пусть частота кварца = 10 МГц
Переводим в секунды.
1 такт = 0,1 мкс
7700 тактов = 770 мкс
Фсе Ращет окончен. Вооольна!