Еще раз всем доброго дня. Используя МК mega16 и (в будущем) MAX44007 (датчик освещения) планирую заставить их обмениваться информацией. Знаю, что есть статья про цифровой люксометр, где все описано, прошу же помочь в "стартовом толчке". Итак, пока мне нужно заставить обменяться информацией два MK mega16 в простом варианте: ведущий просит у ведомого байт, ведомый передает байт, ведущий зажигает светодиоды на одном из своих портов.
Используя библиотеку Procyon AVRLIB написал две следующих простых программки (дополнительно использую команды в виртуальный терминал для отладки в Proteus)
Протеус в своих терминалах грустно сообщает, что ведомый передал "нечто" (совпадения бит мне обнаружить не удалось), хотя команды старт и стоп передались нормально. Ведущий же ничего не получил. (длина 0) Судя по всему, я просто где-то что-то не понимаю, потому что, к примеру, у мастера процедура i2cMasterReceive(TARGET_ADDR, strlen(buf), buf); не имеет возвращаемого значения, а записывает результат (как я понимаю) в buf. Собственно, пока прошу помочь исправить программу так, чтобы она выполняла сей несложный алгоритм Спасибо
если не ошибаюсь, то младший разряд адреса используется для широковещательных сообщений 0х07 = 0b00000111 возможно дело в адресе? для верности обратитесь в даташит
+++ и еще i2cMasterReceive(TARGET_ADDR, strlen( buffer),&RecBuf[0]) ;
Дело врядли в адресе. Я эту программу взял из статьи-примера, но там мастер передает, ведомый принимает. Это работает (и у меня в протеусе). Но мне же нужно будет определенный адрес читать ибо люксометр точно будет ведомым. Попытался переделать, но мимо.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Попробовал. Без перемен. slave sent 32(!!??), master received 0 Если дело и в этом, то не только в этом. привожу пример кода мастера с исправлением, возможно я не так понял строчку кода.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Код: SPI debugger а это здесь зачем?? вроде как i2c
Пардон, о чем думал, то и написал. I2C конечно же. А вот с адресом... я все равно не понял что не так. 0x07 - адрес ведомого, которого я и читаю. Ведомый, будучи МК, сам его себе ставит. Широковещательный адрес мне здесь вроде не нужен, ибо он используется для того, чтобы все ведомые приняли сообщение от ведущего. Попробовал поставить адресом ведомого 0x06 и обращаться к нему же - вообще ничего не меняется Или дело в другом?
Нормально все с адресом. Всего кода же не видно, только часть. Без библиотеки.. А чё она там делает не понятно.. Может отладку вести например так, было прерывание по TWI вывести сообщение или лапкой дернуть. приняли свой адрес другой лапкой .. Да и на дебугере протеуса видно аск был или нет. Сейчас хотя бы наладить аппаратную часть.
Судя по дебаггеру, был ACK. Хотя хрен его разберет, может и ошибаюсь. Вот картинка
Жалко, что неясно, кто вел передачу в тот или иной момент. Но, как я понимаю, был старт, потом мастер послал адрес, а ведомый ответил ACK, затем ведомый передал "что-то" и отправил NAK, сообщая что передачу закончил.
Ведомый кстати передавал байт вида 0b11111000 И как я уже говорил, прямая передача получается "на ура", даже текст передается. А вот обратная... Поэтому дело не в аппаратной части, а в программной, по крайней мере пока я не начал это все паять...
Та же песня, даже в дебагере сообщение не поменялось. Заставил ведомого подать +5 на PB0 при срабатывании SlaveSendService - срабатывает. Что-то мне подсказывает, что у меня или обработчик неправильно задан, или мастер не оттуда берет этот самый бит. Просто мне подобная программная структура (когда нечто передается параметром в функцию и оно же выступает результатом) кажется какой-то несуразной. В C# так вообще нельзя (передаваемый параметр строго только для чтения), но по опыту, C/C++ иногда такие вещи допускают...
Нет проблем. Только вопрос, сколько Вы его собирать воедино будете: 2 проекта AVR studio 5.1, мастер и ведомый. В папке deps - библиотечки и прочее для i2c (procyon) И файл протеуса. Все с последними правками.
Вложения:
Комментарий к файлу: Проект i2c_oneByte.7z [215.42 KiB]
Скачиваний: 934
Собственно, только и делаю, что ковыряюсь в библиотеке. Только толковой документации нет.
Изменение битрейта, как я и предполагал, ничего не дало. В I2C debugger сообщение меняется если поменять число передаваемых бит. Но по-прежнему никакого соответствия я не наблюдаю...
Ух, работает хреновина) Самое страшное, это же была только имитация реальности) Теперь предо мной встает датчик. А у датчика измерения хранятся в двух байтах, в двух регистрах. А адрес у датчика один) В общем, спасибо за помощь. Тему не закрываю, то ли еще будет)
И еще как небольшие рекомендации для мастера уметь дрыгать ножкой клок программно. Спасает при коллизиях на шине. Можно засунуть в процесс инициализации шины. И для слейв устройств проходить переинициализацию шины если в течении какого времени мастер не обращается к ниму..
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения