Модуль обратной связи DCC (токовый) для LocoNet
-
- Сообщения: 286
- Зарегистрирован: Сб июн 06, 2015 3:26 pm
- Благодарил (а): 26 раз
- Поблагодарили: 10 раз
Re: Модуль обратной связи DCC (токовый) для LocoNet
круто, что сказать
мне думается вот тут надо поправить:
а надо
а то полное выключение сенсоров не отправится
мне думается вот тут надо поправить:
Код: Выделить всё
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
Это же недоделка Этот кусок вообще не так должен выглядеть.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
-
- Сообщения: 286
- Зарегистрирован: Сб июн 06, 2015 3:26 pm
- Благодарил (а): 26 раз
- Поблагодарили: 10 раз
Re: Модуль обратной связи DCC (токовый) для LocoNet
че то не уверен я в этих прерываниях на 100%. "дребезг контактов" + шанс получения обоих/троих прерываний одновременно - допускает возможность потери события срабатывания (или переполнения очереди/буфера). конечно, могут выручить датчики-"соседи" по каналу прерыванию.Василий писал(а):Это же недоделка Этот кусок вообще не так должен выглядеть.
кстати, в коде группы датчиков распределены по разным прерываниям. у этих прерываний есть приоритеты?
p.s. еще есть преимущество использоватния loop. поскольку цикл в моем скетче предсказуемо делает только несколько вещей: опрашивает один датчик, отправляет один датчик. т.е. потенциально можно навесить сторожевую собаку по таймеру и попытаться повысить надежность )
- Василий
- Модератор
- Сообщения: 9441
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 344 раза
- Поблагодарили: 458 раз
- Контактная информация:
Re: Модуль обратной связи DCC (токовый) для LocoNet
Я эти модули под S88 пилю, плюс под точечные датчики. Там у меня есть проблемы с успешным опознаванием события КС, поэтому на базовом модуле, который отдает данные по S88, реализовано искусственное растягивание сработки. Соответственно, дребезг в любом случае уберется. Что касается одновременной сработки, то если внимательно глянуть в код, может быть два случая, первый - когда события произошли в одной группе пинов. Тогда эти пины будут обработаны в результате последовательных чтений. А на случай сработки в разных группах, оформлены критические секции, прерывания прерывать друг-друга не будут и все прерывания будут обработаны последовательно, ничего не потеряется. Учитывая скорость обработки ISR и скорость с которой происходят изменения на пинах, вероятность потери стремится к нулю.
Приоритетов по прерываниям нет, насколько я знаю. А может и есть, но я пока до этого еще не добрался
Мне собственно такие обработки в основном цикле очень не нравятся из-за того, что можно пропустить сработки, например на ожиданиях отправки по сети и т.п. А так, нужные битики точно будут установлены. Собственно это классический подход к таким вещам.
Приоритетов по прерываниям нет, насколько я знаю. А может и есть, но я пока до этого еще не добрался
Мне собственно такие обработки в основном цикле очень не нравятся из-за того, что можно пропустить сработки, например на ожиданиях отправки по сети и т.п. А так, нужные битики точно будут установлены. Собственно это классический подход к таким вещам.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
-
- Сообщения: 286
- Зарегистрирован: Сб июн 06, 2015 3:26 pm
- Благодарил (а): 26 раз
- Поблагодарили: 10 раз
Re: Модуль обратной связи DCC (токовый) для LocoNet
ого, т.е. ардуина только читает датчики, а дальше отдельный модуль для коммуникации?Василий писал(а):поэтому на базовом модуле, который отдает данные по S88, реализовано искусственное растягивание сработки.
да, начало сработки метод loop может пропустить. с другой стороны это не важно, потому что гарантировано прочитает датчик(и отправит) в следующем цикле, максимум через 1600 мс (для примера предыдущего поста и это при самых плохих условиях - все остальные 15 датчиков тоже поменяли состояние и надо их статус тоже отправить в шину)Василий писал(а): Мне собственно такие обработки в основном цикле очень не нравятся из-за того, что можно пропустить сработки, например на ожиданиях отправки по сети и т.п. А так, нужные битики точно будут установлены. Собственно это классический подход к таким вещам.
а вот то, что прерывания способны пропустить отправку при определенных условиях:
- "дребезг" во всех группах датчиков породил множество одновременных прерываний
- в результате потерялось состояние одного датчика. дребезг прошел и датчик не порождает событий, т.к. нет изменений в любом случае: есть лок на токовом участке или нет
- по соседним датчикам никто не проехал и не опросил "пропавший" датчик "за компанию".
... и это меня немного напрягает.
не берусь вычислить вероятность, Вы правы, она стремится к нулю. но у меня на ардуине помимо опроса датчиков еще и обмен с шиной, поэтому на шине приложена/оставлена сила прерываний, мне нельзя рисковать )))
думаю, что вариант на прерываниях, возможно, предпочтительнее для контактных датчиков, порождающих импульс. в этом случае без прерываний будет сложнее и вариант их использовать будет предпочтительнее, чем для токовых датчиков, по моему мнению.
поделитесь, пожалуйста, где Вы про такое использование прерываний прочитали?
Re: Модуль обратной связи DCC (токовый) для LocoNet
Еще вопросик по схеме. Зачем к входу А6 подтянут резистор?
-
- Сообщения: 286
- Зарегистрирован: Сб июн 06, 2015 3:26 pm
- Благодарил (а): 26 раз
- Поблагодарили: 10 раз
Re: Модуль обратной связи DCC (токовый) для LocoNet
Это потому, что на A6 и A7 нет внутренней подтяжки к логической 1 (+5В)KitaPro писал(а):Еще вопросик по схеме. Зачем к входу А6 подтянут резистор?
Код: Выделить всё
pinMode( PIN, INPUT_PULLUP);
вот здесь можно почитать
- Василий
- Модератор
- Сообщения: 9441
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 344 раза
- Поблагодарили: 458 раз
- Контактная информация:
Re: Модуль обратной связи DCC (токовый) для LocoNet
Да, как-то так. Еще одна ардуина, такая же Про Мини, является базовой станцией и адаптером из моего "протокола" в S88. Честно говоря большого смысла в моей схеме наверное нет, так как у меня получается по 15 датчиков на модуль и всего 5 таких модулей из-за некоторых ограничений библиотеки используемой сейчас для беспроводных адаптеров. С другой стороны 75 датчиков, для простого макета это в общем неплохо. Учитывая что имеющаяся у меня КС имеет 3 разъема S88, то количество датчиков достаточно велико. Я в соседней ветке выложу чуть попозже и схемы, и скетчи, как только доведу до удобоваримого состоянияshalex писал(а):ого, т.е. ардуина только читает датчики, а дальше отдельный модуль для коммуникации?
Не понимаю немного.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 клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
-
- Сообщения: 286
- Зарегистрирован: Сб июн 06, 2015 3:26 pm
- Благодарил (а): 26 раз
- Поблагодарили: 10 раз
Re: Модуль обратной связи DCC (токовый) для LocoNet
Большое спасибо за ссылки!
как вариант, на ум приходит - триггеры поставить, для полной уверенности или конденсаторы, что менее надежно. правда под сброс после отправки придется найти свободный пин на ардуине, зато сбрасывать можно сразу все - очень удобно 16 датчиков в одном пакете. в локонете отправляю каждый датчик отдельно.
а если попробовать прям на базовой станции сделать опросник датчиков? может мощности атмеги вполне хватит? поезда ходят не особо быстро )
мне хотелось сказать, что дребезг может создать массу срабатываний по прерыванию, которая при неловком коде сделает оверфлоу не только датчиками, но и системным часам, например, если с приоритетом промахнутьсяВасилий писал(а): Получается что дребезг не страшен, так как в 0 бит датчика при дребезге не сбрасывается сам
как вариант, на ум приходит - триггеры поставить, для полной уверенности или конденсаторы, что менее надежно. правда под сброс после отправки придется найти свободный пин на ардуине, зато сбрасывать можно сразу все - очень удобно 16 датчиков в одном пакете. в локонете отправляю каждый датчик отдельно.
millis в обработки прерывания - это, канеш, перебор )))Василий писал(а):И кстати, именно поэтому внутри ардуиновских подпрограмм обслуживающих прерывания, некорректно работают micros() и millis() и нельзя с их помощью организовывать задержки Плюс, все таки подпрограммы обработки пишут небольшими и быстрыми. Время работы подпрограммы измеряется единицами, максимум десятками микросекунд.
а если попробовать прям на базовой станции сделать опросник датчиков? может мощности атмеги вполне хватит? поезда ходят не особо быстро )
Последний раз редактировалось shalex Пт ноя 13, 2015 11:55 pm, всего редактировалось 1 раз.
- Василий
- Модератор
- Сообщения: 9441
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 344 раза
- Поблагодарили: 458 раз
- Контактная информация:
Re: Модуль обратной связи DCC (токовый) для LocoNet
Хорошими ссылками чего же не поделитьсяshalex писал(а):Большое спасибо за ссылки!
Я честно говоря в собственно электронике так себе но мне почему-то казалось что Холлы и токовые датчики дребезжать как герконы не должны. Или это не так?shalex писал(а): мне хотелось сказать, что дребезг может создать массу срабатываний по прерыванию
Опять же, это какое-то расписание опросов должно быть на базовой станции. А так, у модуля есть чего послать, он шлет. Нет ничего, не шлет Плюс, S88 хорошо завязан на тайминг, и на базовом модуле передача данных как раз прерываются дерготней от КС.shalex писал(а): а если попробовать прям на базовой станции сделать опросник датчиков? может мощности атмеги вполне хватит? поезда ходят не особо быстро )
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!