• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом AdHoc пошаговое руководство

pvvx

Активный участник сообщества
У нас с вами примерно такой-же диалог и о том-же. Вам кажется что оно у вас будет лучше, но так ничего и нет.
Теперь "оказывается", что RUST не лезет в MCU... Да ещё какие-то мухи и леблы не там...
 

cheblin

Member
уже второй раз интересуюсь ... нафига так сделано?? почему нельзя было делать раздельными массивами
или это всё таже идея фикс - нас ударило modbus-ом?

upload_2020-1-12_22-4-14.png

и вот именно тут, комментарии бы не помешали
 

pvvx

Активный участник сообщества
уже второй раз интересуюсь ... нафига так сделано?? почему нельзя было делать раздельными массивами
Это надо много тапать клаву. Зачем оно мне? Чтобы запутаться в именах структур и потом находу по быстрому, не добавить ничего?
Мне так захотелось. Ошибки компилятор не дает - значит можно.
или это всё таже идея фикс - нас ударило modbus-ом?
Заказчиков не только ударило modbus-ом, но так и просят "сухой контакт" с реле.
и вот именно тут, комментарии бы не помешали
Кому они нужны в таком простом описании?
 

pvvx

Активный участник сообщества
мои опции компилятора
--c99 -c --cpu Cortex-M3 -g -W -O3 --apcs=interwork -I ./Main -I ./STM32F10x_StdPeriph_Driver -I ./STM32_USB-FS-Device_Driver -I ./Core
продолжай.... Ы?
Оператор «запятая» | Программирование на C и C++
Т.е. разработчик учит проф. программера синтаксису C++ ... Что будет в итоге кода AdHoc?
 

pvvx

Активный участник сообщества
спасибо капитан.
регулярно использую.
теперь бы услышать к чему это?
К тому, что вы написали, что компилятор C++ не хочет жрать ваше выражение без скобок. А RUST хочет :)
https://esp8266.ru/forum/threads/adhoc-poshagovoe-rukovodstvo.4741/page-2#post-69113
Дык чё - "подними глазки на строчку выше и либо трусы надень, либо крестик программера сними."
 

cheblin

Member
мля... реально
перечитай моё сообщение, особенно сообщение кайла про ошибку...
там проблема с типами, причём строчкой выше компилятор справляется с NULL

причём тут RUST??

понимаешь, я на своём кодогенераторе ни один компилятор уронил... и RUST тоже и Kotlin

не стоит мне рассказывать за синтаксис языка... точнее языков...
когда начинаешь писать программы, которые пишут другие программы...иногад ТАКОЕ получаешь и в ТАКИХ тонкостях приходится разбираться. ни один погромист такого не напишет...

даю справку: мой код кодогенерации автоматически тестируется несколькими компиляторами.

кстати сишный баг так и не исправили
 

pvvx

Активный участник сообщества
купил машинку времени?
Та давно ей пользуюсь. Аж забываю, что вы в начале 2000-ых и не знаете историю RUST...
Ну а раз пошла такая пьянка у cheblin-а, выискивание неверно поставленных запятых и буковок в форумных сообщениях, то
за давностью лет обЯсняю: в Паскале STM32INA2xxPowerProfiler до сих пор использовался драйвер ComPort.pas из начала 2000-го года, успешно откатанный в 2004 году. А вот ссылка для сравнения дат его обкатки
Всем кто пострадал от SaveAll В Eeprom Tools :: Siemens x65 и x70 :: Все для телефонов Siemens (BenQ-Siemens)
Всем кто пострадал от SaveAll В Eeprom Tools :: Siemens x65 и x70 :: Все для телефонов Siemens (BenQ-Siemens)
, а исходники того ComPort.pas для сравнения с текущим ComPort.pas вы сможете найти по поиску в инет…

Да, я ошибся, не десять лет прошло, а где-то 16-ть годков!
С машиной времени очень сложно не попутать...
 

pvvx

Активный участник сообщества
про USB драйвер говорили, про колбэки...читани внимательно
Можно нажать капу на машинке и найти, блиин... тама Google ещё нет. Значит вам придется копать логи fido... :)
Сча кнопочки на машинке понажимаю...
 

pvvx

Активный участник сообщества
Не нашел – всё повырезали, поисковики выдают только последние годы, а я не сохранил.
По ходу на компе(!) нашел свой прототип ComPort.pas, датирован 26.07.1998.
Но вспомнил от куда ноги растут у первых дров к STM32 – это в 2001 году мы ковяряли STR711 и к нему была либа USB. Тоже не нашел. Всё засрано поколением Z.
Но если вам так надо тот первый USB драйвер для интеграции в AdHoc, то я могу продолжить поиск… Он где-то должен был застрять... GitHub - маловероятно.
 

