-
Постов
1 459 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Весь контент esaulenka
-
Я вот тут фигню сказал, а меня никто не поправил. Правильно - в UART первым уходит младший бит. Предлагаю анализатор настроить так же. Подсчёт CRC, правда, будет по-другому. Как соберёте данные, попробую подобрать алгоритм. Да, стало гораздо лучше. Channel3 - DE. Когда там единичка, пульт занимает линию, когда ноль - слушает. Channel5 - приемник, данные с нижней платы Channel7 - передатчик, данные с пульта. Идея с передачей данных с третьего устройства, скорее всего, потерпит неудачу - пульт отпускает DE очень редко, вероятность коллизий очень высокая. Можно попробовать пульт вовсе оторвать и "проиграть" в шину последовательность байт с 7-го канала (по возможности, выдерживая паузы).
-
Вообще-то тут полная халява - интерфейс на отдельной плате с огромными контактными площадками. Надо только разобраться, как они подключены. По картинке плохо понятно, нужен мультиметр. Ну или к MAX'у, к 1,3 и 4 ногам. Они достаточно большие и рядом есть пятачки (для ремонтников, видимо). PS Horizon Adventure 4 Plus стоит сотню килорублей. Жесть какая...
-
STM32F105 VBus
esaulenka опубликовал тема в ARM, 32bit
Здравствуйте. подскажите, как ОТКЛЮЧИТЬ реакцию на VBus, который на этих контроллерах заведён на PA9 ? Remap для него не предусмотрен, переключение альт.функция/вход/выход на никак не влияет (это и по документации так). Программно делать коннект-дисконнект можно, но как только на PA9 появляется ноль, коннект сам собой рвётся. -
Подключитесь только нормально, на блоке кнопок между контроллером и драйвером. И помех не будет, и гадать, кто что передаёт, не надо. Да, однозначно. Программно, в принципе, сделать можно, но а) нетривиально б) защит никаких нет. Вы что-то путаете. UART всегда и везде отправляет первым старший бит. Я не очень хорошо знаком с ардуино-библиотеками, но вряд-ли кто-то реализовывал переворот порядка бит "младшим вперёд".
-
Да, можно. Другой вопрос, что если два передатчика одновременно включатся, данные на шине побьются. Но это довольно штатная ситуация, сгореть ничего не должно Как на коленке решить эту проблему, не знаю - нужно писать софтинку, отслеживать "тишину". Да и вообще, как в данном конкретном случае организован доступ к шине, я не разобрался. Тайминги в снятом логе почему-то постоянно плавают... Bray terminal, хоть и достаточно удобен в плане интерфейса, с ком-портом работает через ж., т.е. побайтово. Грузит процессор и теряет символы при приёме на больших объемах, вставляет произвольные паузы при отправке. Я com port toolkit использовал, когда надо было пачку байт без пауз отправить. Ну или действительно сразу на каком-нибудь питоне ваять. Сомневаюсь, что эта конструкция уменьшит количество коллизий.
-
Ну так вы уже половину сделали. Мне кажется, уже пора скрестить пальцы и попробовать самому кидать эти пакеты в шину. Синхронизацию с "тишиной" в шине на коленке не сделаешь, высока вероятность коллизий, но для первого опыта пойдёт. Последний байт неинтересен, это контрольная сумма (алгоритм - в гугле, по слову 1-wire). Возможно, нажатая кнопка кодируется половинкой предпоследнего байта, вторая половинка значит что-то другое. Кстати, может быть полезным посмотреть обмен в этот момент.
-
Имхо, исходя из рассматривания единственного лога. На шине общаются несколько устройств: - постоянно бегает пакет 0x80 0x30 0x6F 0x00 0x45 - также постоянно бегает пакет 0x80 0x30 0x8F 0x00 0x30 - и некое третье устройство (пульт?) изредка отправляет пакеты вида 0x80 0x30 0x9F 0x40 0x00 0x15 0x86 0x80 0x30 0x9F 0x40 0x00 0x15 0x86 0x80 0x30 0x9F 0x40 0x00 0x35 0xA5 0x80 0x30 0x9F 0x40 0x00 0xF5 0x6F 0x80 0x30 0x9F 0x40 0x00 0xD5 0x4C 0x80 0x30 0x9F 0x40 0x00 0x55 0xC0 0x80 0x30 0x9F 0x40 0x00 0x25 0x38 0x80 0x30 0x9F 0x40 0x00 0xA5 0xB4 0x80 0x30 0x9F 0x40 0x00 0x65 0x7E Ждём выяснений, соответствует ли это нажатию одной кнопки, или это "нажал всё что было".
-
@MiD, у вас есть возможность подпаяться к драйверу и переснять логи? Анализатор уарта у салеае туповат (настоящий уарт такие помехи игнорирует). Рассматривать лог с кучей "левых" 0xFF не очень удобно.
-
В saleae они не вставляются. Для "чистого" сигнала надо просто подпаяться к RO/DI (а заодно и DE) драйвера 485.
-
Вы не могли бы привести какую-то ссылку на первоисточник? Хотя бы схему подключения блоков. Ну или крупную фотку какого-нибудь ЭБУ, утыканного оптопарами. Мне кажется, докУмент врёт, и в реальной железке защит больше. Но для понимания, как оно себя ведёт, пока помех нет, сойдёт.
-
ЭБУ - электронный блок управления. Калька с ECU - electronic control unit.
-
Не подскажите закрома, где всё это можно найти? Я даже доку на банальный GMLan найти не смог (правда, не очень пытался - представление о параметрах можно получить из даташитов на трансиверы). Да. Но для исключения земляных петель питание и земля датчика подключаются через ЭБУ.
-
Любой штатный блок авто покажите.
-
Создайте тему, например, здесь: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=forums&id=194 И прилепите туда несколько capture анализатора. Что-нибудь типа "включил", "три раза нажал кнопку быстрее" и т.д.
-
Написать библиотеку для Python 3.7
esaulenka ответил alexan300 тема в Предлагаю работу
class EcgReader: def __init__(self, settings_name: str, data_name: str): with open(settings_name, 'rb') as f: d = f.read() params = d[50:53] self.channels = params[0] self.accel_present = (params[1] != 0) self.block_size = params[2] self.data_file = open(data_name, 'rb') self.idx = 0 def read(self): res = [] for _ in range(self.channels): d = self.data_file.read(3) if len(d) != 3: return None # eof # данные согласно файлу "описалово" # num = (d[0] * 0x10000) + (d[1] * 0x100) + d[2] # данные согласно примеру num = (d[2] * 0x10000) + (d[1] * 0x100) + d[0] if num >= 0x800000: num -= 0x1000000 res.append(num) # skip accelerometer data self.idx += 1 if self.idx == self.block_size: if self.accel_present: self.data_file.read(4) self.idx = 0 return res # some tests if __name__ == '__main__': reader = EcgReader('000_ecg.crd', '000_ecg.bin') print('settings:', reader.channels, reader.accel_present, reader.block_size) for _ in range(10): # while True: d = reader.read() if d is None: break print(d) Деньги перечислите, пожалуйста, куда-нибудь в благотворительный фонд. -
Да, UART поверх BLE - это чисто нордиковское нестандартное изобретение. Почитайте их инфоцентр, там, насколько я помню, есть пример терминала для андроида. Под винду придётся самому что-то писать...
-
ошибка при компиляции С++
esaulenka ответил Метценгерштейн тема в Программирование
@one_eight_seven, а вы для контроллеров на каком языке пишете? Я по большей части - на плюсах, и как-то так получается, что без синглтонов никуда. Можно использовать подход "как у больших" с динамическим созданием всего-всего и динамическими же связями, но для мелкоконтроллеров это перебор, на мой взгляд. -
ошибка при компиляции С++
esaulenka ответил Метценгерштейн тема в Программирование
Разговор про отладку начал я в соседней теме, когда автор сломал что-то в кишках flatbuffer'а. Что именно сломал, коллективный разум не понял (впрочем, никто из присутствующих не знаком близко с flatbuffer). Вот там без гуляний по шагам с пристальным просмотром всех переменных некомфортно. В комплекте из двух указателей - на экземпляр класса и на сам метод - можно и передать, и использовать. Тут даже где-то была тема про делегаты в с++, где мы это обсуждали. Но один указатель на "голую" функцию проще этой магии на порядок. -
Я с чем-то подобным сталкивался на STM32F105. Почему-то при использовании sleep'а консолька стала вести себя неадекватно. К сожалению, так и не дошли руки разобраться - в отладочной версии просто не использую __WFI(). FAQ от сеггера также не рекомендует использовать энергосбережение.
-
Слегка не в тему. Вы под линуксом работаете, или под виндой? Не могу сказать, что я ОЧЕНЬ пытался, но собрать openocd под винду у меня не получилось... init не вызывается?.. По идее, при первом же RTT_printf должен вызваться.
-
ошибка при компиляции С++
esaulenka ответил Метценгерштейн тема в Программирование
Ну вроде б очевидно, что вместе с чтением постов надо смотреть в хрустальный шар и гуглить по ключевым словам. Код из первого сообщения похож на официальный пример: https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino Можно предположить, что он работает. Какой магией при подключении wifi.h подтягивается соотв. кусок BSP - я не знаю. Изучение ESP в планах есть, но всё никак руки не дойдут... -
ошибка при компиляции С++
esaulenka ответил Метценгерштейн тема в Программирование
Подскажите пожалуйста, в какой книжке это описано? https://godbolt.org/z/PyKfGc -
В данном случае c_str() это из гугловского flatbuffer::String::c_str. И любая перегрузка operator= - это для синтаксиса наподобие ла_ла_ла.c_str() = "ла-ла-ла", которого нет ни в стандартной библиотеке, ни (насколько мне известно) в велосипедах "по образу и подобию". Ну а автору я б посоветовал читать книжки (уже пора) и изучить слово GDB.
-
Перегрузки "operator=" у "const char *" ? Удивительно просто.
-
Вы первоисточник читали? http://www.keil.com/dd/docs/datashts/infineon/c167cr_um.pdf раздел bootstrap loader. Или только чиптюнеров всяких? Я вот только сходу не понял: общение по uart надо начинать сразу же после отпускания ресета, или не раньше, чем сколько-то там микросекунд после отпускания. Но не проще будет найти где-нибудь программатор для параллельных ROM и паяльник?