• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Web-свалка на RTL871x

Elik

New member
Возможно, но несколько позже.
Данная Web-свалка пока не доросла до этого :) Она пока в зародыше и не умеет делать многое оптимально и без ошибок. :)
Основные причины - там винегрет из разных SDK и включенные туда примеры не состыкованы... Пробита тропинка только для работы основного кода web...
Т.е. не для раздела "Для начинающих" - если им дать возможность собрать и прошить по одной кнопке, то будет масса не нужных на данном этапе вопросов (подобных, разбираемым выше на этой странице - почему варнинги не такие, почему не собирается пример, почему в том углу пишет что-то и т.д.).
Я думал с этого и надо было начинать проект, сделать его легкопрошиваемым и с автоматическим обновлением, а далее править ошибки и вносить дополнения - приятный сюрприз для юзеров....
Так как прошить модуль, пошагово, не надо в первый пост, давайте сюда раз такое дело... интересно поюзать, может что то новое, полезное (кроме идеи выше) и я внесу в проект... Могу конечно бегать по темам и гуглу и самому найти как, через что, откуда, по какой команде и адресу, но вы ведь уже делаете, вам поделиться уже имеющимся опытом легче легкого...
 

pvvx

Активный участник сообщества
Я думал с этого и надо было начинать проект, сделать его легкопрошиваемым и с автоматическим обновлением, а далее править ошибки и вносить дополнения - приятный сюрприз для юзеров....
Так как прошить модуль, пошагово, не надо в первый пост, давайте сюда раз такое дело... интересно поюзать, может что то новое, полезное (кроме идеи выше) и я внесу в проект... Могу конечно бегать по темам и гуглу и самому найти как, через что, откуда, по какой команде и адресу, но вы ведь уже делаете, вам поделиться уже имеющимся опытом легче легкого...
Просто слишком сложно описать, если пользователю не понятно, что надо в Eclipse нажать одну из кнопок, для выбора, что пожелает прошить:
Снимок1605.gif
Придется описывать, что такое Windows, как её установить на компьютер и какие проблемы бывают... Что такое MinGW, какие разновидности у него бывают... Как экспортировать проект в Eclipse...
Так-же для GCC и сторонних утилит программаторов, включая, что данная версия поддерживает STLink->Jlink, DAP-Link и прочие типы программаторов, подходящих для RTL модулей и у них тоже есть разные опции, как и опции в make проекта для выбора типов программаторов...
В итого тема будет не о Web-cвалке, а о об указанном в абзацах выше.
 
Последнее редактирование:

Elik

New member
Просто слишком сложно описать, если пользователю не понятно, что надо в Eclipse нажать одну из кнопок, для выбора, что пожелает прошить:
Посмотреть вложение 4658
Придется описывать, что такое Windows, как её установить на компьютер и какие проблемы бывают... Что такое MinGW, какие разновидности у него бывают... Как экспортировать проект в Eclipse...
Так-же для GCC и сторонних утилит программаторов, включая, что данная версия поддерживает STLink->Jlink, DAP-Link и прочие типы программаторов, подходящих для RTL модулей и у них тоже есть разные опции, как и опции в make проекта для выбора типов программаторов...
В итого тема будет не о Web-cвалке, а о об указанном в абзацах выше.
Можно было без сарказма все это изложить )))
Подскажите как ресетнуть модуль через вебинтерфейс? Ах нашел....debug and test....
спасибо ;)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Можно было без сарказма все это изложить )))
Подскажите как ресетнуть модуль через вебинтерфейс? Ах нашел....debug and test....
спасибо ;)
deep_sleep на страничке не работает - не даны права (в HTM не указан запрос пароля для выполнения данной команды) :p
Тесты запросов к web и websocket пока производятся сторонними HTM, расположенными на компе...
 

Elik

New member
deep_sleep на страничке не работает - не даны права (в HTM не указан запрос пароля для выполнения данной команды) :p
Тесты запросов к web и websocket пока производятся сторонними HTM, расположенными на компе...
Еще такой вопрос посылаю через UART данные, но так кажись ограничение на размер? 100-120 символов свободно проходит, а воть больше - начинает тормозить?
 

pvvx

