Модуль обратной связи DCC (токовый) для LocoNet

Вопросы и ответы связанные с цифровым управлением, аналоговой автоматикой и их элементами
Сообщение
Автор
shalex
Сообщения: 286
Зарегистрирован: Сб июн 06, 2015 3:26 pm
Благодарил (а): 26 раз
Поблагодарили: 10 раз

Re: Модуль обратной связи DCC (токовый) для LocoNet

#161 Непрочитанное сообщение shalex »

круто, что сказать

мне думается вот тут надо поправить:

Код: Выделить всё

void loop() {
  if(sensors!=0){
а надо

Код: Выделить всё

void loop() {
  if(sensors != oldSensors){
а то полное выключение сенсоров не отправится
Последний раз редактировалось shalex Пт ноя 13, 2015 7:53 pm, всего редактировалось 2 раза.

Аватара пользователя
Василий
Модератор
Сообщения: 9441
Зарегистрирован: Чт мар 06, 2008 9:03 am
Имя: Василий Васильчиков
Откуда: Северо-западное Болото
Благодарил (а): 344 раза
Поблагодарили: 458 раз
Контактная информация:

Re: Модуль обратной связи DCC (токовый) для LocoNet

#162 Непрочитанное сообщение Василий »

Это же недоделка :) Этот кусок вообще не так должен выглядеть.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!

shalex
Сообщения: 286
Зарегистрирован: Сб июн 06, 2015 3:26 pm
Благодарил (а): 26 раз
Поблагодарили: 10 раз

Re: Модуль обратной связи DCC (токовый) для LocoNet

#163 Непрочитанное сообщение shalex »

Василий писал(а):Это же недоделка :) Этот кусок вообще не так должен выглядеть.
че то не уверен я в этих прерываниях на 100%. "дребезг контактов" + шанс получения обоих/троих прерываний одновременно - допускает возможность потери события срабатывания (или переполнения очереди/буфера). конечно, могут выручить датчики-"соседи" по каналу прерыванию.

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

p.s. еще есть преимущество использоватния loop. поскольку цикл в моем скетче предсказуемо делает только несколько вещей: опрашивает один датчик, отправляет один датчик. т.е. потенциально можно навесить сторожевую собаку по таймеру и попытаться повысить надежность )

Аватара пользователя
Василий
Модератор
Сообщения: 9441
Зарегистрирован: Чт мар 06, 2008 9:03 am
Имя: Василий Васильчиков
Откуда: Северо-западное Болото
Благодарил (а): 344 раза
Поблагодарили: 458 раз
Контактная информация:

Re: Модуль обратной связи DCC (токовый) для LocoNet

#164 Непрочитанное сообщение Василий »

Я эти модули под S88 пилю, плюс под точечные датчики. Там у меня есть проблемы с успешным опознаванием события КС, поэтому на базовом модуле, который отдает данные по S88, реализовано искусственное растягивание сработки. Соответственно, дребезг в любом случае уберется. Что касается одновременной сработки, то если внимательно глянуть в код, может быть два случая, первый - когда события произошли в одной группе пинов. Тогда эти пины будут обработаны в результате последовательных чтений. А на случай сработки в разных группах, оформлены критические секции, прерывания прерывать друг-друга не будут и все прерывания будут обработаны последовательно, ничего не потеряется. Учитывая скорость обработки ISR и скорость с которой происходят изменения на пинах, вероятность потери стремится к нулю.

Приоритетов по прерываниям нет, насколько я знаю. А может и есть, но я пока до этого еще не добрался :)

Мне собственно такие обработки в основном цикле очень не нравятся из-за того, что можно пропустить сработки, например на ожиданиях отправки по сети и т.п. А так, нужные битики точно будут установлены. Собственно это классический подход к таким вещам.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!

shalex
Сообщения: 286
Зарегистрирован: Сб июн 06, 2015 3:26 pm
Благодарил (а): 26 раз
Поблагодарили: 10 раз

Re: Модуль обратной связи DCC (токовый) для LocoNet

#165 Непрочитанное сообщение shalex »

