"Я действительно не понимаю этого вообще. Весь код, который я как-то вижу в комментариях онлайн, содержит случайные числа того, почему он делает столько циклов, но буквально нет объяснения, почему, что делает, что или где, чтоделает кто. Я действительно понятия не имею. "
" Я понимаю это, но мне нравится, не знаю, откуда вы получаете ТОЧНОЕ время. Откуда вы его рассчитываете? Откуда эти цифры. ЕслиЯ устанавливаю VAR1 на 15, что происходит, что меняется. Если я устанавливаю три переменные задержки на 4, 16, 12, откуда берется синхронизация? Что происходит с этими числами, чтобы цикл был определенным временем? Спасибо- Джимми Пейдж "
Если я понимаю ваши вопросы, то:
В листе данных 16F690 сказано:
Один цикл инструкций состоит из четырех периодов генератора для частоты генератора 4 МГц., это дает нормальное время выполнения команды 1 мкс.Все инструкции выполняются в течение одного цикла инструкций, если только условный тест не является истиной или счетчик программы не изменен в результате выполнения инструкции.Когда это происходит, выполнение занимает два цикла инструкций, второй цикл выполняется как NOP.
Итак, предположим, что Delay1 имеет значение 3, и у нас есть этот цикл:
Top
decfsz Delay1,f
goto Top
КаждыйКогда мы выполняем decfsz, мы получаем запас за один цикл.Если f равно нулю, и мы должны пропустить, то это становится двухцикловой инструкцией.Каждый раз, когда мы выполняем goto, компьютер меняется, поэтому это 2-тактная инструкция.Поэтому, если мы пройдем цикл и я покажу это в формате
Значение Delay1 перед инструкцией, инструкция, циклы, использованные для выполнения, всего циклов
3,decfsz,1,1
2,goto,2,3
2,decfsz,1,4
1,goto,2,6
1,decfsz,2,8
Так что этот цикл сам по себе с Delay1 запускаетсяна 3 ушло 8 циклов или 8 мкс, если мы работали на частоте 4 МГц.Важно сначала вычислить циклы, а затем скорректировать частоту тактовой части, этот код может быть 16us при работе на частоте 2 МГц или 32us при работе на частоте 1 МГц.
Итак, по проверке мы можем увидеть, что для fзначения, отличные от пары decfsz + goto, равны 2 + 1 = 3 цикла.Один раз, когда мы нажмем decfsz со значением 1, это будет 2 цикла.Таким образом, начиная с Delay1 of 3, будет 2 не одно входных значения (3,2).И добавьте 2 цикла в последний раз, когда мы нажимаем decfsz и пропускаем, общее количество циклов ((3-1) * 3) + 2 = 8.
Если бы мы вошли в этот цикл с Delay1, установленным в 11, этоbe ((11-1) * 3) + 2 = 32 цикла, 7 будет 20 циклами.
Если вы пойдете дальше и обернете один цикл decfsz вокруг другого, вы продолжите умножать количество выполненных циклов.Если Delay1 - это 3, а Delay2 - это 2
Top
decfsz Delay1,f
goto Top
decfsz Delay2,f
goto Top
Тогда в первый раз через Delay1 decfsz цикл, который мы знаем, равен 8 циклам.Первый decfsz Delay2, f, потому что Delay2 - это не 1, это 1 цикл, мы до 9 всего.Goto еще 2, 11 всего.Предполагая, что f-память 8-битная, затем во второй раз, когда мы запускаем цикл Delay1, мы вводим 0, представьте, что это 0x100 или 256 для математики, дающей нам ((256-1) 3) + 2 =Еще 767 циклов, всего 778.Delay2 теперь равен 1, так что это заключительная задержка decfsz2, f, так что она стоит нам 2, всего 780 циклов.И мы могли бы придумать алгоритм для вычисления циклов для этого Нечто близкое к ((Delay2-1) (((256-1) * 3) +2)) + (((Delay1) -1) *3) +2) + ((Delay2-1) * 3) +2 цикла.
И хотя мой цикл на один цикл decfsz меньше вашего, если вы сделаете мой цикл похожим на ваш, он начинается с некоторогодругие инструкции:
Entry
movlw .3
movwf Delay1
movl2 .2
movwf Delay2
Top
decfsz Delay1,f
goto Top
decfsz Delay2,f
goto Top
Нам нужно добавить еще 4 цикла для двух movlw's и двух movwf's к общему уравнению для числа циклов для выполнения.
Итак, буквально, естьобъяснение, почему он выполняет так много циклов.И это объяснение было в техническом описании устройства.
Давайте продолжим.Давайте возьмем генератор кода, с которым связан patrickmdnet, чтобы сгенерировать 780 циклов:
; Delay = 780 instruction cycles
; Clock frequency = 4 MHz
; Actual delay = 0.00078 seconds = 780 cycles
; Error = 0 %
cblock
d1
d2
endc
;778 cycles
movlw 0x9B
movwf d1
movlw 0x01
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0
;2 cycles
goto $+1
Этот цикл построен немного иначе.
мы начинаем с 4 циклов загрузки f регистров, прежде чем перейдем к Delay_0
Внутренние циклы decfsz goto не переходят непосредственно к Delay_0, так как код в вашем вопросе и моем объяснении выше, этот пропускает decfsz d2, f.Таким образом, для не одного прохода через этот цикл есть 1 цикл для decfsz, 2 цикла для goto $ + 2 и 2 цикла для goto Delay_0, всего 5 циклов для каждого не одного d1.И добавьте еще два для времени, когда d1 равен 1. Это дает нам ((0x9B-1) * 5) +2 = 772 цикла, добавьте 4 цикла, прежде чем мы достигнем 776 циклов.
Интереснопоследний decfsz d1, f попадает в decfsz d2, f с d2, установленным в 0x01, что означает, что он гарантированно пропущен.это 2 цикла, goto $ + 2 с другим goto $ + 1 вместо movlw / movwf для загрузки d2 сделали бы то же самое.В любом случае, эта единственная инструкция из 2 циклов приводит нас к 778 циклам
Нам нужно еще два цикла, чтобы добраться до 780, и это делается здесь с помощью goto $ + 1, gotos модифицирует ПК так, чтобы онвсегда 2 цикла.У нас есть 780 циклов, которые я попросил сгенерировать.