реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> STM8 как правильно сделать функцию Delay
_Pasha
сообщение Dec 17 2015, 15:36
Сообщение #16


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

Сообщение отредактировал _Pasha - Dec 17 2015, 15:39
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Dec 17 2015, 16:50
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488



Цитата(Spider @ Dec 17 2015, 17:23) *
В stm8 вообще сложно добиться нужных задержек даже с nop, в виду особенностей работы внутреннего конвейера.
Много интересного описано тут.
с картинками и пояснениями.


Только у меня не открвывается ссылка, точнее весь сайт?
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Dec 17 2015, 19:34
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(_Pasha @ Dec 17 2015, 18:36) *
вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами. При этом изрядно намучался. пришлось даже пользоваться реальным лог. анализатором, что сильно непривычно после кейла, мплаб, или (пардон) протеуса, где все подобные вопросы решались не вставая из-за компа. sad.gif но я вам скажу, там столько извратов для обеспечения нужной прозрачности работы, что неприятные ощущения остались. По крайней мере, пришлось даже приоритеты прерываний тасовать перед стартом процедуры чт/зп бита.

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

Цитата(phenixs @ Dec 17 2015, 19:50) *
Только у меня не открвывается ссылка, точнее весь сайт?

Да... слегка умер...
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jan 16 2016, 02:04
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(phenixs @ Dec 15 2015, 17:20) *
Кто плотно сталкивался с подобной задачей, как правильно написать универсальную функцию 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
Go to the top of the page
 
+Quote Post
uriy
сообщение Jan 16 2016, 19:04
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



ТС нужны микросекундные задержки! С миллисекундными ни у кого нет проблем.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jan 16 2016, 19:17
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Тады ой. В реалтайме может не получиться если задержка в несколько циклов процессора. В таком случае я бы просто считывал значения счетчика системного таймера из регистра и смотрел на дельту в цикле. Важно считывать значения таймера в беззнаковую переменную, тогда переполнение счетчика таймера между двумя отсчетами будет пофиг -- дельта все равно получится правильной.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jan 16 2016, 20:10
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(Tarbal @ Jan 16 2016, 22:17) *
я бы просто считывал значения счетчика системного таймера из регистра и смотрел на дельту в цикле.

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

Цитата(Spider @ Dec 17 2015, 17:23) *
В stm8 вообще сложно добиться нужных задержек даже с nop, в виду особенностей работы внутреннего конвейера.

При желании можно... но действительно геморно...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 17 2016, 07:18
Сообщение #23


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(HHIMERA @ Jan 16 2016, 23:10) *
Откуда в СТМ8 системный таймер???

rolleyes.gif предлагаю TIM4 называть именно так. Ибо больше он ни на что не годен.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jan 17 2016, 10:19
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Ну и что??? Для микросекунд он всё равно не годится... там время вход/выход прерывания впечатляет...
Как и заморачиваться с подобной фигнёй...
Цитата(Tarbal @ Jan 16 2016, 22:17) *
В таком случае я бы просто считывал значения счетчика системного таймера из регистра и смотрел на дельту в цикле. Важно считывать значения таймера в беззнаковую переменную, тогда переполнение счетчика таймера между двумя отсчетами будет пофиг -- дельта все равно получится правильной.

Телодвижений много... толку никакого... Обычный цикл попроще будет...
А вот для миллисекунд и типа динамической индикации... прокатит...
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jan 17 2016, 14:49
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(HHIMERA @ Jan 17 2016, 00:10) *
Если крутиться в цикле... зачем тогда таймер???


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

Цитата(HHIMERA @ Jan 17 2016, 00:10) *
Какой разрядности счётчик... 32 бита??? Ну и сколько это займёт по времени???


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

Цитата(HHIMERA @ Jan 17 2016, 00:10) *
Нет никакого смысла в микросекундных задержках... уже сказали...


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

Цитата(HHIMERA @ Jan 17 2016, 00:10) *
Для единичных случаев всё равно как... в остальных - юзать железо... таймера...


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

Цитата(HHIMERA @ Jan 17 2016, 00:10) *
При желании можно... но действительно геморно...


Профессиональный подход действительно налагает дополнительную ответственность, но каждый выбитрает сам куда ему надо идти.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jan 17 2016, 17:00
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(Tarbal @ Jan 17 2016, 17:49) *
Я не знаком с STM8 архитектурой, но ведь вроде поднимался вопрос о проблеме свяанной с неповторяемостью задержки, исполненной на програмном цикле, из-за конвейера?
Этот подход устранит проблему.

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

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

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

Кому надо... пусть привыкает к хардварным... или полухардварным решениям...
Даже на том же 103-ем... 1-wire... как сказал уже Паша... таймер с компараторами и на прерывании...
Цитата
Профессиональный подход действительно налагает дополнительную ответственность, но каждый выбитрает сам куда ему надо идти.

Не... если кому-то нравится тратить таймер просто так... то я его найду где применить... Их там и так чуть-чуть в младшеньких... всего три...
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jan 18 2016, 03:32
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(HHIMERA @ Jan 17 2016, 20:00) *
Не... если кому-то нравится тратить таймер просто так... то я его найду где применить... Их там и так чуть-чуть в младшеньких... всего три...


Разве там нет свободнобегущего таймера?
Вроде говорили о компараторах, а они как раз и живут на свободнобегущем таймере. Вот его регистр и читать. С конфигурацией таймера ничего делать не надо. Просто читать сам счетчик.
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jan 18 2016, 06:26
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Цитата(phenixs @ Dec 16 2015, 18:11) *
Пример - стандартный SPI

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


Цитата(_Pasha @ Dec 17 2015, 18:36) *
вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами

Да, 1-wire на STM8 только через задницу возможно сделать, потому как на чипах S-серии нет DMA. А был бы, все было бы значительно веселей!
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jan 18 2016, 07:24
Сообщение #29


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(Tarbal @ Jan 18 2016, 06:32) *
С конфигурацией таймера ничего делать не надо. Просто читать сам счетчик.

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

Цитата(Эдди @ Jan 18 2016, 09:26) *
1-wire на STM8 только через задницу возможно сделать

Да всё там нормально... На STM8L тем более...
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jan 18 2016, 13:26
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



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

Посмотрел в интернете и нигде не нашел хорошего описания триггеров. Пришлось обратиться к первоисточнику.
Здесь все изложено подробно. Ищите output compare.
http://www.nxp.com/files/microcontrollers/...anual/GPTRM.pdf
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 13:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01519 секунд с 7
ELECTRONIX ©2004-2016