реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Задержка на Pic16
Peacemaker
сообщение Jan 7 2012, 07:25
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 5-12-11
Пользователь №: 68 688



Нужна задержка на Пик16, к примеру, 0.1 сек.
Нашел 1 прогу, которая генерирует код для задержки, которую мы вводим.
Потом нашел одну ссылку, где делается то же самое.
НО:
когда вводишь 0.1 сек в эти 2 разные проги, то они генерируют:
1)
Цитата
movlw 0x37
movwf d1
movlw 0x4B
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0

;2 cycles
goto $+1

2)
Цитата
movlw .221
movwf Reg_1
movlw .130
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
nop
nop

Какая из них правильная?
Как правильно вручную рассчитывать задержки?
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jan 7 2012, 08:07
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
Нашел 1 прогу

Проги не ищут. Проги пишут.

Единицей измерения времени внутри процессора (в общем случае) служит такт.
Пишем цикл. Рассчитываем время его выполнения.
Если нужны бОльшие задержки - пишем второй цикл, внутри которого вызываем первый с фиксированной задержкой.
И так далее.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Peacemaker
сообщение Jan 7 2012, 09:41
Сообщение #3





Группа: Участник
Сообщений: 10
Регистрация: 5-12-11
Пользователь №: 68 688



Формулу для расчета где взять?
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Jan 7 2012, 09:46
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Peacemaker @ Jan 7 2012, 13:41) *
Формулу для расчета где взять?

Формулу Вы, разумеется, напишете сами. Исходя из конкретной реализации цикла.
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Jan 7 2012, 10:56
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



1 "обычная" команда = 4 такта (машинный цикл). 1 команда перехода (goto, return, retfie, retlw) = 8 тактов (2 машинных цикла)
1 такт = 1 / (частота кварца)
Необходимое кол-во исполненных команд для задержки на 0.1 сек = 0.1 / (1 такт) / 4
Получите кол-во "обычных" команд. В цикле есть ещё переход goto восполняемый за 2 маш.цикла, учитывая это считайте кол-во итераций цикла (циклов, если потребуются вложенные)
Для точного набивания времени можно использовать nop (1 маш.цикл) или goto $+1 (2 маш.цикла на одной команде) - оба этих трюка используются в приведённых примерах.
Теперь пишите формулу, забивайте в Scilab или какую другую считалку и считайте.


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Jan 11 2012, 20:23
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Cosmojam @ Jan 7 2012, 12:56) *
Теперь пишите формулу, забивайте в Scilab или какую другую считалку и считайте.

Ну и разумеется проверяете готовую программу на симуляторе в MPLABe. Такты он считает до безобразия корректно. Время округляет при показе больших величин, а вот такты показывает правильно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th August 2025 - 09:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01937 секунд с 7
ELECTRONIX ©2004-2016