Как работает задержка в PIC ASM?Я действительно сбит с толку - PullRequest
1 голос
/ 12 февраля 2011

Я действительно не понимаю этого вообще.Весь код, который я как-то вижу в комментариях в Интернете, содержит случайные числа, объясняющие, почему он делает так много циклов, но буквально нет объяснения, почему что, что, или где, что, кто.Я действительно понятия не имею.

Например:

cblock  
Delay1  
Delay2  
Delay3  
endc  

Start:  

.  
.  
.  

Delay  
movlw .2  
movwf Delay1  ;&&&&
movlw .3  
movwf Delay2  
movlw .4       <------ Important note here. For some reason it loops back to the
movwf Delay3   <------ "&&&&" mark when it reads this piece of code. NO IDEA why

DelayLoop  
decfsz Delay1,f    <----- Explain what this does. Where does it get the time from?
goto   DelayLoop   <----- Thanks
decfsz Delay2,f    <-----
goto   DelayLoop  

end

Любая помощь будет фантастической.

Ответы [ 3 ]

4 голосов
/ 12 февраля 2011

"Я действительно не понимаю этого вообще. Весь код, который я как-то вижу в комментариях онлайн, содержит случайные числа того, почему он делает столько циклов, но буквально нет объяснения, почему, что делает, что или где, чтоделает кто. Я действительно понятия не имею. "

" Я понимаю это, но мне нравится, не знаю, откуда вы получаете ТОЧНОЕ время. Откуда вы его рассчитываете? Откуда эти цифры. ЕслиЯ устанавливаю 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 циклов, которые я попросил сгенерировать.

3 голосов
/ 12 февраля 2011

Идея циклов задержки состоит в том, чтобы записать определенное количество циклов, соответствующих определенному количеству времени. Количество времени в цикле зависит от тактовой частоты вашего процессора PIC.

То, что вы опубликовали, представляет собой трехэтапный цикл задержки, аналогичный сгенерированным здесь: http://www.piclist.com/techref/piclist/codegen/delay.htm

Первый блок инструкций загружает три ячейки памяти со счетчиками. Используйте программу выше, чтобы найти оптимальные значения для получения желаемой задержки.

Второй набор инструкций - это фактическая задержка. "decfsz VAR, f" уменьшит VAR на 1; если VAR равен нулю, он пропускает следующую инструкцию. Таким образом, в вышеупомянутом случае decfsz будет работать до тех пор, пока Delay1 не станет равным нулю, затем перепрыгнет через «goto DelayLoop» и запустит «decfsz Delay2, f».

Предлагаю прочитать эту страницу: http://www.mstracey.btinternet.co.uk/pictutorial/progtut4.htm

а также эта страница: http://www.piclist.com/techref/microchip/PIC16DelayTutorial.htm

для получения дополнительной информации о том, как работают decfsz и goto.

1 голос
/ 13 июля 2012

Частота встроенного RC-генератора определяет тактовый цикл, который, в свою очередь, определяет скорость.

...