Активный участник сообщества
Еще такой вопрос посылаю через UART данные, но так кажись ограничение на размер? 100-120 символов свободно проходит, а воть больше - начинает тормозить?
В cоnsole ограничено, т.к. используются функции ROM-BIOS и её сегменты data/rodata/bss в RAM. Там выделено всего в UART_LOG_BUF UartLogBuf ... u8 UARTLogBuf[127]; //record the input command.
Как и u8 UartLogHistoryBuf[5][127];
rtl_printf и DiagPrintf (второй в ROM) тоже имеют ограничения заданные областью, распределяемую странслированной в ROM частью (и ограниченную) init_rom_libgloss_ram_map() от стандартных библиотек СИ по жестким адресам.
Если эти функции printf не устраивают, то используйте включение стандартных либ СИ (USE_GCC_LIB), а для console пользуйте полные контроллеры UART, т.к. кроме ограничения в ROM-BIOS у logUART не выставляются стандартные скорости 9600, ... и выбрана 38400 по причине наименьшей ошибки. В остальных скоростях стандартного ряда слишком большая ошибка - logUART это сильно урезанный контроллер UART и годится только для лога.
 
Последнее редактирование:

Elik

New member
В cоnsole ограничено, т.к. используются функции ROM-BIOS и её сегменты data/rodata/bss в RAM. Там выделено всего в UART_LOG_BUF UartLogBuf ... u8 UARTLogBuf[127]; //record the input command.
Как и u8 UartLogHistoryBuf[5][127];
rtl_printf и DiagPrintf (второй в ROM) тоже имеют ограничения заданные областью, распределяемую странслированной в ROM частью (и ограниченную) init_rom_libgloss_ram_map() от стандартных библиотек СИ по жестким адресам.
Если эти функции printf не устраивают, то используйте включение стандартных либ СИ (USE_GCC_LIB), а для console пользуйте полные контроллеры UART, т.к. кроме ограничения в ROM-BIOS у logUART не выставляются стандартные скорости 9600, ... (очень большая ошибка - logUART это сильно урезанный контроллер UART и годится только для лога)
Блин прошу прощения, но я писал по ESP8266... там те же ограничения? можно как то этот буфер увеличить в 3 раза?
 

pvvx

Активный участник сообщества
Блин прошу прощения, но я писал по ESP8266... там те же ограничения?
У ESP8266 вход RX в консоли вообще не задействован. Если же его активизировать и оставить обслуживать функциями ROM, то любой чих на пине RX приведет к перезагрузке...
Встроенный Printf так-же ограничен и ещё жестче по размеру, как и вообще весь стек CPU...
можно как то этот буфер увеличить в 3 раза?
Можно переназначить в другой участок памяти, переписать функции ROM в свои ... и памяти у малых RTL будет совсем ёк :)

В базовой SDK, с примерами "AT" ограничение в 127 символов частично снимается путем переливания в другой буфер... что отъедает ещё 4 килобайта :)
А в базе у SDK //LOG_SERVICE_BUFLEN: default, only 63 bytes could be used for keeping input cmd, the last byte is for string end ('\0').

По многим причинам "AT" и прочие протоколы переводят на 3 других полноценных встроенных контроллера UART в RTL-ах. Там ограничений у их дров и аппаратной части нет.
 
Последнее редактирование:

Elik

New member
У ESP8266 вход RX в консоли вообще не задействован. Если же его активизировать и оставить обслуживать функциями ROM, то любой чих на пине RX приведет к перезагрузке...
Встроенный Printf так-же ограничен и ещё жестче по размеру, как и вообще весь стек CPU...

Можно переназначить в другой участок памяти, переписать функции ROM в свои ... и памяти у малых RTL будет совсем ёк :)

В базовой SDK, с примерами "AT" ограничение в 127 символов частично снимается путем переливания в другой буфер... что отъедает ещё 4 килобайта :)
А в базе у SDK //LOG_SERVICE_BUFLEN: default, only 63 bytes could be used for keeping input cmd, the last byte is for string end ('\0').
Наверное я не так обяснил суть проблемы:
В UART ESP8266 (наверное в RTL будет также) посылаются данные, которые считываются с файла test.xml
<response>
<date0>~sys_ram0x60000000~</date0>
<date1>~sys_ram0x60000000~</date1>...
...
</response>

скриптом, и этих переменных свободно считывается определенное количество (где то 95 символов в формате web.cgi?sys_ram0x60000000=0x), далее начинаются тормоза, почему?
 

pvvx

Активный участник сообщества
Наверное я не так обяснил суть проблемы:
В UART ESP8266 (наверное в RTL будет также) посылаются данные, которые считываются с файла test.xml
<response>
<date0>~sys_ram0x60000000~</date0>
<date1>~sys_ram0x60000000~</date1>...
...
</response>

скриптом, и этих переменных свободно считывается определенное количество (где то 95 символов в формате web.cgi?sys_ram0x60000000=0x), далее начинаются тормоза, почему?
Кол-во переменных в скопе или длина описания одной переменной?
Для всей строки web.cgi? ... ограничения к нескольким килобайтам, больше чем у Windows Эксплорера на PC.

