Подпрограмма задержки 1 мс

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
RadTechNo
Родился
Сообщения: 7
Зарегистрирован: Ср ноя 30, 2011 20:26:02

Подпрограмма задержки 1 мс

Сообщение RadTechNo »

Добрый вечер!
Помогите, пожалуйста, студенту в освоении микроконтроллеров серии PIC.
В институте дали задание - сделать подпрограмму задержки в 1 мс.
Не могли бы Вы мне указать на мои ошибки и по возможности подправить меня, если я не прав!
;Задача: Сделать программу задержки 1 мс.

WREG_TEMP RES 1 ;2 цикла
STATUS_TEMP RES 1 ;2 цикла
BSR_TEMP RES 1 ;2 цикла

DELAY:
MOVFF WREG,WREG_STATUS; Сохранение контектста. ;2 цикла
MOVFF STATUS,STATUS_TEMP;Для выполнения команды MOVFF требует 2 цикла. ;2 цикла
MOVFF BSR,BSR_TEMP; ;2 цикла

MOVLW .230 ; 1 цикл
MOVWF TEMP1; 1 цикл
M1: DECFSZ TEMP1; Постепенное уменьшение на 1 значения в регистре TEMP1. 2 цикла
BRA M1; с проверикой флага Z.

MOVFF WREG_STATUS,WREG; Восстановление контектста. 2 цикла
MOVFF STATUS_TEMP,STATUS; 2 цикла
MOVFF BSR_TEMP,BSR; 2 цикла
RET;

;1 цикл=4 такта. F.такт=F.ген/4=1Мгц. 1 такт=1мкс. 1 цикл=4мкс.
;Общее кол-во циклов:2*6+1+1+2*3=20
;20 циклов займут: 20*4мкс=80 мкс, тогда нам останется 1000-80=920мкс, т.е 920/4=230, его и записываем в TEMP1.
Реклама
otest
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

Re: Подпрограмма задержки 1 мс

Сообщение otest »

а что это за язык?
Реклама
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Подпрограмма задержки 1 мс

Сообщение Ser60 »

otest: Это язык ассемблера PIC18.

RadTechNo: В общем, Вы почти все правильно сделали. Замечания:
1. На резервирование памяти время процессора не тратится. Это инструкции для компилятора.
2. У Вас была опечатка в имени переменной WREG_TEMP.
3. Инструкция DECFSZ выполняется за 1 цикл, если нет перехода и за 2 или 3 цикла если есть. Поэтому в цикл задержки пришлось вставить NOP чтобы каждая итерация выполялась за 4 цикла (иначе цикл придется повторять более 255 раз и однобайтным счетчиком цикла не обойтись). Соответственно скорректирована константа 245.
4. Если этот код будет подпрограммой, следует учитывать время передачи управления на нее из основной программы и возврата обратно по-завершении (по 2 цикла каждая).
5. В код подпрограммы добавлены 3 операции NOP для получения точной суммарной задержки в 1000 циклов.

Код: Выделить всё

DELAY:
	MOVFF WREG,WREG_TEMP; Сохранение контектста. ;2 цикла
	MOVFF STATUS,STATUS_TEMP;Для выполнения команды MOVFF требует 2 цикла. ;2 цикла
	MOVFF BSR,BSR_TEMP; ;2 цикла

	MOVLW .245 		; 1 цикл
	MOVWF TEMP1		; 1 цикл
M1: NOP				; 1 цикл
	DECFSZ TEMP1	        ; 1 цикл
	BRA M1			; 2 цикла

	NOP				; 1 цикл
	NOP				; 1 цикл
	NOP				; 1 цикл
	
	MOVFF WREG_TEMP,WREG; Восстановление контектста. 2 цикла
	MOVFF STATUS_TEMP,STATUS; 2 цикла
	MOVFF BSR_TEMP,BSR; 2 цикла
	RETURN ; 2 цикла
На будущее: число циклов работы программы можно просто определить в режиме отладки с помощью симулятора SIM системы MPLAB.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25356
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Подпрограмма задержки 1 мс

Сообщение КРАМ »

Ser60 писал(а):3. Инструкция DECFSZ выполняется за 1 цикл, если нет перехода и за 2 или 3 цикла если есть. Поэтому в цикл задержки пришлось вставить NOP чтобы каждая итерация выполялась за 4 цикла...........

Код: Выделить всё

........
M1: NOP				; 1 цикл
	DECFSZ TEMP1	        ; 1 цикл
	BRA M1			; 2 цикла

	NOP				; 1 цикл
	NOP				; 1 цикл
	NOP				; 1 цикл
	
........
....
В предложенном коде команда DECFSZ TEMP1 будет выполнятся за 1 или 2 цикла в зависимости от ветвления, за 3 цикла она не может исполняться, поскольку следующая за ней команда BRA M1 - ОДНОСЛОВНАЯ и будет вставлен ТОЛЬКО ОДИН nop при ветвлении.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2360
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Подпрограмма задержки 1 мс

Сообщение Dmitry Dubrovenko »

RadTechNo писал(а):В институте дали задание
Извиняюсь, за оффтоп, но, по-моему, за такое "преподавание" надо бошки откручивать.
Это - в корне неправильный подход. Такие задержки надо организовывать исключительно по прерываниям от таймера.
ICQ нет, и, в ближайшее время, не будет.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Подпрограмма задержки 1 мс

Сообщение BOB51 »

а в задании не говорилось каким методом эту задержку выполнить и с какой точностью... 8)
студент сам соображать должен - где просто пауза, а где точно определенный интервал (тем более, что там и кварц для генератора понадобится может :beer:
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»