_Pasha 0 17 декабря, 2015 Опубликовано 17 декабря, 2015 (изменено) · Жалоба вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами. При этом изрядно намучался. пришлось даже пользоваться реальным лог. анализатором, что сильно непривычно после кейла, мплаб, или (пардон) протеуса, где все подобные вопросы решались не вставая из-за компа. :( но я вам скажу, там столько извратов для обеспечения нужной прозрачности работы, что неприятные ощущения остались. По крайней мере, пришлось даже приоритеты прерываний тасовать перед стартом процедуры чт/зп бита. Изменено 17 декабря, 2015 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=az=- 0 17 декабря, 2015 Опубликовано 17 декабря, 2015 · Жалоба В stm8 вообще сложно добиться нужных задержек даже с nop, в виду особенностей работы внутреннего конвейера. Много интересного описано тут. с картинками и пояснениями. Только у меня не открвывается ссылка, точнее весь сайт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 17 декабря, 2015 Опубликовано 17 декабря, 2015 · Жалоба вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами. При этом изрядно намучался. пришлось даже пользоваться реальным лог. анализатором, что сильно непривычно после кейла, мплаб, или (пардон) протеуса, где все подобные вопросы решались не вставая из-за компа. :( но я вам скажу, там столько извратов для обеспечения нужной прозрачности работы, что неприятные ощущения остались. По крайней мере, пришлось даже приоритеты прерываний тасовать перед стартом процедуры чт/зп бита. Вот только не надо никого этим пугать... Это не СТМ32 конечно... где вообще всё хардварно на несколько 18В20 раскручивается... но всё же... На STM8S всё более-менее прилично... хоть и на отфонарном пине... на STM8L на фонарном вообще без проблем... Только у меня не открвывается ссылка, точнее весь сайт? Да... слегка умер... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Кто плотно сталкивался с подобной задачей, как правильно написать универсальную функцию 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба ТС нужны микросекундные задержки! С миллисекундными ни у кого нет проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Тады ой. В реалтайме может не получиться если задержка в несколько циклов процессора. В таком случае я бы просто считывал значения счетчика системного таймера из регистра и смотрел на дельту в цикле. Важно считывать значения таймера в беззнаковую переменную, тогда переполнение счетчика таймера между двумя отсчетами будет пофиг -- дельта все равно получится правильной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба я бы просто считывал значения счетчика системного таймера из регистра и смотрел на дельту в цикле. Если крутиться в цикле... зачем тогда таймер??? Откуда в СТМ8 системный таймер??? Какой разрядности счётчик... 32 бита??? Ну и сколько это займёт по времени??? Нет никакого смысла в микросекундных задержках... уже сказали... Для единичных случаев всё равно как... в остальных - юзать железо... таймера... В stm8 вообще сложно добиться нужных задержек даже с nop, в виду особенностей работы внутреннего конвейера. При желании можно... но действительно геморно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 17 января, 2016 Опубликовано 17 января, 2016 · Жалоба Откуда в СТМ8 системный таймер??? :rolleyes: предлагаю TIM4 называть именно так. Ибо больше он ни на что не годен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 17 января, 2016 Опубликовано 17 января, 2016 · Жалоба Ну и что??? Для микросекунд он всё равно не годится... там время вход/выход прерывания впечатляет... Как и заморачиваться с подобной фигнёй... В таком случае я бы просто считывал значения счетчика системного таймера из регистра и смотрел на дельту в цикле. Важно считывать значения таймера в беззнаковую переменную, тогда переполнение счетчика таймера между двумя отсчетами будет пофиг -- дельта все равно получится правильной. Телодвижений много... толку никакого... Обычный цикл попроще будет... А вот для миллисекунд и типа динамической индикации... прокатит... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 17 января, 2016 Опубликовано 17 января, 2016 · Жалоба Если крутиться в цикле... зачем тогда таймер??? Я не знаком с STM8 архитектурой, но ведь вроде поднимался вопрос о проблеме свяанной с неповторяемостью задержки, исполненной на програмном цикле, из-за конвейера? Этот подход устранит проблему. Какой разрядности счётчик... 32 бита??? Ну и сколько это займёт по времени??? Такой же какой и регистр таймера. Подход отход займет пару команд исполнить -- считать и сравнить, а задержка будет такая какую запросят с толерансом на подход отход. Нет никакого смысла в микросекундных задержках... уже сказали... Всяко бывает. Убедите ТС в этом. Для единичных случаев всё равно как... в остальных - юзать железо... таймера... Кому все равно, а кому надо, чтобы работало не как получится, а как надо. При желании можно... но действительно геморно... Профессиональный подход действительно налагает дополнительную ответственность, но каждый выбитрает сам куда ему надо идти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 17 января, 2016 Опубликовано 17 января, 2016 · Жалоба Я не знаком с STM8 архитектурой, но ведь вроде поднимался вопрос о проблеме свяанной с неповторяемостью задержки, исполненной на програмном цикле, из-за конвейера? Этот подход устранит проблему. Не устранит... да это особо и не нужно... Ради прикола... как-то замутил частотомер на 103-ем... на Си... выравнивал НОПами... Геморно... после каждого исправления/дополнения приходилось всё делать заново... но работало чётко... но только ради прикола... Хардварно - вообще без проблем... всё такт в такт... Такой же какой и регистр таймера. Подход отход займет пару команд исполнить -- считать и сравнить, а задержка будет такая какую запросят с толерансом на подход отход. 8 бит??? 16мкС максимум??? Этого даже на 1-wire не хватит... Да и толку... прерывания сделают своё грязное дело... Или опять по старой привычке их запрещать??? Всяко бывает. Убедите ТС в этом. Зачем??? Сам убедится... Кому все равно, а кому надо, чтобы работало не как получится, а как надо. Кому надо... пусть привыкает к хардварным... или полухардварным решениям... Даже на том же 103-ем... 1-wire... как сказал уже Паша... таймер с компараторами и на прерывании... Профессиональный подход действительно налагает дополнительную ответственность, но каждый выбитрает сам куда ему надо идти. Не... если кому-то нравится тратить таймер просто так... то я его найду где применить... Их там и так чуть-чуть в младшеньких... всего три... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 18 января, 2016 Опубликовано 18 января, 2016 · Жалоба Не... если кому-то нравится тратить таймер просто так... то я его найду где применить... Их там и так чуть-чуть в младшеньких... всего три... Разве там нет свободнобегущего таймера? Вроде говорили о компараторах, а они как раз и живут на свободнобегущем таймере. Вот его регистр и читать. С конфигурацией таймера ничего делать не надо. Просто читать сам счетчик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 18 января, 2016 Опубликовано 18 января, 2016 · Жалоба Пример - стандартный SPI На кой черт стандартному SPI задержки? Он же АППАРАТНЫЙ! Вы еще I2C программно реализуйте, когда аппаратный отлично работает… вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами Да, 1-wire на STM8 только через задницу возможно сделать, потому как на чипах S-серии нет DMA. А был бы, все было бы значительно веселей! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 18 января, 2016 Опубликовано 18 января, 2016 · Жалоба С конфигурацией таймера ничего делать не надо. Просто читать сам счетчик. Зашибись!!! STM8S003... три таймера... два из них 16-и... один восьмибитный... На таймерах висит... IR-датчик... 1-wire и семисегментник с автокоррекцией разнояркости разрядов... В итоге - ни один из них не является свободнобегущим... Дальше... зачем здесь нужны микросекунды... если всё или хардварно... или полухардварно??? Как таймером в цикле мерять мкС... если в любой момент прилетит прерывание... и может не одно... и даже одно может прервать другое??? 1-wire на STM8 только через задницу возможно сделать Да всё там нормально... На STM8L тем более... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 18 января, 2016 Опубликовано 18 января, 2016 · Жалоба Разные бывают задачи. Вы знакомы с апликацией ТС? Там используются все перечисленные вами ресурсы? Вы знакомы с концепцией компараторов? Они как раз на свободнобегущих таймерах работают. А если есть и такие устройства в таймерах, то реальность оказывается шире представления о ней. Если вы исполнили задержку на прерывании и в момент срабатывания прерывания от таймера обрабатывалось другое прерывание, то задержка будет точно такая же как и в том варианте, что я предложил. А если прерывания в этот момент не случится, то и мое предложение даст верную задержку. Тщательнее надо придумывать аргументы. Посмотрел в интернете и нигде не нашел хорошего описания триггеров. Пришлось обратиться к первоисточнику. Здесь все изложено подробно. Ищите output compare. http://www.nxp.com/files/microcontrollers/...anual/GPTRM.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться