Умный Дом по Ethernet

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 23 сен 2013, 13:53

Вообще сразу?
да нет не Ваших, последняя прошивка андрея

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 23 сен 2013, 23:08

С моей точки зрения использовать глобальный массив temp в прерывании это не есть хорошо. Используется он там при проверке температуры чипа, как буфер для организации сообщения серверу. Но это же в обработчике прерывания! Сам массив temp используется как буфер в совершенно разных местах программы. Свершится прерывание и данные, которые готовились в одном из мест программы, будут затерты данными, которые готовятся в обработчике прерывания. Потом произойдет вовзрат к прерванному месту и что там случится - как бог на душу положит. Последствия зависят от критичности прерванного кода.

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 23 сен 2013, 23:29

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

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 24 сен 2013, 09:32

ясно
а на вопросы мои не могли бы ответить?

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 24 сен 2013, 10:32

DOCSIMUS, в описанной вами ситуации дублирование произойдет. И оно не может не произойти, так как NetAction выполняется всегда. И вам и серверу об этом известно, поэтому совершенно непонятно, зачем закладывать переключение на сервере. Если вы хотите надежности, то сервер, зная про выполнение сетевого сценария, должен получить информацию о сработавшем входе, проверить - изменилось ли состояние выхода на втором устройстве и только в случае, если оно не изменилось - дать команду на переключение. Но при исправной сети трудно себе представить ситуацию, когда выход не переключится.
Toggle - вообще штука, которая плохо вяжется с понятием "надежность". Надежность - это когда мы точно знаем что мы делаем - включаем или выключаем.
Во всех релизах моих устройств тактирование реализовано от ENC28J60.

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 24 сен 2013, 19:26

Спасибо за ответ.
Andrey_B писал(а):...поэтому совершенно непонятно, зачем закладывать переключение на сервере.
как реализовать вкл/выкл любого устройства одной кнопкой (условие прежнее - вход на одной меге, выход на второй)? Пусть устройством будет банальная лампочка.
Andrey_B писал(а):Если вы хотите надежности, то сервер, зная про выполнение сетевого сценария, должен получить информацию о сработавшем входе, проверить - изменилось ли состояние выхода на втором устройстве и только в случае, если оно не изменилось - дать команду на переключение.
т.е. нужны две кнопки на вкл и на выкл?
Andrey_B писал(а):Toggle - вообще штука, которая плохо вяжется с понятием "надежность". Надежность - это когда мы точно знаем что мы делаем - включаем или выключаем.
Почему плохо вяжется? Я точно знаю когда я включил или выключил лампочку, используя всего одну кнопку. Нажал один раз - лампочка погасла - значит выключил, нажал второй раз - лампочка зажглась - значит включил. Очень надежно, надежнее не бывает. Зачем при этом серверу что то проверять? И главное что? Его задача всего навсего инвертировать выход. Если сервер не работает - хочу чтобы свет был не смотря ни на что. Ну при условии, что хотя бы мега работает. Но вроде бы при работающем сервере прописывать это в NetAction нельзя. Ну так - значит так. Я всего навсего уточнил. Зачем? Не знаю. Да, согласен, ситуацию представить когда это нужно трудно, но можно. Мне было не совсем понятно, теперь стало понятно. Просто немного пофантазировал. Никоим образом не критиковал надежность вашего устройства. Еще раз спасибо за разъяснение.

Dron
Сообщения: 207
Зарегистрирован: 08 мар 2013, 13:00

Re: Умный Дом по Ethernet

Сообщение Dron » 24 сен 2013, 19:36

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

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 24 сен 2013, 20:43

Это не проблема. Это был просто вопрос - правильно ли я понял? Ну оказалось, что правильно. И все.
Мега1 не переключает Мегу2 при работающем сервере. Мега1 отсылает серверу сообщение, что сработал вход. Сервер переключает Мегу2 - именно переключает - для этого нет необходимости проверять состояние Меги2 и даже если проверить, то это ничего не дает, если задача _переключить_. Сервер переключит. Затем Мега1 отработает NetAction и снова _переключит_ Мегу2, возвратив ее в исходное состояние. Вот я и сделал вывод и его подтвердили - так использовать эту возможность в данной реализации не получится. Никакой проблемы нет. Ничего делать не надо :)

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 24 сен 2013, 22:23