Василий писал(а):поэтому на базовом модуле, который отдает данные по S88, реализовано искусственное растягивание сработки.
ого, т.е. ардуина только читает датчики, а дальше отдельный модуль для коммуникации?
Василий писал(а): Мне собственно такие обработки в основном цикле очень не нравятся из-за того, что можно пропустить сработки, например на ожиданиях отправки по сети и т.п. А так, нужные битики точно будут установлены. Собственно это классический подход к таким вещам.
да, начало сработки метод loop может пропустить. с другой стороны это не важно, потому что гарантировано прочитает датчик(и отправит) в следующем цикле, максимум через 1600 мс (для примера предыдущего поста и это при самых плохих условиях - все остальные 15 датчиков тоже поменяли состояние и надо их статус тоже отправить в шину)

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

не берусь вычислить вероятность, Вы правы, она стремится к нулю. но у меня на ардуине помимо опроса датчиков еще и обмен с шиной, поэтому на шине приложена/оставлена сила прерываний, мне нельзя рисковать )))

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

поделитесь, пожалуйста, где Вы про такое использование прерываний прочитали?

KitaPro
Сообщения: 90
Зарегистрирован: Ср июл 03, 2013 1:45 pm
Откуда: Мурманск

Re: Модуль обратной связи DCC (токовый) для LocoNet

#166 Непрочитанное сообщение KitaPro »

Еще вопросик по схеме. Зачем к входу А6 подтянут резистор?

shalex
Сообщения: 286
Зарегистрирован: Сб июн 06, 2015 3:26 pm
Благодарил (а): 26 раз
Поблагодарили: 10 раз

Re: Модуль обратной связи DCC (токовый) для LocoNet

#167 Непрочитанное сообщение shalex »

KitaPro писал(а):Еще вопросик по схеме. Зачем к входу А6 подтянут резистор?
Это потому, что на A6 и A7 нет внутренней подтяжки к логической 1 (+5В)

Код: Выделить всё

pinMode( PIN, INPUT_PULLUP);
которую можно включить программно.
вот здесь можно почитать

Аватара пользователя
Василий
Модератор
Сообщения: 9441
Зарегистрирован: Чт мар 06, 2008 9:03 am
Имя: Василий Васильчиков
Откуда: Северо-западное Болото
Благодарил (а): 344 раза
Поблагодарили: 458 раз
Контактная информация:

Re: Модуль обратной связи DCC (токовый) для LocoNet

#168 Непрочитанное сообщение Василий »

shalex писал(а):ого, т.е. ардуина только читает датчики, а дальше отдельный модуль для коммуникации?
Да, как-то так. Еще одна ардуина, такая же Про Мини, является базовой станцией и адаптером из моего "протокола" в S88. Честно говоря большого смысла в моей схеме наверное нет, так как у меня получается по 15 датчиков на модуль и всего 5 таких модулей из-за некоторых ограничений библиотеки используемой сейчас для беспроводных адаптеров. С другой стороны 75 датчиков, для простого макета это в общем неплохо. Учитывая что имеющаяся у меня КС имеет 3 разъема S88, то количество датчиков достаточно велико. Я в соседней ветке выложу чуть попозже и схемы, и скетчи, как только доведу до удобоваримого состояния :)
shalex писал(а): да, начало сработки метод loop может пропустить. с другой стороны это не важно, потому что гарантировано прочитает датчик(и отправит) в следующем цикле, максимум через 1600 мс (для примера предыдущего поста и это при самых плохих условиях - все остальные 15 датчиков тоже поменяли состояние и надо их статус тоже отправить в шину)

а вот то, что прерывания способны пропустить отправку при определенных условиях:
- "дребезг" во всех группах датчиков породил множество одновременных прерываний
- в результате потерялось состояние одного датчика. дребезг прошел и датчик не порождает событий, т.к. нет изменений в любом случае: есть лок на токовом участке или нет
- по соседним датчикам никто не проехал и не опросил "пропавший" датчик "за компанию".
... и это меня немного напрягает.
Не понимаю немного.
В моей схеме, в подпрограмме прерываний читается состояние пинов из группы. Если там что-то прочиталось, то устанавливается бит в соответствующем "регистре" (sensors). Идея в том, что эти биты сбрасываются в 0, только после успешной отправки пакета на базовый модуль. Получается что дребезг не страшен, так как в 0 бит датчика при дребезге не сбрасывается сам. Это гарантирует попадание "срабатывания" на базовый модуль.

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

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

