Работа ведущего устройства с двумя ведомыми при помощи функций библиотеки AXLIB
Дата: 26 Декабря 2015. Автор: Алексей
Пример работы ПК и слейва.
Программа виртуальный Мастер для отладки протокола MHBUS.
Таки я все таки разобрался с мастером и слейвами.
Расписывать код я не буду, так как лучше один раз увидеть, чем сто раз прочитать. В двух словах. Есть мастер на ATMega8A. К мастеру подключен ЖК дисплей на две строки по 16 символов. Подключение ЖК можно подсмотреть в файле main_init.h. На UART подключен драйвер RS-485 на микросхеме MAX485. Два слейва имеют так же 485 интерфейс и у каждого по датчику температуры DS1820 на порту С на нулевом пине. Алгоритм работы прост. При старте мастера он сначала раздает сетевые адреса слевам, а затем по очереди опрашивает на предмет температуры. Полученную температуру с датчиков выводит на ЖК дисплей. Ниже я прикрепил файлы проектов для мастера и слейвов. Если захочется повторить в железе, то необходимо у слейвов при заливке менять ID, а то они все хором поменяют сетевые адреса.
Проект для мастера
Проект для слейвов
И конечно видюшка. Запись звука во время разбора кода не ахти из-за того что у меня звуковая карата отстойная. Сейчаз из китая ползет внешняя звуковуха и микрофон, так что надеюсь что следующие записи будут хорошими.
JW Player goes here
Юрий 20.01.16 14:29
Два датчика с ID 65530 slave 20 и 65531 slave 21 работают нормально, прописываю третий датчик ID 65532 slave 22, а мастер его видит как slave 21. Что я не так делаю. Спасибо.
Алексей 20.01.16 15:39
А Вы ему точно прописываете 22 адрес?
Юрий 20.01.16 18:30
Заработало когда я стал прописывать ID c 65530, 65529, 65528 и т. д.
Алексей 20.01.16 18:36
Странно. Такого не должно быть. ID уникальны как и сетевые адреса.
Юрий 20.01.16 19:01
В датчику (slave) нужно измерять раз в секунду напряжение, я естественно поставил таймер-счетчик, а у него вектор прерывания имеет приоритет чем прерывание по приему данных, и получается что не всегда может мастер достучатся до слейвов.Алексей подскажи как решить задачу? Спасибо.
Алексей 20.01.16 19:10
А зачем слейву такая точность? Проще замерять напряжение по запросу мастера. Иначе какой смысл проводить измерения. Для самого себя.
Юрий 20.01.16 19:28
В том и вопрос, что датчик нужно питать импульсами и после импульса измерять напряжение значение которого нужно отправлять мастеру. И как решить не знаю.
Алексей 20.01.16 20:33
Балансный протокол. В таких случаях слейв прикидывается мастером и шлет данные. И естественно нужно обрабатывать коллизии.
Алексей 20.01.16 20:34
Предлагаю перейти на форум, а то мы тут одной проблемой все комменты забъем.
Иван 22.04.16 10:41
Подскажи, или покажи как организовать команду записи данных в EEPROM slave устройств
Алексей 22.04.16 11:18
А память внешняя или внутреняя?
Иван 22.04.16 11:35
Внутреняя.
Нужно мне записать в каждое slave устройство два числа (два пороги), с которыми сигнал будет сравниваться.
Спасибо.
Алексей 22.04.16 11:44
Тогда можно использовать функции студии. Я сейчас на ходу, до дома доберусь напишу как их использовать.
Алексей 23.04.16 18:44
Для того чтобы записать в EEPROM данные. Справедливо только для режима Сейв. volatile BYTE eeprom_data EEMEM; // Переменная в EEPROM.BYTE data = 0xAB; // Переменная с даннымиeeprom_write_byte(&eeprom_data, data); // Запись данных в переменную в EEPROM.data = eeprom_read_byte(&eeprom_data); // Чтение из EEPROM
Иван 23.04.16 19:58
Мастер должен отправлять слейвам два числа, которые слейвы сохраняют в EEPROM. По сути организовать команду (#define MH_BUS_WRITE_ADD_PARAM 0x33 // Записать значение параметра в регистр по адресу). Спасибо
Алексей 23.04.16 21:37
Это да, но нужно понимать что протокол лишь передает пакеты от устройства к устройству, а что с ними делает получатель это уже другая песня.
Евгений 12.10.16 15:27
Алексей, а есть схемки подключения и мастера и слейва ? Разберусь и сам конечно,но может есть. А ЖК какой можно применить ? МЭЛТовский заработает на чипе HD44780 ?
Алексей 12.10.16 15:31
Вот пример работы мастер-слейв
Алексей 12.10.16 15:33
ЖК любой. А МЭЛТовский работает на КБ1013ВГ6, а не на HD44780)))
Алексей 12.10.16 15:36
Выписка из доки МЭЛТа.
Контроллер управления КБ1013ВГ6, производства ОАО «АНГСТРЕМ» (www.angstrem.ru), аналогичен HD44780 фирмы HITACHI и KS0066 фирмы SAMSUNG
Контроллер управления КБ1013ВГ6, производства ОАО «АНГСТРЕМ» (www.angstrem.ru), аналогичен HD44780 фирмы HITACHI и KS0066 фирмы SAMSUNG
Евгений 12.10.16 15:53
Ну, вернее да, аналог... согласен
Евгений 14.10.16 20:07
Алексей, а по какой схемке повесить ds18b20 ? там просто 2 схемы вкючения есть у датчика
Алексей 14.10.16 20:49
По какой нравится. Библиотека axlib работает по 3-х проводной схеме. То есть GND, VCC и DATA.
Евгений 11.01.17 20:41
Алексей, добрый вечер. Подскажи, а каким отладчиком пользуешься совместно с 6 версией студии? или без него обходишься, одним программатором? вижу на видео целую плату разработки у тебя... там наверное все в комплекте...
Алексей 11.01.17 21:35
Без отладчика. Плату разрабатывал сам для себя со всем что нужно. На плате слот для разных мк, микросхема памяти еепром, часы, сдвиговый регистр, жк дисплей 16х2, уарт, рс-485, энкодер, узел для ацп, 8 нопок и 8 светодиодов, преобразователь юсб-уарт. Датчик температуры дс18б20. ИК приемник. Вроде ничего не забыл.
Евгений 31.01.17 22:00
Добрый вечер Алексей!
Может поможешь - собрал все в железе, мастер, один слейв - не верно отображает температуру, ничего понять не могу. Отправлю фотки со схемами и девайсами тебе на почту.
Может поможешь - собрал все в железе, мастер, один слейв - не верно отображает температуру, ничего понять не могу. Отправлю фотки со схемами и девайсами тебе на почту.
Алексей 01.02.17 11:03
Давай, помогу.
Алексей 01.02.17 12:06
Судя по фото, слейв передал пакет без ошибок. Значит косяк в датчике температуры.
Попробуй запросить температуру по РОМ коду. Создай массив из 8 байт. Например
BYTE rom[8] = {0};
Далее запрос температуры выполни следующим образом
temperatura = (ds1820_read_t (ds1820_rom_code (rom))/10);
Попробуй запросить температуру по РОМ коду. Создай массив из 8 байт. Например
Далее запрос температуры выполни следующим образом
Евгений 01.02.17 19:28
Поправил, как написал, на дисплее T1 0 OK.
Не читает температуру. Правда может косяк из-за студии. Я все это дело компилирую 4 версией студии, дает там штуки 3 предупреждений по поводу переменных.
Не читает температуру. Правда может косяк из-за студии. Я все это дело компилирую 4 версией студии, дает там штуки 3 предупреждений по поводу переменных.
Алексей 01.02.17 21:07
А почему не в 6?
Евгений 01.02.17 21:17
Отладчик использую иногда, а 6 не поддерживает его. Проверить бы рабочую прошиву слейва для начала. Даже не знаю что попробовать для начала...
Алексей 01.02.17 21:23
К слейву прикрутить дисплей и посмотреть что выдает датчик.
Евгений 02.02.17 20:58
Алексей, добрый вечер. Перекомпилил я все исходники проектов мастера и слейва под 6 версией студии, то же самое, дисплей показывает T1 88 OK. При нагреве рукой, соответственно растет температура, такое ощущение что датчик отдает темп. в фаренгейтах, хотя тоже не совпадает 88 по F - это 31 по C, в комнате столько нет градусов )) Кстати при компиляции слейва ругнулось на это - слишком мало аргументов - answer = usart_str_in (temp); это функция mhbus_read , пришлось исправить на usart_str_in (temp,11);
Кстати маркировка на датчике вот какая - DALLAS 18B20 143604 +760AA
Кстати маркировка на датчике вот какая - DALLAS 18B20 143604 +760AA
Алексей 03.02.17 07:11
Можно глянуть исходники?
Евгений 03.02.17 09:32
Исходники я взял из этой статьи, ничего не менял, за исключением файла mhbus.h в библиотеке, подправил ту строчку о которой написал выше в сообщении - usart_str_in (temp,11);
Алексей 03.02.17 11:56
Доеду до дома и гляну. У меня все работало.
Евгений 03.02.17 12:48
Ок, 142 строка в файле mhbus
Евгений 03.02.17 18:22
Купил другой датчик, в другом магазине сегодня, те же самые показания. Что то в программе видимо не так. Кстати еще вывод AREF на обоих МК висит в воздухе, но это вроде не принципиально, и на слейве нет резисторов 560 ом с линии 485 на землю и на плюс, они стоят только на мастере. На обоих концах линии 120 ом терминаторы.
Алексей 03.02.17 19:04
Евгений 03.02.17 19:27
))) Понял... ) Спасибо, все посмотрю... Отпишусь с результатами.
Евгений 07.02.17 18:33
Алексей, спасибо, залил эту прошивку в слейв, все пошло ок. Только так и не понял в чем косяк. В файле библиотеки ds1820.h все то же самое что и у меня было. Сравнивал построчно. Единственное различие в этом проекте (main.c слейва) - ds1820_rom_code (rom); далее temperatura = ds1820_read_t (rom); // Получение температуры, а я делал так: temperatura = (ds1820_read_t (ds1820_rom_code (rom))/10); Может упустил что то конечно...
Алексей 07.02.17 19:14
Разбор полета.
(ds1820_read_t (ds1820_rom_code (rom))/10);
Функцияds1820_read_t () получает в качестве аргумента указатель на массив и возвращает температуру умноженную на 10.
Функцияds1820_rom_code () получает в качестве аргумента указатель на массив, а возвращаемое значение говорит о наличии или отсутствии датчика на линии.
Отсюда код будет выполняться следующим образом: Сначала функцияds1820_rom_code ()получит в качестве аргумента указатель на массив и вернет наличие датчика на линии. Далее функция ds1820_read_t () получит в качестве аргумента состояние наличия датчика на линии. По этому адресу она считает 8 байт из ОЗУ мусора и вернет температуру несуществующего датчика, то есть 0. Затем произойдет деление 0 на 10. Собственно вот как эта фраза будет работать.
(
Функция
Функция
Отсюда код будет выполняться следующим образом: Сначала функция
Евгений 10.02.17 17:48
Алексей! Добрый вечер. Поскажи еще такой момент - как решить такой вопрос - у меня на слейвах будет подключен привод замка автомобильный, 5 контактный, 2 провода питание мотора, т.е. управление через реле слейвом и 3 провода это концевик с переключающимися контактами. Даю команду с мастера, слейв исполняет команду открытия/закрытия длительностью 0,8 сек, и после этого мастер должен получить состояние концевика привода. Как такое реализовать попроще? есть конечно мысли, но я не совсем понял что можно применить из резерва библиотеки.
Алексей 11.02.17 10:50
У слейва задается дискретный регистр, например 1 байт. В этом байте выделяется 1 бит состояния концевика. Если 0, то замок открыт, если 1 то закрыт. А данный регистр мастер запрашивает у слейва после отправки команды.
АНОНИМ 11.02.17 15:19
800 мс, время запроса, Алексей, натолкни на мысль строками кода как реализовать, дальше сам додумаю
Евгений 11.02.17 15:21
Заранее спасибо, с меня пивас...
Алексей 11.02.17 17:14
Отправляешь команду на закрытие. Получив ответ от слейва что все гуд, даешь запрос на состояние концевика. Можно даже в ответе слейва на команду возвращать состояние концевика.
Евгений 11.02.17 17:17
Алексей, так я и сам понял алгоритм, интересует по коду.
Евгений 11.02.17 17:18
Я просто библиотеку не прочесал до конца, пока не понял как реализовать
Алексей 11.02.17 22:59
Отправка пакета такая же как и температуры. Только нужно передать команду другую. По сути библиотека дает возможность обмена пакетами, а что внутри и что с этими данными делать уже на совести программиста. Функции лишь осуществляют обмен. Что-то вроде драйвера. То есть не нужно забивать голову железом, подсчетом контрольных сумм, целостность пакета. Поэтому просто в качестве команды можно либо взять мои стандартные команды, либо придумать свои. Можно еще глянуть тут.
Евгений 16.02.17 11:01
Алексей, на видео была функция отображения led'ом передачи данных (индикация обмена данными со слейвами), как сделать, включать светодиод до записи на шину (mhbus_write ), и выключать его после этой строки (передачи) ? Или там по другому было ? Не могу вспомнить, а видео сейчас не посмотреть
Алексей 16.02.17 11:27
Я не помню, но по моему я там написал функцию которая включала светодиод перед запросом, а после выключала. В принципе здесь полное свобода творчества.
Алексей 16.02.17 11:28
В ближайшее время выйдет программа терминал для ПК. Она будет выступать в роли мастера и к ПК можно будет подключать до 50 слейвов.
Евгений 23.02.17 09:32
Алексей, а как вывести температуру с точностью до десятых градуса ?
Алексей 23.02.17 11:46
Настроить датчик на работу с десятыми частями градуса и так же передовать. За точность отвечает датчик, а не протокол.
Евгений 24.02.17 19:12
Я понимаю, но что подправить ? курить даташит наверное надо ? ))
Евгений 24.02.17 19:17
А так, Алексей, спасибо, все реализовал сам, были запарки, но сам и разобрался во всем:-) вот бы библиотечку под stm замутить под 485 и датчик ds18b20
Алексей 24.02.17 19:43
Вот эту идею я оставляю вам.)))
Евгений 27.03.17 19:50
Алексей, добрый вечер! Подключил 2 слейва к мастеру, вроде все работает хорошо, но стоит дернуть какой либо из слейвов с линии, возникают ошибки 02 (несовпадение контр.суммы) и в итоге мастер вообще подвисает. на одном слейве правда не висит подтяжка на линии A и B (+ и - соответственно)
Евгений 27.03.17 19:52
Причем это хаотично происходит, могу слейв раз 5-6 отключить - подключить, все принимает мастер, а потом бац и все - мастер показал допустим ошибку и после этого вообще подвис
Алексей 27.03.17 20:29
С подвисанием нужно смотреть код обработки данной ошибки, а вот резисторы нужны обязательно, так как они задают дельту на линии в 300мв. Без них на линии будет хаос.
Евгений 28.03.17 20:59
Алексей, я понял это, все добавил конечно. Проблема осталась. Дергаю один слейв с линии, т.е. отключаю, все вроде бы хорошо, восстанавливается после возврата линии, но иногда t1 и t2 путаются местами и начинается все, то поменяются снова местами, потом как будто нет ничего на линии, потом мастер подвисает. Тут что то с адресацией наверное не так происходит, видел что еще данные в eeprom адресные ложаться, не совсем понял всю суть поэтому и не могу понять из за чего такое возникает
Алексей 28.03.17 21:06
Предлагаю скачать вот эту программу и прицепить к ней слейвы.
Евгений 28.03.17 21:27
Алексей, так в том то и проблема, я цеплял оба, все ок, наверное в мастере проблема
Алексей 29.03.17 08:22
Завтра гляну, сегодня весь день занят. Скиньте проекты на почту.
Rudolph 04.08.17 14:28
при компиляции слейва ругнулось на это - слишком мало аргументов - answer = usart_str_in(temp); это функция mhbus_read, пришлось исправить на usart_str_in(temp,11);
Никак не могу понять как у вас компилиться эта строка, там ведь в функцию тоьлко один аргумент посылается а второй определяет количесво считывамых байт?
Никак не могу понять как у вас компилиться эта строка, там ведь в функцию тоьлко один аргумент посылается а второй определяет количесво считывамых байт?
Алексей 04.08.17 15:34
Да, было внесено изменение в функции uart. Я давно хочу причесать библиотеку, но просто нет времени.
Алексей 03.09.18 22:56
Обновлённая библиотека не появилась?
Алексей 04.09.18 07:48
Появилась, но под stm32) AVR отмирает.
Алексей 04.09.18 12:28
Алексей, ну может вы доведёте всё-таки библиотеку для AVR до ума, а то ведь даже ваши примеры не компилируются, в этой статье, например.
Алексей 05.09.18 18:22
Как это? Я же их компилировал и они работали. Что-то делаете не так.
У меня сейчас очень много работы и я не могу пока заняться с библиотекой. Напиши что именно не так работает. Я попробую по позже разобраться.
Алексейbird 05.09.18 20:39
качаю
компилирую в Студии 7
в результате:
too few arguments to function usart_str_in d:programsatmelstudio7.0 oolchainavr8avr8-gnu-toolchainavrincludeaxlibmhbus.h 172
mhbus скачан отсюда
компилирую в Студии 7
в результате:
too few arguments to function usart_str_in d:programsatmelstudio7.0 oolchainavr8avr8-gnu-toolchainavrincludeaxlibmhbus.h 172
mhbus скачан отсюда
Алексей 06.09.18 19:56
Да, есть косяк. Просто в функции передачи пакета, нужно уарту указать вторым аргументом 11 байт.
Алексейbird 06.09.18 20:25
Компилируется, спасибо!
Кстати, Алексей, а если вы перешли на STM, то наверное и сайт есть у вас, нуу что-то типа stmki.ru ?))))
Кстати, Алексей, а если вы перешли на STM, то наверное и сайт есть у вас, нуу что-то типа stmki.ru ?))))
Алексей 06.09.18 22:22
Не, все тут))) Одного сайта хватит. И так нет времени статьи писать.
Алексейbird 06.09.18 22:54
ну что за непруха, MHBUS терминал не запускается, вообще. Win10 x64(((((((
Алексейbird 06.09.18 22:58
оказывается
http://www.avrki.ru/forum/viewtopic.php?f=41&t=322#p3562
http://www.avrki.ru/forum/viewtopic.php?f=41&t=322#p3562
Алексей 07.09.18 08:00
Ок, гляну. Я как раз новую студию поставил. Ох уж эта десятка.