Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Какая у меня ошибка при расчете задержки?

Пн ноя 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 мкс. Так какая у меня ошибка при расчете задержки?

Re: Какая у меня ошибка при расчете задержки?

Пн ноя 14, 2022 13:34:22

У вас все циклы "256". Только каждый из первого цикла имеет чуть короче длину. потому как после первого выполнения
Код:
decfsz          Reg1,1
goto             $-1
оно выполнится 173 раза, но для второго выполнения там никто 173 не загружает, поэтому следующий раз этот цикл выполнится 256 раз. Так же и все остальные циклы.

Re: Какая у меня ошибка при расчете задержки?

Пн ноя 14, 2022 14:02:41

Рассчитал задержку... бла...бла...бла...

movlw 0.173


Это что за ноль перед точкой?
Я считаю

Вы симулятором МПЛАБа пользоваться умеете? Ваши вопросы однозначно говорят о том, что вы даже не подозреваете о его наличии.
Ну и продолжение мазохизма в коде в стиле "а ля корабельников" да еще и в абсолютном формате не дает возможности наблюдать переменные в Watch.
Вы так ничему толковому никогда не научитесь.

Re: Какая у меня ошибка при расчете задержки?

Пн ноя 14, 2022 15:45:32

Рассчитал задержку... бла...бла...бла...

movlw 0.173


Это что за ноль перед точкой?
Я считаю

Вы симулятором МПЛАБа пользоваться умеете? Ваши вопросы однозначно говорят о том, что вы даже не подозреваете о его наличии.
Ну и продолжение мазохизма в коде в стиле "а ля корабельников" да еще и в абсолютном формате не дает возможности наблюдать переменные в Watch.
Вы так ничему толковому никогда не научитесь.


Нет там никакого нуля, это здесь я по ошибке написал. В реальности, в программе нуля нет.

Добавлено after 37 minutes 32 seconds:
А команда "decfsz Reg,1" выполняется за два машинных цикла?

Re: Какая у меня ошибка при расчете задержки?

Пн ноя 14, 2022 15:54:33

Иногда за 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.

Re: Какая у меня ошибка при расчете задержки?

Пн ноя 14, 2022 16:22:09

А команда...

Вообще то опыт расчета блокирующих задержек вреден... :)
В МК блокирующая задержка - зло. Задержки не должны мешать остальным задачам. Исключение составляют короткие задержки примерно до 100...200 машинных циклов. Большие делают на таймере. Причем для всех задержек используют ОДИН таймер, который работает непрерывно, генерируя прерывания, в обработчике которых и инкрементируют/декрементируют счетчики задержек. А в суперлупе просто периодически проверяются эти счетчики. Обычно такой таймер называют системным.

Re: Какая у меня ошибка при расчете задержки?

Пн ноя 14, 2022 16:51:23

Когда-то в те времена была небольшая утилитка по расчету такой задержки. Както она называлась, чето типа Pause... Надо в своих старых архивах поискать, пользовался ведь...

Ага, нашел-таки!
Pause_ver1.2.zip
(96.85 KiB) Скачиваний: 48

Изображение
Задержка в м.ц. - машинный цикл. А на PIC16 1 м.ц. = 4 такта осциллятора, то есть частота м.ц. в в 4 раза медленнее частоты МК. На картинке 6000 м.ц. = 24000 периодов осциллятора. И при 4 МГц показанная задержка = 6 мс.
PenguinChik вероятно не учитывает, что каждая инструкция в этих циклах занимает 1 м.ц., а инструкция сравнения и перехода - 2 м.ц. (если на память сейчас не ошибаюсь). То есть, нужно не просто циферки в счетчиках считать, а учитывать, сколько м.ц. проходит в каждом круге декремента.

Re: Какая у меня ошибка при расчете задержки?

Пн ноя 14, 2022 17:12:14

Инструкция сравнения, как уже сказали, занимает один цикл, если условие не выполняется и два - если выполняется. То есть два занимает любой переход.

Re: Какая у меня ошибка при расчете задержки?

Пн ноя 14, 2022 17:27:58

а... Ну я пишу чисто по памяти, я ж лет 7 вообще не брал в руки PIC, а на ассемблере его прогал так и того давнее.

Re: Какая у меня ошибка при расчете задержки?

Ср ноя 23, 2022 18:17:22

Когда-то в те времена была небольшая утилитка по расчету такой задержки. Както она называлась, чето типа Pause... Надо в своих старых архивах поискать, пользовался ведь...

Ага, нашел-таки!


Ну да, с этой программой я разобрался. Все работает. А можно ли реализовать задержку без перезаписываний чисел в регистры? Другим способом? C помощью таймера, например

Re: Какая у меня ошибка при расчете задержки?

Ср ноя 23, 2022 18:59:22

Можно, как бы странно это не звучало.

Re: Какая у меня ошибка при расчете задержки?

Чт ноя 24, 2022 04:20:13

C помощью таймера, например

Вы вообще читаете ответы?
Я же вам выше все написал. Именно про таймер... :facepalm:
Вообще то опыт расчета блокирующих задержек вреден... :)
В МК блокирующая задержка - зло. Задержки не должны мешать остальным задачам. Исключение составляют короткие задержки примерно до 100...200 машинных циклов. Большие делают на таймере. Причем для всех задержек используют ОДИН таймер, который работает непрерывно, генерируя прерывания, в обработчике которых и инкрементируют/декрементируют счетчики задержек. А в суперлупе просто периодически проверяются эти счетчики. Обычно такой таймер называют системным.

Но "перезаписывать в регистры" все равно придется. Любая программа для МК наполовину состоит из такого кода.
С таймерными задержками исчезнет блокировка исполнения и исчезнет потребность считать машинные циклы для калибровки величины задержки.

Re: Какая у меня ошибка при расчете задержки?

Чт ноя 24, 2022 09:10:27

Рассчитал задержку на ассемблере с помощью программы.

Берёшь 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
}

Re: Какая у меня ошибка при расчете задержки?

Чт ноя 24, 2022 10:07:16

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