Перейти к содержанию
    

STM8 как правильно сделать функцию Delay

Кто плотно сталкивался с подобной задачей, как правильно написать универсальную функцию Delay для STM8

Пробывал такой вариант, так вот uS до 7-10 не чувствует, да и перевести в сон процессор нельзя...насколько понимаю если уводить в сон, то только по прерыванию делать?

Кто как реализовывает?

 

void delays_init (void)
{
  CLK_PCKENR1_bit.PCKEN12 = 1; 
  TIM4_PSCR_bit.PSC = 0x01;    
  TIM4_EGR_bit.UG = 1;         
  TIM4_CR1_bit.CEN = 1;       
}

void delay_us (unsigned char us)
{
  TIM4_CNTR = 0;
  while (TIM4_CNTR < us);  
}

void delay_ms (unsigned int ms)
{
  ms = ms<<2;
  while (ms--) delay_us(250);
}

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

микросекундные задержки я делаю просто бесполезным циклом.

Для миллисекундных у меня все время заведен TIM4 с прерыванием каждые 1 мс и инкрементом переменной внутри.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

микросекундные задержки я делаю просто бесполезным циклом.

Для миллисекундных у меня все время заведен TIM4 с прерыванием каждые 1 мс и инкрементом переменной внутри.

 

А пустой цикл, как подгоняете под реальное время? Замерами на ноге? Или...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да. задержки дело мутное. :smile3046:

пришлось на таймерах делать через compare

TIM4 как и у всех - 1мс системный тик. Это уже стандарт, можно сказать.

А с другой стороны, нафиг этот delay нужен, если можно в прерывании дергать ногами. Для детерминированности времени реакции - придется организовывать вызов фунции по указателю.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да. задержки дело мутное. :smile3046:

пришлось на таймерах делать через compare

TIM4 как и у всех - 1мс системный тик. Это уже стандарт, можно сказать.

А с другой стороны, нафиг этот delay нужен, если можно в прерывании дергать ногами. Для детерминированности времени реакции - придется организовывать вызов фунции по указателю.

 

С задержками 1 и т.д. мс согласен TIM4 наверное лучший вариант, с прерыванием или без по ситуации.

А как делать правельные задержки 1nS или 7nS колхозить с циклами nop ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как делать правельные задержки 1nS или 7nS колхозить с циклами nop ?

1nS - это одна наносекунда? Хотите задержать сигнал на 1 наносекунду - пропустите его через проводник длиной 20 см :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1nS - это одна наносекунда? Хотите задержать сигнал на 1 наносекунду - пропустите его через проводник длиной 20 см :biggrin:

mS - милисекунда

uS - микросекунда

nS - наносекунда

 

насчет nS загнул, имел в виду uS

Изменено пользователем phenixs

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда требуемая задержка приближается по длительности к одному такту, её приходится набирать нопами. Причём, если требуется точность, то непременно на ассемблере.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда требуемая задержка приближается по длительности к одному такту, её приходится набирать нопами. Причём, если требуется точность, то непременно на ассемблере.

 

и индивидульно для каждого проекта(F_CPU b т.д.)-?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и индивидульно для каждого проекта(F_CPU b т.д.)-?

Видимо, да.

Только что у Вас за проекты такие, что везде нужно микросекундные задержки пихать? У меня, к примеру, крайне редко такая необходимость появляется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо, да.

Только что у Вас за проекты такие, что везде нужно микросекундные задержки пихать? У меня, к примеру, крайне редко такая необходимость появляется.

 

Пример - стандартный SPI, после опускания CN надо ждать MISO, по факту приходит сразу, а вдруг...., и сколько ждать ???, надо ставить микросекунд 10-15, точность не нужна но пустой цикл надо гонять получается....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример - стандартный SPI, после опускания CN надо ждать MISO, по факту приходит сразу, а вдруг...., и сколько ждать ???, надо ставить микросекунд 10-15, точность не нужна но пустой цикл надо гонять получается....

CN - это SCK? Сколько ждать - написано в даташите. Читайте, и будет вам щастя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В stm8 вообще сложно добиться нужных задержек даже с nop, в виду особенностей работы внутреннего конвейера.

Много интересного описано тут.

с картинками и пояснениями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...