pvvx

Активный участник сообщества
Тогда в народном творчестве (в ограниченных кругах до 2001 года) более интересным были GPS, т.к. существовал запрет на получение точных координат с них в Росии (закон от 1948 года по конец 2001 года, когда был отменен – помог google.).
Делали всякие сигнализации с говорилками для авто с гидом по городу (словарный запас десятки тысяч слов, несколько миллионов объектов картографии) и общения с пользователем по телефону, состояние авто и т.д…
upload_2020-1-12_19-43-2.png
Это счас народное творчество оперирует Arduino и годами не может написать элементарный AdHoc.
Вот в нем и были калбаки - подгрузка подпрограмм из карточки, т.к. озу или Flash дешевый DSP обделили... :p
 

pvvx

Активный участник сообщества
В общем пока понятно, что лучший язык RUST не позволяет создать даже элементарное подобие и требует обслуживания, вызывая у некоторых желание слепить бинарный сериализатор к нему…

Ничего не пропустил?
 

pvvx

Активный участник сообщества
STM32F401xB STM32F401xC:
The I2C bus interface supports standard mode (up to 100 kHz) and fast mode (up to 400 kHz). The I2C bus frequency can be increased up to 1 MHz.

INA226:
SCL operating frequency f(SCL) 0.001..2.94 MHz
INA219:
ƒ(SCL) SCL operating frequency 0.001...2.56 MHz

Обе требуют чтения флага состояния преобразования ADC. Это значит, что у нас 2 считывания (надо читать два регистра по мин 51 такт на CLK, т.е. от 102 такта шины i2c) и подстройка скорости опроса.
Значение в регистре шунта у INA219 глючит, там забыта синхронизация-защелка на чтение старшего и младшего байта регистра тока. Глючит при настройках скорости оцифровки вроде менее 1 ms. По тому отвергнута.
Встроенный RC генератор не сверх стабилен и частота смены значений от внутреннего ADC пляшет у обоих. Для этого надо читать бит готовности преобразования в другом регистре, но STM32Fxxx не может этого по ограничениям частоты на I2C/SMBUS, хотя сама микросхема позволяет. Поскипано. Проще подобрать скорость таймера опроса под конкретный вариант чипа в ПО верхнего уровня.
Но, впрочем, это не так мешает (не претендуем на сертификацию как средство измерения) - ну будет каждый тысячный замер дублироваться, т.к. расхождение с RC генератором у INA2xx...
 

pvvx

Активный участник сообщества
Странно.... у меня HAL, F103 и INA219 и замеры в 1мс прекрасно читаются с INA, есть свободное время для MCU
1 ms взят за стартовый вариант для слабых BLE чипов. Если не применять специфической адаптации к BLE стеку и манипуляций c MTU, то это почти предел. Если манипулировать - слабый чип раскачивает за 8 килобайт вместе с опросом INA2xx (без DMA или FIFO).
На 1 килозамере стабильность лучше чем у ESP или любых WiFi SoC. Меньше выпадений. И данная скорость оставляет возможность работать ещё нескольким аналогичным чипам в одном месте и приемом на шлюз или свисток в компе, хоть на паре открытых страниц в эксплорере с web bluetooth ...
 

pvvx

Активный участник сообщества
Throughput test Adafruit nrf52840 CPU 64MHz, Cortex M4F, BLE PHY 2 Mbits/s:
Best result is:
- 8.74 KB/s with 20 ms, MTU = 23
- 23.62 KB/s with 7.5 ms, MTU = 23
- 47.85 KB/s with 15 ms, MTU = 247
 

pvvx

Активный участник сообщества

pvvx

Активный участник сообщества
Я вам начал описывать пакеты на СИ, которые используются ныне в PowerProfiler. Краткая форма вас не устроила... полную закончу не ранее чем через десять лет.
Вот начало:
Код:
typedef  __packed struct{
    uint8_t size; // размер пакета
    uint8_t cmd;  // номер команды / тип пакета
} blk_head_t;

typedef __packed struct {
    uint8_t dev_addr; // адрес на шине i2c
    uint8_t reg_addr; // номер регистра чтения
} reg_rd_t;

