avatar_mevial

Общие вопросы программирования микроконтроллеров

Автор mevial, 16 Окт. 2014 в 13:39

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

mevial

Цитата: xxoma от 16 Окт. 2014 в 12:17
[user]stranger[/user], по поводу Ds18B20, не будет он работать в моторе(то есть будет но только в паузах работы мотора), проверено на личном опыте.
Блин, только закупил 3 штуки для батареи(край, центр, улица), токи до 600А, но правда от 2х внутренних микроконтроллер будет в 30см.
PS: Стоит малореальная задача написать термостат в батарею с блэкджеком блютусом за 1 день. Приветствуется частотонезависимая реализация 1wire для опроса датчика на таймере, а то взял у знакомого готовую, а там сплошные delay, они же кушают драгоценные миллиамперы. Да и переделывать придётся с его f4xx на мой f1xx.

stranger

#1
Цитата: mevial от 16 Окт. 2014 в 13:39
Приветствуется частотонезависимая реализация 1wire для опроса датчика на таймере, а то взял у знакомого готовую, а там сплошные delay, они же кушают драгоценные миллиамперы. Да и переделывать придётся с его f4xx на мой f1xx.

Я использую для опроса шины 1wire USART+DMA. Никаких дилэев, ибо это зло. Ну и переносить на другой проц имхо проще.

Код брал отсюда, у меня он отлично работает:
http://we.easyelectronics.ru/STM32/stm32-1-wire-dma.html

mevial

Цитата: stranger от 16 Окт. 2014 в 14:45
Я использую для опроса шины 1wire USART+DMA. Никаких дилэев, ибо это зло. Ну и переносить на другой проц имхо проще.
А я нашёл дилэй:
while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);

Надо будет о прерываниях подумать. Интересно, а сколько экономит DMA? При условии, что когда проц не обрабатывает прерывания, то он спит.
Но данное решение ограничивает меня одним датчиком, usart1 занят блютусом. Хотелось бы что-то на таймере собрать, чтобы каждому датчику своя нога.

stranger

#3
Этот не тот дилэй. ;-)
Полный код там такой:

   while (USART_GetFlagStatus(OW_USART, USART_FLAG_TC) == RESET) {
#ifdef OW_GIVE_TICK_RTOS
      taskYIELD();
#endif
   }

Т.е., ожидая готовности усарта, мы отдаем тики RTOS, не тратя процессорное время на сам цикл, а этот цикл и так будет вызываться по прерываниям от RTOS.

А зачем вешать датчики на разные ноги? Прелесть 1wire как раз в том, что датчики можно на 1 шину все посадить.

zap

#4
Цитата: stranger от 16 Окт. 2014 в 18:14
Т.е., ожидая готовности усарта, мы отдаем тики RTOS, не тратя процессорное время на сам цикл, а этот цикл и так будет вызываться по прерываниям от RTOS.
Тут одно из двух.
Если RTOS Yield() проигнорирует по причине того, что наша задача является единственной активной, и тут же вернёт нам остаток кванта времени, то проц по сути будет крутиться в тугом цикле.
А если Yield решит заснуть процессор пока не кончится квант разделения времени, тогда ещё хуже - мы проморгаем момент, когда USART завершит работу, и получим управление существенно позже.

Цитата: stranger от 16 Окт. 2014 в 18:14
А зачем вешать датчики на разные ноги? Прелесть 1wire как раз в том, что датчики можно на 1 шину все посадить.
А Вы когда-нибудь смотрели на осцилограммы содержимого длинных проводов в условиях мощных электромагнитных помех?
С уважением,
Андрей

Поражаю масштабностью некопмпетентность (ц) из лички

stranger

Я понял коллегу  mevial так.
Ему дали код опроса линии 1wire, в котором все задержки мастера сделаны программно. Он попросил дать алгоритм: "Приветствуется частотонезависимая реализация 1wire". Я привел таки пример реализации работы мастера, в котором алгоритмы формирования тайм-слотов реализуются аппаратно усартом. На мой взгляд использование связки USART+DMA там сделано достаточно красиво. А тот опрос готовности флага передатчика усарта - это всё-таки немного из другой оперы и здесь возможны разные варианты решения проблемы. У меня при использовании FreeRtos и нескольких задач с разными приоритетами нет проблем отдавать управление планировщику если усарт ещё не готов. Если бы я решал задачу коллеги mevial (термостат), то обошелся бы без RTOS, а использовал бы очередь и прерывание. Т.е. передатчик усарта готов, возникает прерывание и в нём смотрим, есть ли в очереди очередной байт для отправки. Если есть, пишем его в усарт, дальше спать. Если нет, сразу спать.


Цитата: zap от 16 Окт. 2014 в 19:17
А Вы когда-нибудь смотрели на осцилограммы содержимого длинных проводов в условиях мощных электромагнитных помех?

Конечно.

mevial

Я пока запиливаю алгоритм на ШИМе 3го таймера, а в промежутках ожидания будет просто wfi, таймер сам разбудит. Таки считаю, что опрос 3х датчиков на 1м проводе крайне накладен, ведь тогда придётся адресовать каждый датчик, запиливать уберменю, где юзер увидев список датчиков будет их распихивать по нужным позициям контроля, а как юзер узнает? Значит в уберменю должен быть монитор датчиков, чтобы юзер их мог щупать рукой и видеть реакцию, и не дай бог ему разместить датчики заранее, перед подключением к плате. А что будет если 1 датчик умрёт? Правильно, заново всё конфигурировать, ведь серийники уникальны. Плюс время опроса датчиков, оно возрастает, и не в 3 раза, а раз в 10 с передачей адреса каждого датчика. Куда проще, когда юзеру даётся 3 гнезда и инструкция, что 1е отвечает за одно, 2е за другое, а 3е за погоду на марсе.

stranger