UPD: Хотя нет, пока писал, понял о чем Вы говорите :) Я подумаю над этой ситуацией, что бы токовые датчики тоже можно было использовать. Спасибо за конструктивную критику!

Что касается вообще прерываний, то насколько я помню, они возникают и без желания пользователя. Например системные часы через равные промежутки времени дергают соответствующее прерывание. И кстати, именно поэтому внутри ардуиновских подпрограмм обслуживающих прерывания, некорректно работают micros() и millis() и нельзя с их помощью организовывать задержки :) Плюс, все таки подпрограммы обработки пишут небольшими и быстрыми. Время работы подпрограммы измеряется единицами, максимум десятками микросекунд.
shalex писал(а):поделитесь, пожалуйста, где Вы про такое использование прерываний прочитали?
Достоверно не вспомню, это из разных источников, плюс собственные эксперименты.
Из того что точно читал:
http://www.geertlangereis.nl/Electronic ... ge_en.html
https://sites.google.com/site/qeewiki/b ... -atmega328
http://playground.arduino.cc/Main/PinChangeInterrupt

Плюс есть ссылка в официальной доке Ардуины, на howto по прерываниям.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!

shalex
Сообщения: 286
Зарегистрирован: Сб июн 06, 2015 3:26 pm
Благодарил (а): 26 раз
Поблагодарили: 10 раз

Re: Модуль обратной связи DCC (токовый) для LocoNet

#169 Непрочитанное сообщение shalex »

Большое спасибо за ссылки!
Василий писал(а): Получается что дребезг не страшен, так как в 0 бит датчика при дребезге не сбрасывается сам
мне хотелось сказать, что дребезг может создать массу срабатываний по прерыванию, которая при неловком коде сделает оверфлоу не только датчиками, но и системным часам, например, если с приоритетом промахнуться

как вариант, на ум приходит - триггеры поставить, для полной уверенности или конденсаторы, что менее надежно. правда под сброс после отправки придется найти свободный пин на ардуине, зато сбрасывать можно сразу все - очень удобно 16 датчиков в одном пакете. в локонете отправляю каждый датчик отдельно.
Василий писал(а):И кстати, именно поэтому внутри ардуиновских подпрограмм обслуживающих прерывания, некорректно работают micros() и millis() и нельзя с их помощью организовывать задержки :) Плюс, все таки подпрограммы обработки пишут небольшими и быстрыми. Время работы подпрограммы измеряется единицами, максимум десятками микросекунд.
millis в обработки прерывания - это, канеш, перебор )))

а если попробовать прям на базовой станции сделать опросник датчиков? может мощности атмеги вполне хватит? поезда ходят не особо быстро )
Последний раз редактировалось shalex Пт ноя 13, 2015 11:55 pm, всего редактировалось 1 раз.

Аватара пользователя
Василий
Модератор
Сообщения: 9441
Зарегистрирован: Чт мар 06, 2008 9:03 am
Имя: Василий Васильчиков
Откуда: Северо-западное Болото
Благодарил (а): 344 раза
Поблагодарили: 458 раз
Контактная информация:

Re: Модуль обратной связи DCC (токовый) для LocoNet

#170 Непрочитанное сообщение Василий »

shalex писал(а):Большое спасибо за ссылки!
Хорошими ссылками чего же не поделиться :)
shalex писал(а): мне хотелось сказать, что дребезг может создать массу срабатываний по прерыванию
Я честно говоря в собственно электронике так себе :) но мне почему-то казалось что Холлы и токовые датчики дребезжать как герконы не должны. Или это не так?
shalex писал(а): а если попробовать прям на базовой станции сделать опросник датчиков? может мощности атмеги вполне хватит? поезда ходят не особо быстро )
Опять же, это какое-то расписание опросов должно быть на базовой станции. А так, у модуля есть чего послать, он шлет. Нет ничего, не шлет :) Плюс, S88 хорошо завязан на тайминг, и на базовом модуле передача данных как раз прерываются дерготней от КС.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!

Ответить

Вернуться в «Цифровое управление, Аналоговая автоматика и их элементы»