При отправке запроса http : // …. разные типы эксполреров по разному формируют пакеты TCP. Например виндовый эксплорер смотрит какая по цепи сети длина MSS до данного сервера и бьет заголовок на N-ое количество пакетов. Хром так не поступает, а просто лепит разбивку на максимум MSS, описанную в TCP стеке. В один MSS у эксплореров лезут практически только их данные, прикрученные к запросу. Т.е. при длинной строке URL выходит не один пакет а несколько…
Web-свалка жрет заголовок HTTP и запрос, переданный практически по одному байту в пакете. Можно в терминале настучать "GET /... " передаваемый посимвольно в каждом пакетике TCP...

Про это? :)

paradigm.ru/2007-12-19_url-max-length.md at master · dreikanter/paradigm.ru · GitHub

PS: Передачи данных для UART через HTTP и окружение в web-свалке никогда не будет. Web является многопользовательским, а UART нет и при таких обстоятельствах требует применения протоколов разбивки на пакеты и привязки к запросам-ответам, арбитража и согласования скоростей (uart 9600 - WiFi TCP - более 18 мегабит - где взять буфер на все случаи?), на которых не существует стандартов. Т.е. такое пишите сами под свою задачу. Из рекомендаций только одно - Для UART в Web используйте websocket с передачей бинарных данных...
 
Последнее редактирование:

Elik

New member
Кол-во переменных в скопе или длина описания одной переменной?
Для всей строки web.cgi? ... ограничения к нескольким килобайтам, больше чем у Windows Эксплорера на PC.

При отправке запроса http : // …. разные типы эксполреров по разному формируют пакеты TCP. Например виндовый эксплорер смотрит какая по цепи сети длина MSS до данного сервера и бьет заголовок на N-ое количество пакетов. Хром так не поступает, а просто лепит разбивку на максимум MSS, описанную в TCP стеке. В один MSS у эксплореров лезут практически только их данные, прикрученные к запросу. Т.е. при длинной строке URL выходит не один пакет а несколько…
Web-свалка жрет заголовок HTTP и запрос, переданный практически по одному байту в пакете. Можно в терминале настучать "GET /... " передаваемый посимвольно в каждом пакетике TCP...

Про это? :)

paradigm.ru/2007-12-19_url-max-length.md at master · dreikanter/paradigm.ru · GitHub
Кол-во переменных в скопе или длина описания одной переменной?
Для всей строки web.cgi? ... ограничения к нескольким килобайтам, больше чем у Windows Эксплорера на PC.

При отправке запроса http : // …. разные типы эксполреров по разному формируют пакеты TCP. Например виндовый эксплорер смотрит какая по цепи сети длина MSS до данного сервера и бьет заголовок на N-ое количество пакетов. Хром так не поступает, а просто лепит разбивку на максимум MSS, описанную в TCP стеке. В один MSS у эксплореров лезут практически только их данные, прикрученные к запросу. Т.е. при длинной строке URL выходит не один пакет а несколько…
Web-свалка жрет заголовок HTTP и запрос, переданный практически по одному байту в пакете. Можно в терминале настучать "GET /... " передаваемый посимвольно в каждом пакетике TCP...

Про это? :)

paradigm.ru/2007-12-19_url-max-length.md at master · dreikanter/paradigm.ru · GitHub

PS: Передачи данных для UART через HTTP и окружение в web-свалке никогда не будет. Web является многопользовательским, а UART нет и при таких обстоятельствах требует применения протоколов разбивки на пакеты и привязки к запросам-ответам, на которых не существует стандартов. Т.е. такое пишите сами под свою задачу. Из рекомендаций только одно - Для UART в Web используйте websocket с передачей бинарных данных...
У меня почти получилось то, что я задумал!
Полноценное управление всеми пинами Ардуино МЕГА, с обратной связью!

Правдо пока что могу управлять 13ю цифровыми и 10ю аналоговыми выходами, переводить их в один из 3х режимов (INPUT, OUTPUT, INPUT_PULLUP)


Для чего это мне? просто тренируюсь, далее внедрять в свой проект умного дома.

Да можно разбивать на пакеты, далее попробую так, спасибо, а пока что научился отправлять спец символы конца одного пакета, л размере которого и говорю! походу проходит всего 8символов даты, 6 символов времени, по 4 символа на каждый из 14ти цифровых выходов (1 символ режим работы, 3 симвода управление ШИМ), и 5символов на 10 аналоговых входов, + 3 символа конца пакета, что в сумме делает 123 символа! Вероятно вы были правы на счет 127и символов!
 

