Добрый вечер!
Помогите, пожалуйста, студенту в освоении микроконтроллеров серии 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.
Подпрограмма задержки 1 мс
- Реклама
Re: Подпрограмма задержки 1 мс
а что это за язык?
Re: Подпрограмма задержки 1 мс
otest: Это язык ассемблера PIC18.
RadTechNo: В общем, Вы почти все правильно сделали. Замечания:
1. На резервирование памяти время процессора не тратится. Это инструкции для компилятора.
2. У Вас была опечатка в имени переменной WREG_TEMP.
3. Инструкция DECFSZ выполняется за 1 цикл, если нет перехода и за 2 или 3 цикла если есть. Поэтому в цикл задержки пришлось вставить NOP чтобы каждая итерация выполялась за 4 цикла (иначе цикл придется повторять более 255 раз и однобайтным счетчиком цикла не обойтись). Соответственно скорректирована константа 245.
4. Если этот код будет подпрограммой, следует учитывать время передачи управления на нее из основной программы и возврата обратно по-завершении (по 2 цикла каждая).
5. В код подпрограммы добавлены 3 операции NOP для получения точной суммарной задержки в 1000 циклов.
На будущее: число циклов работы программы можно просто определить в режиме отладки с помощью симулятора SIM системы MPLAB.
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 цикла- КРАМ
- Друг Кота
- Сообщения: 25356
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Подпрограмма задержки 1 мс
В предложенном коде команда DECFSZ TEMP1 будет выполнятся за 1 или 2 цикла в зависимости от ветвления, за 3 цикла она не может исполняться, поскольку следующая за ней команда BRA M1 - ОДНОСЛОВНАЯ и будет вставлен ТОЛЬКО ОДИН nop при ветвлении.Ser60 писал(а):3. Инструкция DECFSZ выполняется за 1 цикл, если нет перехода и за 2 или 3 цикла если есть. Поэтому в цикл задержки пришлось вставить NOP чтобы каждая итерация выполялась за 4 цикла...............Код: Выделить всё
........ M1: NOP ; 1 цикл DECFSZ TEMP1 ; 1 цикл BRA M1 ; 2 цикла NOP ; 1 цикл NOP ; 1 цикл NOP ; 1 цикл ........
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2360
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: Подпрограмма задержки 1 мс
Извиняюсь, за оффтоп, но, по-моему, за такое "преподавание" надо бошки откручивать.RadTechNo писал(а):В институте дали задание
Это - в корне неправильный подход. Такие задержки надо организовывать исключительно по прерываниям от таймера.
ICQ нет, и, в ближайшее время, не будет.
- Реклама
Re: Подпрограмма задержки 1 мс
а в задании не говорилось каким методом эту задержку выполнить и с какой точностью...
студент сам соображать должен - где просто пауза, а где точно определенный интервал (тем более, что там и кварц для генератора понадобится может
студент сам соображать должен - где просто пауза, а где точно определенный интервал (тем более, что там и кварц для генератора понадобится может


