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

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

вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами. При этом изрядно намучался. пришлось даже пользоваться реальным лог. анализатором, что сильно непривычно после кейла, мплаб, или (пардон) протеуса, где все подобные вопросы решались не вставая из-за компа. :( но я вам скажу, там столько извратов для обеспечения нужной прозрачности работы, что неприятные ощущения остались. По крайней мере, пришлось даже приоритеты прерываний тасовать перед стартом процедуры чт/зп бита.

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

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


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

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

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

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

 

Только у меня не открвывается ссылка, точнее весь сайт?

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


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

вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами. При этом изрядно намучался. пришлось даже пользоваться реальным лог. анализатором, что сильно непривычно после кейла, мплаб, или (пардон) протеуса, где все подобные вопросы решались не вставая из-за компа. :( но я вам скажу, там столько извратов для обеспечения нужной прозрачности работы, что неприятные ощущения остались. По крайней мере, пришлось даже приоритеты прерываний тасовать перед стартом процедуры чт/зп бита.

Вот только не надо никого этим пугать... Это не СТМ32 конечно... где вообще всё хардварно на несколько 18В20 раскручивается... но всё же...

На STM8S всё более-менее прилично... хоть и на отфонарном пине... на STM8L на фонарном вообще без проблем...

 

Только у меня не открвывается ссылка, точнее весь сайт?

Да... слегка умер...

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


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

Кто плотно сталкивался с подобной задачей, как правильно написать универсальную функцию 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);
}

 

Я пытался рассказать как рационально построить структуру реалтайм устройств без операционной системы, но из форума для начинающих тему перенесли в общение и там она похерилась. Задержки в такой структуре делаются элегантно и просто. Будут интересны детали -- спросите.

 

Идея состоит в том, чтобы сделать главный цикл синхронным. Скажем раз в 1 миллисекунду, а внутри можно сделать подцикл раз в 10, следующий раз в секунду и т.д.

Ваши задачи вы пишите как машины состояний, которые исполняются в соответствующих циклах. У меня в основном были в 10 миллисекундном цикле.

 

Структура задач становится несколько непривычной поначалу, но ненадолго.

 

Как делать задержку скажем на 40 миллисекунд.

 

 

int timer1 = 0;

/* request for a deferred action */
void delay1(int time)
{ 
    timer1 = time;
}

...........................


/* in 10 milliseconds loop */
    if(timer1){
        if(-- timer1 == 0){

/* Execute here your delayed action */
        }
    }

............................

/* request somewhere executing action after delay 40 milliseconds */
    delay1(4);

 

 

Это если что-то простое. А если надо посложнее, то делаете машину состояний и декрементируете переменную

в состоянии ожидания, а как станет нулем -- переходите в другое состояние.

 

 

Там меня некоторые товарищи по делу критиковали за некорректные формулировки во вводной части темы, но тем не менее на мой взгляд там есть что-то интересное и я надеюсь вы найдете что-то полезное для себя. Будут вопросы -- спрашивайте.

Вот тема:

http://electronix.ru/forum/index.php?showt...132036&st=0

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


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

ТС нужны микросекундные задержки! С миллисекундными ни у кого нет проблем.

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


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

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

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


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

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

Если крутиться в цикле... зачем тогда таймер??? Откуда в СТМ8 системный таймер??? Какой разрядности счётчик... 32 бита??? Ну и сколько это займёт по времени???

Нет никакого смысла в микросекундных задержках... уже сказали... Для единичных случаев всё равно как... в остальных - юзать железо... таймера...

 

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

При желании можно... но действительно геморно...

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


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

Откуда в СТМ8 системный таймер???

:rolleyes: предлагаю TIM4 называть именно так. Ибо больше он ни на что не годен.

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


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

Ну и что??? Для микросекунд он всё равно не годится... там время вход/выход прерывания впечатляет...

Как и заморачиваться с подобной фигнёй...

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

Телодвижений много... толку никакого... Обычный цикл попроще будет...

А вот для миллисекунд и типа динамической индикации... прокатит...

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


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

Если крутиться в цикле... зачем тогда таймер???

 

Я не знаком с STM8 архитектурой, но ведь вроде поднимался вопрос о проблеме свяанной с неповторяемостью задержки, исполненной на програмном цикле, из-за конвейера?

Этот подход устранит проблему.

 

Какой разрядности счётчик... 32 бита??? Ну и сколько это займёт по времени???

 

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

 

Нет никакого смысла в микросекундных задержках... уже сказали...

 

Всяко бывает. Убедите ТС в этом.

 

Для единичных случаев всё равно как... в остальных - юзать железо... таймера...

 

Кому все равно, а кому надо, чтобы работало не как получится, а как надо.

 

При желании можно... но действительно геморно...

 

Профессиональный подход действительно налагает дополнительную ответственность, но каждый выбитрает сам куда ему надо идти.

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


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

Я не знаком с STM8 архитектурой, но ведь вроде поднимался вопрос о проблеме свяанной с неповторяемостью задержки, исполненной на програмном цикле, из-за конвейера?

Этот подход устранит проблему.

Не устранит... да это особо и не нужно...

Ради прикола... как-то замутил частотомер на 103-ем... на Си... выравнивал НОПами... Геморно... после каждого исправления/дополнения приходилось всё делать заново... но работало чётко... но только ради прикола...

Хардварно - вообще без проблем... всё такт в такт...

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

8 бит??? 16мкС максимум??? Этого даже на 1-wire не хватит... Да и толку... прерывания сделают своё грязное дело... Или опять по старой привычке их запрещать???

Всяко бывает. Убедите ТС в этом.

Зачем??? Сам убедится...

Кому все равно, а кому надо, чтобы работало не как получится, а как надо.

Кому надо... пусть привыкает к хардварным... или полухардварным решениям...

Даже на том же 103-ем... 1-wire... как сказал уже Паша... таймер с компараторами и на прерывании...

Профессиональный подход действительно налагает дополнительную ответственность, но каждый выбитрает сам куда ему надо идти.

Не... если кому-то нравится тратить таймер просто так... то я его найду где применить... Их там и так чуть-чуть в младшеньких... всего три...

 

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


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

Не... если кому-то нравится тратить таймер просто так... то я его найду где применить... Их там и так чуть-чуть в младшеньких... всего три...

 

Разве там нет свободнобегущего таймера?

Вроде говорили о компараторах, а они как раз и живут на свободнобегущем таймере. Вот его регистр и читать. С конфигурацией таймера ничего делать не надо. Просто читать сам счетчик.

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


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

Пример - стандартный SPI

На кой черт стандартному SPI задержки? Он же АППАРАТНЫЙ! Вы еще I2C программно реализуйте, когда аппаратный отлично работает…

 

 

вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами

Да, 1-wire на STM8 только через задницу возможно сделать, потому как на чипах S-серии нет DMA. А был бы, все было бы значительно веселей!

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


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

С конфигурацией таймера ничего делать не надо. Просто читать сам счетчик.

:biggrin:

Зашибись!!! STM8S003... три таймера... два из них 16-и... один восьмибитный... На таймерах висит... IR-датчик... 1-wire и семисегментник с автокоррекцией разнояркости разрядов... В итоге - ни один из них не является свободнобегущим... Дальше... зачем здесь нужны микросекунды... если всё или хардварно... или полухардварно??? Как таймером в цикле мерять мкС... если в любой момент прилетит прерывание... и может не одно... и даже одно может прервать другое???

 

1-wire на STM8 только через задницу возможно сделать

Да всё там нормально... На STM8L тем более...

 

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


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

Разные бывают задачи. Вы знакомы с апликацией ТС? Там используются все перечисленные вами ресурсы?

Вы знакомы с концепцией компараторов? Они как раз на свободнобегущих таймерах работают. А если есть и такие устройства в таймерах, то реальность оказывается шире представления о ней.

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

Тщательнее надо придумывать аргументы.

 

Посмотрел в интернете и нигде не нашел хорошего описания триггеров. Пришлось обратиться к первоисточнику.

Здесь все изложено подробно. Ищите output compare.

http://www.nxp.com/files/microcontrollers/...anual/GPTRM.pdf

 

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


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

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

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

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

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

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

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

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

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

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