Elik

New member
Удалось! Ура!
вот видео:

Особая благодарность PVVX !!!
 
Последнее редактирование:

Elik

New member
Установил Эклипс опция для разработчиков С/C++,
Установил MiniGW,
Скачал ваш репозиторий,
Сделал вот это:
Проект RTL00 - MP3 + AT

1. Клонируете в какую-то папку GitHub - pvvx/RTL00MP3: RTL00(RTL8710AF) Test MP3

2. Разворачиваете RTL00_AT.zip в другую папку.

3. Запускаете Eclipse, в ней File->Import->General->Existing Projects into Workspase->Next, указываете директорию MP3, ставите галку "Copy projects into workspase", Next

4. Опять File->Import->General->Existing Projects into Workspase->Next, указываете директорию c AT, ставите галку "Copy projects into workspase", Next

5.Отмечаете проект RTL00_AT, далее в меню Project->Properties:



Не могу найти и сделать вот это:
6. В обоих проектах проверить установку:



нет такого значка у меня...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Пока с INA219 и dygraph.js выходит так (измеряет потребление самого себя с RTL8710AF):
SMPS = 1038 измерений в сек.
Кто знает, как соблюсти кратность опроса по I2C с данного датчика с его внутренним стробированием? Там вроде предел к 2*532 мкс при 12 битах. Если опрашивать чаще, то получаем 2 одинаковых замера...
 

KomX

Member
... INA219 ...
Кто знает, как соблюсти кратность опроса по I2C с данного датчика с его внутренним стробированием? Там вроде предел к 2*532 мкс при 12 битах. Если опрашивать чаще, то получаем 2 одинаковых замера...
В регистре Bus Voltage Register есть бит готовности данных CNVR. Анализируя его состояние, получайте новое значение с последующим сбросом этого бита одним из 2-х способов (см. стр. 23).
 

pvvx

Активный участник сообщества
В регистре Bus Voltage Register есть бит готовности данных CNVR. Анализируя его состояние, получайте новое значение с последующим сбросом этого бита одним из 2-х способов (см. стр. 23).
А при Hi speed она сама не тянет ready (писано SMBUS-compatible)?
 

KomX

Member
А при Hi speed она сама не тянет ready (писано SMBUS-compatible)?
Не совсем понял связь готовности данных с частотой шины и SMBUS-compatible режимом.
Там вроде предел к 2*532 мкс при 12 битах.
Предел Вы выбираете сами (установкой битов MODE в регистре конфигурации). Если Вам нужны значения тока и напряжения (MODE=3 - одноразово, MODE=7 - циклично), то "двоечка" имеет место быть, т.к. поочерёдно измеряются две шины. Если же Вам нужен только ток (MODE=1 - одноразово, MODE=5 - циклично) или только напряжение (MODE=2 - одноразово, MODE=6 - циклично), то 532-х мкс на один замер будет достаточно.
 

pvvx

Активный участник сообщества
Не совсем понял связь готовности данных с частотой шины и SMBUS-compatible режимом.
Уже посмотрел - врут, что она SMBUS-compatible :)
Нет задержки CLK:
Снимок1651.gif
Все другие микрухи с SMBUS используют притяжку CLK к GND, как READY...
Берем тот-же TI: http://www.ti.com/lit/an/slua475/slua475.pdf
Снимок1654.gif



Предел Вы выбираете сами (установкой битов MODE в регистре конфигурации). Если Вам нужны значения тока и напряжения (MODE=3 - одноразово, MODE=7 - циклично), то "двоечка" имеет место быть, т.к. поочерёдно измеряются две шины. Если же Вам нужен только ток (MODE=1 - одноразово, MODE=5 - циклично) или только напряжение (MODE=2 - одноразово, MODE=6 - циклично), то 532-х мкс на один замер будет достаточно.
Не тянет на 532 мкс -> опять обман у TI :)
Предел в циклическом опросе по таймеру со стробом 32768 Гц в режиме 12 бит вышел 936 smps (сампле пер сек).
Снимок1653.gif
Это при задании таймеру 532*2+30 us. Следующий шаг таймера (532*2 us) дает пропуски (бит 1 CNVR иногда опущен).
Снимок1655.gif
Смысла нет измерять только одну величину INA219, т.к. в RTL есть ADC на более менее 15.5 бит и к 40 кГц.
HTML:
<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="dygraph.css">
    <title>Get data INA219</title>
    <script type="text/javascript" src="dygraph.js"></script>
  </head>
  <body>
    <div style="width:1000px; height:500px;">
    <div id="div_v"    style="width:100%; height:400px;"></div>
    <p style="text-align: center;">
        <input type="button" id="butOnOff" value="Stop">
        <input type="radio" name='rm1'  id="FixEnd"/>
        <label for="FixEnd">Fixed</label>
        <input type="radio" checked name='rm1' id="FixNone"/>
        <label for="FixNone">Float</label><br>
        Window: <span id='wdsize'>?</span> sec<br>
        Sample Rate: <span id='smprate'>?</span> smps
    </p>
    <div id='labdiv' style="text-align: center;"></div>
    </div>

<script type="text/javascript">
var $ = function(id) {
    return document.getElementById(id);
}
var stg = 0;
var smprate = 1819;
var smps = smprate;
var samples = 10*smprate;
var rend = 1;
var oldblkid = 0;
var rdnextflg = false;
var cur_idx = 0;
var sttim = 0;
$("butOnOff").onclick =  function() {
    if(rend) {
        rend = 0;
        $("butOnOff").value = "Run";
    } else {
        rend = 1;
        $("butOnOff").value = "Stop";
    }
}
var datau = [];
var gu;
function wsping() {
    clearTimeout(wstt);
    ws.send('ina219');
    wstt = setTimeout(wsping, 500);
}
ws = new WebSocket('ws://rtl871x0/web.cgi');
ws.binaryType = 'arraybuffer';
ws.onopen = function(){ ws.send('user=rtl871x:supervisor'); ws.send('sys_debug=0'); wstt = setTimeout(wsping, 50);};
ws.onmessage = function (event) {
    if(event.data instanceof ArrayBuffer) {
        clearTimeout(wstt);
        var wordarray = new Int16Array(event.data);
        if(wordarray.length > 2) {
            var blksz = wordarray[0];
            if(wordarray.length == blksz*2 + 2) {
                if(!sttim) {
                    sttim = new Date().getTime();
                    setInterval(function(){wsSmpRate()}, 500);
                } else {
                    var blkid = wordarray[1] & 0xFFFF;
                    if(rdnextflg) {
                        cur_idx += (blkid - oldblkid) & 0xFFFF;
                    } else rdnextflg = true;
                    oldblkid = blkid + blksz;
                    for (var i=2; i<wordarray.length; i+=2) {
                        if(rend) {
                            if(cur_idx >= samples ) datau.shift();
                            if(wordarray[i] & 2) datau.push([cur_idx/smprate, wordarray[i]*0.0005, wordarray[i+1]*0.1]);
                            else datau.push([cur_idx/smprate]);
                        }                
                        cur_idx++;
                    }
                    if(!stg) {
                        gu = new Dygraph(
                        $("div_v"),
                        datau,
                        {
                            title: 'U & I (INA219)',
                            showRangeSelector: true,
                            showRoller: true,
                            xlabel: 'T(sec)',
                            ylabel: 'U(V)',
                            y2label: 'I(mA)',
                            colors: ['rgb(51,204,204)','rgb(255,100,100)'],
                            series : { 'I': { axis: 'y2' } },
                            axes: {
                                x: {valueFormatter: function(x){return this.getLabels()[0] + ': '+ x.toPrecision(3);}},
                                y: {valueRange: [0,]},
                                y2: {valueRange: [0,]}},
                            labels: ['T', 'U', 'I'],
                            labelsDiv: $('labdiv'),
                            legend: 'always',  // "follow"
                        });
                        setInterval(function(){renderChart()}, 50);
                        stg = 1;
                    }
            }    }
            wstt = setTimeout(wsping, 40);
}    }    }
function wsSmpRate() {
    smps = cur_idx * 1000/ (new Date().getTime() - sttim);
    $('smprate').innerHTML = smps.toFixed(1);
}
var renderChart = function() {
    var dl;
    if (gu.dateWindow_) {
        dl = gu.dateWindow_[1] - gu.dateWindow_[0];
        if ($("FixEnd").checked) {
            var ls = datau.length - 1;
            gu.dateWindow_[1] = datau[ls][0];
            gu.dateWindow_[0] = datau[ls][0] - dl;
        } else if (gu.dateWindow_[0] < datau[0][0]) {
            gu.dateWindow_[0] = datau[0][0];
            gu.dateWindow_[1] = datau[0][0] + dl;
          }
    } else dl = datau.length/smprate;
    $("wdsize").innerHTML = dl.toFixed(3);
    if(rend) gu.updateOptions({'file': datau});
}
</script>
  </body>
</html>
dygraph.css и dygraph.js с сайта http://dygraphs.com/
 
Последнее редактирование:
Сверху Снизу