Форум РадиоКот https://radiokot.ru/forum/ |
|
Какая у меня ошибка при расчете задержки? https://radiokot.ru/forum/viewtopic.php?f=58&t=185498 |
Страница 1 из 1 |
Автор: | PenguinChik [ Пн ноя 14, 2022 12:46:22 ] |
Заголовок сообщения: | Какая у меня ошибка при расчете задержки? |
Рассчитал задержку на ассемблере с помощью программы. Задержка равняется 1 секунде. Но почему получился именно такой код? Я по этому коду пробую рассчитать задержку - у меня не получается 1 секунда. Код: movlw 0.173 movwf Reg1 movlw 0.19 movwf Reg2 movlw 0.6 movwf Reg3 decfsz Reg1,1 goto $-1 decfsz Reg2,1 goto $-3 decfsz Reg3,1 goto $-5 Я считаю - сначала счет идет от 173 до нуля. Это 173 мкс. Потом программа перескакивает на Reg2. И количество циклов равно 255*19=4845. Потом программа опускается еще ниже и количество циклов уже равно 225*19*6 = 25650. И если общее число циклов сложить, то получится 30668 мкс. Так какая у меня ошибка при расчете задержки? |
Автор: | uldemir [ Пн ноя 14, 2022 13:34:22 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
У вас все циклы "256". Только каждый из первого цикла имеет чуть короче длину. потому как после первого выполнения Код: decfsz Reg1,1 оно выполнится 173 раза, но для второго выполнения там никто 173 не загружает, поэтому следующий раз этот цикл выполнится 256 раз. Так же и все остальные циклы.
goto $-1 |
Автор: | КРАМ [ Пн ноя 14, 2022 14:02:41 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
Рассчитал задержку... бла...бла...бла... movlw 0.173 Это что за ноль перед точкой? Я считаю Вы симулятором МПЛАБа пользоваться умеете? Ваши вопросы однозначно говорят о том, что вы даже не подозреваете о его наличии. Ну и продолжение мазохизма в коде в стиле "а ля корабельников" да еще и в абсолютном формате не дает возможности наблюдать переменные в Watch. Вы так ничему толковому никогда не научитесь. |
Автор: | PenguinChik [ Пн ноя 14, 2022 15:45:32 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
Рассчитал задержку... бла...бла...бла... movlw 0.173 Это что за ноль перед точкой? Я считаю Вы симулятором МПЛАБа пользоваться умеете? Ваши вопросы однозначно говорят о том, что вы даже не подозреваете о его наличии. Ну и продолжение мазохизма в коде в стиле "а ля корабельников" да еще и в абсолютном формате не дает возможности наблюдать переменные в Watch. Вы так ничему толковому никогда не научитесь. Нет там никакого нуля, это здесь я по ошибке написал. В реальности, в программе нуля нет. Добавлено after 37 minutes 32 seconds: А команда "decfsz Reg,1" выполняется за два машинных цикла? |
Автор: | uldemir [ Пн ноя 14, 2022 15:54:33 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
Иногда за 1, иногда за 2. Читайте даташит на микроконтроллер - там всё подробно написано. Цитата: If Program Counter (PC) is modified or a conditional test is true, the instruction requires two cycles. The second cycle is
executed as a NOP. |
Автор: | КРАМ [ Пн ноя 14, 2022 16:22:09 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
А команда... Вообще то опыт расчета блокирующих задержек вреден... ![]() В МК блокирующая задержка - зло. Задержки не должны мешать остальным задачам. Исключение составляют короткие задержки примерно до 100...200 машинных циклов. Большие делают на таймере. Причем для всех задержек используют ОДИН таймер, который работает непрерывно, генерируя прерывания, в обработчике которых и инкрементируют/декрементируют счетчики задержек. А в суперлупе просто периодически проверяются эти счетчики. Обычно такой таймер называют системным. |
Автор: | КРАМ [ Пн ноя 14, 2022 17:12:14 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
Инструкция сравнения, как уже сказали, занимает один цикл, если условие не выполняется и два - если выполняется. То есть два занимает любой переход. |
Автор: | MLX90640 [ Пн ноя 14, 2022 17:27:58 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
а... Ну я пишу чисто по памяти, я ж лет 7 вообще не брал в руки PIC, а на ассемблере его прогал так и того давнее. |
Автор: | PenguinChik [ Ср ноя 23, 2022 18:17:22 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
Когда-то в те времена была небольшая утилитка по расчету такой задержки. Както она называлась, чето типа Pause... Надо в своих старых архивах поискать, пользовался ведь... Ага, нашел-таки! Ну да, с этой программой я разобрался. Все работает. А можно ли реализовать задержку без перезаписываний чисел в регистры? Другим способом? C помощью таймера, например |
Автор: | uldemir [ Ср ноя 23, 2022 18:59:22 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
Можно, как бы странно это не звучало. |
Автор: | КРАМ [ Чт ноя 24, 2022 04:20:13 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
C помощью таймера, например Вы вообще читаете ответы? Я же вам выше все написал. Именно про таймер... ![]() Вообще то опыт расчета блокирующих задержек вреден... ![]() В МК блокирующая задержка - зло. Задержки не должны мешать остальным задачам. Исключение составляют короткие задержки примерно до 100...200 машинных циклов. Большие делают на таймере. Причем для всех задержек используют ОДИН таймер, который работает непрерывно, генерируя прерывания, в обработчике которых и инкрементируют/декрементируют счетчики задержек. А в суперлупе просто периодически проверяются эти счетчики. Обычно такой таймер называют системным. Но "перезаписывать в регистры" все равно придется. Любая программа для МК наполовину состоит из такого кода. С таймерными задержками исчезнет блокировка исполнения и исчезнет потребность считать машинные циклы для калибровки величины задержки. |
Автор: | OKF [ Чт ноя 24, 2022 09:10:27 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
Рассчитал задержку на ассемблере с помощью программы. Берёшь delay.h/delay.c из htpicc, смотришь выхлоп и не паришься, имея us и ms задержки. Код: #if XTAL_FREQ >= 12MHZ // x <= 750 for 4mHz #define DelayUs(x) { unsigned char _dcnt; \ _dcnt = (x) * ((XTAL_FREQ) / (12MHZ)); \ while(--_dcnt != 0) \ continue; } #else #define DelayUs(x) { unsigned char _dcnt; \ _dcnt = (x) / ((12MHZ) / (XTAL_FREQ)) | 1; \ while(--_dcnt != 0) \ continue; } #endif Код: #include "delay.h"
void DelayMs(unsigned char cnt) { #if XTAL_FREQ <= 2MHZ do { DelayUs(996); } while(--cnt); #endif #if XTAL_FREQ > 2MHZ unsigned char i; do { i = 4; do { DelayUs(250); } while(--i); } while(--cnt); #endif } |
Автор: | Viktorkin [ Чт ноя 24, 2022 10:07:16 ] |
Заголовок сообщения: | Re: Какая у меня ошибка при расчете задержки? |
бывают столь короткие задержки когда таймер использовать невыгодно. или бывает что по логике программы нужно именно подождать и ничего не делать. а реакции на чето там неотложное как раз по прерываниям и делать |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |