Работа ведущего устройства с двумя ведомыми при помощи функций библиотеки AXLIB


• О проекте
• Обратная связь
• Полезные ссылки
• Полезные программы
• Друзья сайта


Последние комментарии

Аби: Подключение микроконтроллеров к шине RS-485
написано просто о...

Анатолий: Джойстик для денди на stm32
Автору 100500 рес...




           

Библиотека для AVR





AXLIB Генератор





Помощь сайту


				

Работа ведущего устройства с двумя ведомыми при помощи функций библиотеки 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

Евгений    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);

Евгений    01.02.17 19:28

Поправил, как написал, на дисплее T1 0 OK.
Не читает температуру. Правда может косяк из-за студии. Я все это дело компилирую 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

Алексей    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 скачан отсюда

Алексей    06.09.18 19:56

Да, есть косяк. Просто в функции передачи пакета, нужно уарту указать вторым аргументом 11 байт.

Алексейbird    06.09.18 20:25

Компилируется, спасибо!
Кстати, Алексей, а если вы перешли на 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

Алексей    07.09.18 08:00

Ок, гляну. Я как раз новую студию поставил. Ох уж эта десятка.




Чтобы вставить ссылку используйте форму вида[url]http://www.адрес.ru[/url][text]текст ссылки[/text]
Чтобы вставить код используйте форму вида[code]код[/code]

Имя:   





  







Рейтинг@Mail.ru Яндекс.Метрика