typedef __packed struct {
    uint8_t dev_addr; // адрес на шине i2c
    uint8_t reg_addr; // номер регистра чтения
    uint16_t data; // значение для записи в регистр
} reg_wr_t;

typedef int16_t adc0val_t; // значение из регистра 0
typedef int16_t adc1val_t; // значение из регистра 1
typedef int16_t adc2val_t; // значение из регистра 2
typedef int16_t adc3val_t; // значение из регистра 3


/*----------- пакеты передачи данных с значениями из регистров ---------------*/   

// ADC 0 1
typedef  __packed struct _blk_adc0_1_t{
    blk_head_t head;
    adc0val_t;
} _blk_adc0_1_t;
// ADC 1 1
typedef  __packed struct _blk_adc1_1_t{
    blk_head_t head;
    adc1val_t;
} _blk_adc1_1_t;
// ADC 2 1
typedef  __packed struct _blk_adc1_1_t{
    blk_head_t head;
    adc2val_t;
} _blk_adc2_1_t;
// ADC 3 1
typedef  __packed struct _blk_adc1_1_t{
    blk_head_t head;
    adc3val_t;
} _blk_adc3_1_t;
// ADC 0 2
typedef  __packed struct _blk_adc0_2_t{
    blk_head_t head;
    adc0val_t;
    adc0val_t;
} _blk_adc0_2_t;
// ADC 1 2
typedef  __packed struct _blk_adc1_2_t{
    blk_head_t head;
    adc1val_t;
    adc1val_t;
} _blk_adc1_2_t;
// ADC 2 2
typedef  __packed struct _blk_adc1_2_t{
    blk_head_t head;
    adc2val_t;
    adc2val_t;
} _blk_adc2_2_t;
// ADC 3 2
typedef  __packed struct _blk_adc1_2_t{
    blk_head_t head;
    adc3val_t;
    adc3val_t;
} _blk_adc3_2_t;
// ADC 0 3
typedef  __packed struct _blk_adc0_3_t{
    blk_head_t head;
    adc0val_t;
    adc0val_t;
    adc0val_t;
} _blk_adc0_3_t;
// ADC 1 3
typedef  __packed struct _blk_adc1_3_t{
    blk_head_t head;
    adc1val_t;
    adc1val_t;
    adc1val_t;
} _blk_adc1_3_t;
// ADC 2 3
typedef  __packed struct _blk_adc1_3_t{
    blk_head_t head;
    adc2val_t;
    adc2val_t;
    adc2val_t;
} _blk_adc2_3_t;
// ADC 3 3
typedef  __packed struct _blk_adc1_3_t{
    blk_head_t head;
    adc3val_t;
    adc3val_t;
    adc3val_t;
} _blk_adc3_3_t;
// ADC 0 4
typedef  __packed struct _blk_adc0_4_t{
    blk_head_t head;
    adc0val_t;
    adc0val_t;
    adc0val_t;
} _blk_adc0_4_t;
// ADC 1 4
typedef  __packed struct _blk_adc1_4_t{
    blk_head_t head;
    adc1val_t;
    adc1val_t;
    adc1val_t;
} _blk_adc1_4_t;
// ADC 2 4
typedef  __packed struct _blk_adc1_4_t{
    blk_head_t head;
    adc2val_t;
    adc2val_t;
    adc2val_t;
} _blk_adc2_4_t;
// ADC 3 4
typedef  __packed struct _blk_adc1_4_t{
    blk_head_t head;
    adc3val_t;
    adc3val_t;
    adc3val_t;
} _blk_adc3_4_t;

/* ----... и так до ADC 0 31 --- */

/* Далее повторить с ADC 1 */
/* Далее повторить с ADC 2 */
/* Далее повторить с ADC 3 */

/* Далее перемежение регистров по два, их комбинации: ADC0 и ADC1, ADC0 и ADC2, ADC0 и ADC2, ADC0 и ADC3 */
/* Далее перемежение регистров по три, их комбинации: ADC0 и ADC1 и ADC2, ADC0 и ADC1 и ADC 3, ... */
/* Далее перемежение регистров по по четыре, их комбинации: ADC0 и ADC1 и ADC2 и ADC3, ADC1 и ADC2 и ADC 3 и ADC0, ... */

/* Потом всё снова при разных типах у разных регистров, вариант 1:
typedef uint16_t adc0val_t; // значение из регистра 0
typedef int16_t adc1val_t; // значение из регистра 1
typedef int16_t adc2val_t; // значение из регистра 2
typedef int16_t adc3val_t; // значение из регистра 3 */
 
Сверху Снизу