DOCSIMUS, я не против фантазий, а даже за.
NetAction закладывалась в качестве
1) управления выходами соседних устройств в случае отсутствия сервера.
2) аварийного включения/выключения какого-либо выхода. Например, датчик протечки подключен к одной меге, а кран к другой. Сервер недоступен. При работающей сети кран будет закрыт. Заметьте, речь идет не о переключении крана, а именно о конкретном положении.
3) "резервного" сообщения некой железке. Это может быть резервный сервер (в том числе на базе микро-ПК), журналирование и бог весть что еще. Это может быть оборудование, которое также "хочет" получать информацию об активном входе.

Механизм NetAction не предполагает, что он будет использоваться для дублирования команд сервера.
Для управления освещением (если вы особенно волнуетесь за ситуацию, когда сервер не работает) целесообразно подключать входы к тому устройству, к которому подключены и выходы. Тогда отработает механизм Action.

Когда мы имеем дело с дублированием, описанным вами, мы никогда достоверно не сможем определить - была ли вторая команда дубликатом или так было задумано разработчиком. Понимаете о чем я? Например, иногда при управлении кранами или клапанами требуется подавать команды переключения парами при минимальных задержках.

Мой уже многолетний опыт говорит, что не следует бояться "падения" сервера. Да, такие ситуации случаются. Но они редки и остаться на некоторое время без света не так уж и страшно.

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 24 сен 2013, 22:27

Еще один вопрос к автору. Если не сложно, объясните - почему у Вас проверка аналоговых портов и проверка температуры чипа, т.е. АЦП производятся внутри обработчика прерывания по таймеру?

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 24 сен 2013, 23:00

Андрей, я вас понял. Мне не страшно остаться на время без света :) Скорее уж без интернета более страшно :) И все что вы перечислили я прочитал у Вас на сайте и в этом форуме. Ну просто спросил :) У меня творческая фантазия :) Я вот вашу прошивку (спасибо Вам большое за Ваши труды) немного (или много) перекраиваю под свои запросы и представления. Иногда натыкаюсь на ошибки или непонятности в Вашем коде (а кто не ошибается?). Ну и сообщаю об этом. А может это и никакие и не ошибки, а так задумано или я неправильно понял или мои знания недостаточны в этом вопросе. Поэтому и уточняю. Для меня же не все очевидно. Иногда вношу предложения, которые могут быть совсем бесполезны, а могут быть полезны - тут уж вам решать. Иногда вношу свои ошибки - уже в свой вариант прошивки, конечно :) А не хочется ведь. Так что воспринимайте мои сообщения как конструктивный диалог, если таковым его можно вообще считать :)

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 24 сен 2013, 23:14

Я не совсем понял сути вопроса. Почему код внутри прерывания? Или почему по таймеру прерывания?
Если первое, то alexsis_76 уже высказывал свою мысль и в целом я с ней согласен. Внутри прерывания должны выставляться флаги, а код должен быть вынесен в основной цикл. Но учитывая специфику конкретного устройства, ничего это в целом, как мне кажется, не изменит.
Если второе, а как вы предлагаете опрашивать АЦП? Мне показалось это очень удобно - воспользоваться таймером, который, к слову, уже и так был использован для механизма защиты от дребезга.
Что качается ваших исправлений, то я обязательно но основе ваших сообщений внесу кое-какие изменения. Мне просто нужно время. И спасибо, что так подробно проанализировали код.
Я буду рад, если появится на постоянной основе альтернативная версия прошивки. Это было бы полезно проекту в целом. И у конечного пользователя появился бы выбор.

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 24 сен 2013, 23:36

Именно первое. Именно так я и сделал. Конечно alexsis_76 прав. С одной стороны - не самое главное (именно из-за специфики...) - чем короче код в прерывании тем лучше. Ну это правило такое, необязательное к исполнению естественно. Чем на более короткое время прерываем основной цикл, тем более "реагирующим" будет любое устройство. В данном случае для данного устройства это не особо важно, т.к. оно подавляющее время ничем не занято. Хотя конечно АЦП занимает достаточно много времени само по себе. Ну на это повторяю особо внимания обращать не стоит (каких то там 13 циклов на порт...). Но вот на что с моей точки зрения стоит обратить внимание, так это, как я ранее и писал, использование глобальных переменных с изменением их значений: temp, port_letter, port_num. Остальные там вроде бы все локальные или не так важны или изменяются в обработчике, а в основном цикле только читаются или наоборот. Но эти используются в основном цикле программы и для записи и для чтения. А в обработчике прерывания вы в них пишите новые значения. Хотя это скорее всего к никаким видимым последствиям не приводит. Или пока не приводит, я имею ввиду реализацию прошивки на сегодня. Но когда по сути два потока работают с одними и теми же переменными, изменяя их... - тут, как я и говорил, все зависит от критичности кода... И перенес я их в основной цикл (а в прерывании оставил только счетчики и выставление флагов) именно поэтому. В таком варианте будет совершенно безопасно. Или, если не переносить, можно ввести дополнительные локальные переменные для обработчика прерывания - но это дополнительный расход памяти. Или я не прав и компилятор все переменные перед вызовом обработчика прерывания заносит в стек? Тут я точно не знаю. Если так, то никаких проблем нет.

alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 25 сен 2013, 03:41

Или я не прав и компилятор все переменные перед вызовом обработчика прерывания заносит в стек?
примерно так начинается обработчик рерывания после преобразования в ассемблерный файл
как видим пихаются в стек регистры r28 r28 дабы не попортились , далее в них сохраняется счетчик команд и далее сохраняется SREG
push r28
push r29
in r28,__SP_L__
in r29,__SP_H__
in __tmp_reg__,__SREG__
перед выходом в обратном порядке
это компилятор делает сам , остальное ваши заботы
насчет работы с прерываниями , во вложении файл где ацп опрашивается по рерываниям , также есть прерывание по int для работы с енц, код ,код больше тренировочный , на нем отрабатывались всякие опыты

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 25 сен 2013, 07:35

Про регистры и флаг SREG я в курсе, но переменные это не регистры. Сохранив регистры и флаг регистров стек компилятор больше ничего не делает, кроме как их восстановления перед выходом из прерывания. С переменными, которые размещаются в SRAM, работают через регистры - проблемы это не снимает. Формируем в основном цикле в буфере temp что-нибудь, где то вдруг в середине случается прерывание и начинаем писать в temp уже в обработчике прерывания что то другое, затем возврат - продолжаем писать в temp в основном цикле... Отсылаем мусор серверу. Что произойдет? Ничего страшного. Или в случае с port_letter и port_num - перебираем их в основном цикле внутри for, случается прерывание - начинаем с ними же работать в цикле for внутри прерывания, затем возврат - продолжаем с ними работать в основном цикле. Что произойдет - опять же ничего, сбой одного шага (формирование несуществующего порта например) - это проскочит. Но так только до поры до времени...
Последний раз редактировалось DOCSIMUS 25 сен 2013, 09:27, всего редактировалось 1 раз.

alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 25 сен 2013, 08:51

ну так объявите локальный буфер а прерывании,раз уж там и так бардак,рядом например с вот этим
uint8_t j;
ну а детали можно увидеть например дебаггером , а Вас модель в протеусе работает попробуйте пройтись по коду , потом расскажите
вариант номер два , закажите у компилятора ассемблерный листинг и посмотрите там

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 25 сен 2013, 09:25

у меня бардака нет
я в прерывании не использую глобальные переменные одновременно с основным потоком

alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 25 сен 2013, 09:36

я в прерывании не использую глобальные переменные одновременно с основным потоком
каждому свое

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 25 сен 2013, 13:08

это точно :)

wanvo
Сообщения: 164
Зарегистрирован: 30 сен 2013, 09:45
Откуда: Russia, Rostov-on-Don

Re: Умный Дом по Ethernet

Сообщение wanvo » 01 окт 2013, 14:12

DOCSIMUS писал(а):Создал проект в Proteus.
Работает. Сеть работает тоже - т.е. можно общаться с виртуальной мегой из браузера или сервера.
Если кому надо - обращайтесь.
Определил IP сетевухи c помощью строки "c:\Program Files\Labcenter Electronics\Proteus 7 Professional\BIN\iflist.exe" и прописал его в модель ENC28J60.
Установил WinPcap.Запускаю на симуляцию.
Из браузера адрес http://192.168.0.14/sec/ не видит. При нажатии на кнопки сведиоды отзываются. Через некоторое время ISIS вылетает из симуляции и сам закрывается.
Пробовал как с версией протеуса 7.10SP0 так и с 8.0SP0. В версии 8.0 вылетает позже, но молча .
Пока отладкой не занимался, прицепил последний из HEXов который был на форуме. Но что-то мне подсказывет, что дело не в прошивке.

Ответить