Электротранспорт

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск    

Новости:

Страницы: 1Вниз

Автор Тема: Общие вопросы программирования микроконтроллеров  (Прочитано 739 раз)

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

mevial

  • Старожил
  • *****
  • Репутация:
    +185/-3
  • :
    648
    736
  • Сообщений: 8001
  • Тамбов
  • Вступил в ЭлЛада клуб
  • Оффлайн Оффлайн
    • mevial.ru
    • Награды
, по поводу Ds18B20, не будет он работать в моторе(то есть будет но только в паузах работы мотора), проверено на личном опыте.
Блин, только закупил 3 штуки для батареи(край, центр, улица), токи до 600А, но правда от 2х внутренних микроконтроллер будет в 30см.
PS: Стоит малореальная задача написать термостат в батарею с блэкджеком блютусом за 1 день. Приветствуется частотонезависимая реализация 1wire для опроса датчика на таймере, а то взял у знакомого готовую, а там сплошные delay, они же кушают драгоценные миллиамперы. Да и переделывать придётся с его f4xx на мой f1xx.
« Последнее редактирование: 16 Окт 2014 в 19:24 от zap »

stranger

  • Неравнодушный
  • **
  • Репутация:
    +14/-0
  • :
    2
    2
  • Сообщений: 180
  • Новосибирск
  • Оффлайн Оффлайн
    • Награды
Универсальный бортовой компьютер iWattnick
« Ответ #1 : 16 Окт 2014 в 14:45 »
Приветствуется частотонезависимая реализация 1wire для опроса датчика на таймере, а то взял у знакомого готовую, а там сплошные delay, они же кушают драгоценные миллиамперы. Да и переделывать придётся с его f4xx на мой f1xx.

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

Код брал отсюда, у меня он отлично работает:
http://we.easyelectronics.ru/STM32/stm32-1-wire-dma.html
« Последнее редактирование: 16 Окт 2014 в 14:51 от stranger »

mevial

  • Старожил
  • *****
  • Репутация:
    +185/-3
  • :
    648
    736
  • Сообщений: 8001
  • Тамбов
  • Вступил в ЭлЛада клуб
  • Оффлайн Оффлайн
    • mevial.ru
    • Награды
Универсальный бортовой компьютер iWattnick
« Ответ #2 : 16 Окт 2014 в 17:19 »
Я использую для опроса шины 1wire USART+DMA. Никаких дилэев, ибо это зло. Ну и переносить на другой проц имхо проще.
А я нашёл дилэй:
while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
Надо будет о прерываниях подумать. Интересно, а сколько экономит DMA? При условии, что когда проц не обрабатывает прерывания, то он спит.
Но данное решение ограничивает меня одним датчиком, usart1 занят блютусом. Хотелось бы что-то на таймере собрать, чтобы каждому датчику своя нога.

stranger

  • Неравнодушный
  • **
  • Репутация:
    +14/-0
  • :
    2
    2
  • Сообщений: 180
  • Новосибирск
  • Оффлайн Оффлайн
    • Награды
Универсальный бортовой компьютер iWattnick
« Ответ #3 : 16 Окт 2014 в 18:14 »
Этот не тот дилэй. ;-)
Полный код там такой:

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

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

А зачем вешать датчики на разные ноги? Прелесть 1wire как раз в том, что датчики можно на 1 шину все посадить.
« Последнее редактирование: 16 Окт 2014 в 18:26 от stranger »

zap

  • Администратор
  • Старожил
  • *
  • Репутация:
    +510/-17
  • :
    153
    1499
  • Сообщений: 11755
  • Санкт-Петербург
  • Оффлайн Оффлайн
    • electrotransport.ru
    • Награды
Универсальный бортовой компьютер iWattnick
« Ответ #4 : 16 Окт 2014 в 19:17 »
Т.е., ожидая готовности усарта, мы отдаем тики RTOS, не тратя процессорное время на сам цикл, а этот цикл и так будет вызываться по прерываниям от RTOS.
Тут одно из двух.
Если RTOS Yield() проигнорирует по причине того, что наша задача является единственной активной, и тут же вернёт нам остаток кванта времени, то проц по сути будет крутиться в тугом цикле.
А если Yield решит заснуть процессор пока не кончится квант разделения времени, тогда ещё хуже - мы проморгаем момент, когда USART завершит работу, и получим управление существенно позже.

А зачем вешать датчики на разные ноги? Прелесть 1wire как раз в том, что датчики можно на 1 шину все посадить.
А Вы когда-нибудь смотрели на осцилограммы содержимого длинных проводов в условиях мощных электромагнитных помех?
« Последнее редактирование: 16 Окт 2014 в 19:26 от zap »

С уважением,
Андрей

stranger

  • Неравнодушный
  • **
  • Репутация:
    +14/-0
  • :
    2
    2
  • Сообщений: 180
  • Новосибирск
  • Оффлайн Оффлайн
    • Награды
Универсальный бортовой компьютер iWattnick
« Ответ #5 : 20 Окт 2014 в 11:53 »
Я понял коллегу  mevial так.
Ему дали код опроса линии 1wire, в котором все задержки мастера сделаны программно. Он попросил дать алгоритм: "Приветствуется частотонезависимая реализация 1wire". Я привел таки пример реализации работы мастера, в котором алгоритмы формирования тайм-слотов реализуются аппаратно усартом. На мой взгляд использование связки USART+DMA там сделано достаточно красиво. А тот опрос готовности флага передатчика усарта - это всё-таки немного из другой оперы и здесь возможны разные варианты решения проблемы. У меня при использовании FreeRtos и нескольких задач с разными приоритетами нет проблем отдавать управление планировщику если усарт ещё не готов. Если бы я решал задачу коллеги mevial (термостат), то обошелся бы без RTOS, а использовал бы очередь и прерывание. Т.е. передатчик усарта готов, возникает прерывание и в нём смотрим, есть ли в очереди очередной байт для отправки. Если есть, пишем его в усарт, дальше спать. Если нет, сразу спать.


А Вы когда-нибудь смотрели на осцилограммы содержимого длинных проводов в условиях мощных электромагнитных помех?

Конечно.

mevial

  • Старожил
  • *****
  • Репутация:
    +185/-3
  • :
    648
    736
  • Сообщений: 8001
  • Тамбов
  • Вступил в ЭлЛада клуб
  • Оффлайн Оффлайн
    • mevial.ru
    • Награды
Я пока запиливаю алгоритм на ШИМе 3го таймера, а в промежутках ожидания будет просто wfi, таймер сам разбудит. Таки считаю, что опрос 3х датчиков на 1м проводе крайне накладен, ведь тогда придётся адресовать каждый датчик, запиливать уберменю, где юзер увидев список датчиков будет их распихивать по нужным позициям контроля, а как юзер узнает? Значит в уберменю должен быть монитор датчиков, чтобы юзер их мог щупать рукой и видеть реакцию, и не дай бог ему разместить датчики заранее, перед подключением к плате. А что будет если 1 датчик умрёт? Правильно, заново всё конфигурировать, ведь серийники уникальны. Плюс время опроса датчиков, оно возрастает, и не в 3 раза, а раз в 10 с передачей адреса каждого датчика. Куда проще, когда юзеру даётся 3 гнезда и инструкция, что 1е отвечает за одно, 2е за другое, а 3е за погоду на марсе.

stranger

  • Неравнодушный
  • **
  • Репутация:
    +14/-0
  • :
    2
    2
  • Сообщений: 180
  • Новосибирск
  • Оффлайн Оффлайн
    • Награды
Ответ понятен, всё вполне логично.

Страницы: 1Вверх