Разработка ‘библиотеки’ малого webсервера на esp8266.

pvvx

Активный участник сообщества
Обновил - запись диска с Эксплореров работает в тестовом режиме (без парольной защиты). С программы PVFS2.exe тоже пишется.
Пока стирание по секторам :). На малой flash это всё равно, т.к. скорость записи при посекторном стирании за 75 килобайт в сек, а места для диска там всего на 2 секунды :)
PVFS2.gif 1.1Mbps.gif
Стирание Block Erase (64KB) ускоряет запись W25Q128FV до 157kbps.
Файл диска с десятком PDF на 14 642 368 байта записывается из MS Explorer в W25Q128 за 88.22 сек, считая первый пакет открытия соединения по TCP/IP до закрытия соединения.
Никакой оптимизации записи пока не делалось - стирается сегмент в 64к и пишется блоками с буфером в RAM на 2 килобайта до следующего сегмента в 64к, он стирается и так далее...
Для этой скорости требуется аналог в RS232 на 2MBaud :) На Lau в самый раз на 9600 Baud :)
 
Последнее редактирование:
у telnet.exe нет таких установок :) Или я чего-то не понимаю. Но мысль понял - взял другого клиента.
 
А можно еще глупые вопросы по UART-TCP, или оно еще не допилено ? У меня как-то странно работает просто. Не могу понять почему связь рвет.
 

pvvx

Активный участник сообщества
А можно еще глупые вопросы по UART-TCP, или оно еще не допилено ? У меня как-то странно работает просто. Не могу понять почему связь рвет.
Оно не пилено на тему RTS/СTS входа для RX данных. Надо выдумать, на какой пин повесить выходной сигнал (назовем RX-READY/CMD), отвечающий что: входной буфер UART свободен и связь установлена. На TX этого не требуется. Выходит 3 ноги. Этот 3-й выход надо напрограмить на OK (открытый коллектор) и при опускании его со стороны устройства, включенного к ESP8266 это будет означать подачу команды по RS модулю... т.е. переход в командный режим по RS-232. Протокол не разработан. Примерно такие планы.

---------
Сертификация модуля ESP-12, показала, что у них потребление модулем составило:
Continue to send => Mean: ~70mA, Peak: 300mA.
Но испытания производили наверняка на своей тормозной китай-прошивке...
Ссылки на документы сертификации и мануал к модулю тут http://esp8266.ru/forum/threads/modifikacii-modulej-na-esp8266.4/page-2#post-950
 
Последнее редактирование:

Vit

Member
переход в командный режим
Нашел, как Tx на GPIO перестраивать. Можно не жрущий ног перевод в командный режим сделать - при рестарте Tx ненадолго на вход настраивать, снаружи подтяжку на 100 кОм и джампер (или управляющий вывод какой) через 10 кОм на землю. Прочитали ноль - вход в командный режим.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Нашел, как Tx на GPIO перестраивать. Можно не жрущий ног перевод в командный режим сделать - при рестарте Tx ненадолго на вход настраивать, снаружи подтяжку на 100 кОм и джампер (или управляющий вывод какой) через 10 кОм на землю. Прочитали ноль - вход в командный режим.
При приеме символа без стоп бита будет ошибка UART и символ (фрейм fifo) не примется.
C UART пока имею проблемы - нет четкого описания работы регистров, особенно по прерываниям. Всё делается путем тыка и множественных прошивок для испытаний как и что там работает. К примеру никак не победить UART_RXFIFO_TOUT_INT - не хочет подтверждать прерывание, вызванное RXFIFO_TOUT_INT.
В прошивке AT стоит затычка - ETS_UART_INTR_DISABLE(); Т.е. по этому событию автор AT вообще запрещает все прерывания UART (им плевать на производительность, потери символов и всё остальное, да там скорость 9600 :)). Что-то не то с этим.
Приходится пока работать по UART_RXFIFO_FULL_INT...
Кто даст описание UART от данного чипа?
 
Последнее редактирование:

Vit

Member
При приеме символа без стоп бита будет ошибка UART и символ (фрейм fifo) не примется
Я о ножке Tx, а не Rx, и только на время до инициализации UART в user_init. А там по ресету на 74800 валит выхлоп бута - он ещё не закончен на момент вызова uart_init. Пришлось вставить задержку пока оно не пролетит. Сомневаюсь, что эту гадость можно вырубить. А в свой вывод влупил 3 0xff для синхронизации терминала - для 74880 пользую Br@y++, а для 115200 приходится переходить на Termite, потому как у первого кракозяблики выхлопа бута при установленных 115200 вылетают куда-то за границу окна.
Изобразил такой вот говнокод в user_init
os_delay_us(100000);
int Config_Flag;
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
PIN_PULLDWN_DIS(PERIPHS_IO_MUX_U0TXD_U);
PIN_PULLUP_EN(PERIPHS_IO_MUX_U0TXD_U);
gpio_output_set(0, 0, 0, BIT1);//input
os_delay_us(100);
#define Tx_GPIO_BitNo 1
Config_Flag = !(gpio_input_get() & (1U<<Tx_GPIO_BitNo));
gpio_output_set(BIT1, 0, BIT1, 0);//output
PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);
перед uart_init. После него удалось передать, т.е. пока не навредил. Теперь хочу прилепить затяжку-джампер на землю. Уже ищу резистор:)
UPD. Нашел резистор 1кОм:) - выданное в UART значение флага отрабатывает соответственно подключенному/отключенному резистору. Одно НО - при подключенном резисторе загорается синий - похоже он действительно стоит с TX на плюс.
 
Последнее редактирование:

clinkme

New member
К примеру никак не победить UART_RXFIFO_TOUT_INT - не хочет подтверждать прерывание, вызванное RXFIFO_TOUT_INT.
Чтобы сбросить оба эти прерывания (UART_RXFIFO_FULL_INT_ST, UART_RXFIFO_TOUT_INT_ST), перед сбросом бита Intr надо очистить rxfifo - т.е. прочитать все, что там есть.
 

pvvx

Активный участник сообщества
Чтобы сбросить оба эти прерывания (UART_RXFIFO_FULL_INT_ST, UART_RXFIFO_TOUT_INT_ST), перед сбросом бита Intr надо очистить rxfifo - т.е. прочитать все, что там есть.
Это понятно, но очень сложно сделать на 10Mbps :)
А ка-же тогда так просто сбрасывается UART_RXFIFO_FULL при наличии забитого буфера, с указанием что буфер полон после 1-го символа? Там триггер перехода от счетчика символов через установленное число? Он маской сбрасывается запросто, а RXFIFO_TOUT - не хочет и похоже влетает опять в прерывание... Срабатывает таймер WDT.

Ещё непонятка тут с компиллером - он не может работать с __attribute__((packed)) структурами или я что-то косячу? При записи в структуру из 16 битных слов затирает следующие 16 бит. Ещё не доковырял конкретно, что и как, т.к. может моя ошибка....
 
Последнее редактирование:

pvvx

Активный участник сообщества
А там по ресету на 74800 валит выхлоп бута - он ещё не закончен на момент вызова uart_init. ......
Сбросьте этот буфер и не ждите "довывода кракозяб":
Код:
    //clear rx and tx fifo
    SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
    CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
Ещё надо снять прерывание ETS_UART_INTR_DISABLE();. После старта BIOS, UART-у назначена обработка по прерываниям и работает два буфера (ввод 256 байт, вывод на 100 байт):
0x3fffde60 0x100 UART rx buf
0x3fffdf60 0x64 UART tx buf
Блок управления extern UartDevice UartDev; (описание дано в #include "driver/uart.h").
Иначе будут глюки, а если снимите всё это, то данную память 256+100 байт можно запользовать (она не входит в общее распределение, а привязана к BIOS - область:
0x3FFFC000 0x004000 R/W ETS system data RAM.).
Я уже надыбал за 38килобайт памяти, без ущемления стека и входящих в SDK либов.
30 имеем в heap (от 39к, к 9-ти кило там забито либами) + 7 кило пустых остатков от iram:
Number of segments: 3
SPI Flash Interface: QIO
SPI CLK: 80MHz
Flash size: 512K
Entry point: 0x40100004
Segment 1: offset: 0x40100000, size: 25424
Segment 2: offset: 0x3ffe8000, size: 2864
Segment 3: offset: 0x3ffe8b30, size: 8432
Found free IRAM: base:0x40106350, size:7344 bytes
В iram грузятся основные процедуры либ, критичные к скорости исполнения (она не как flash - не подгружается постоянно). Можно и там поковыряться и ещё выудить, докинув атрибутов к ненужным там процедурам ICACHE_FLASH_ATTR... И оставшийся от 32к кусок можно заюзать как область оверлеев :) или использовать под статические буфера...

Собрал новую свалку (см первое сообщение темы). Что-то исправил, новых ошибок нагородил... :) Там уже есть разбор заголовков flash и т.д...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Спасибо, попробую.
Но если оно хоть символ будет успевать отправить, то проблема "прозрачности" остаётся
Не будет.
PS: Свалку файлов тестового проекта и начальную страницу обновил.
ADC ESP8266.
Прикрутил на скрутках и кое-как к генератору - что-то показывает.
 
Последнее редактирование:

Lstt

Member
Извиняюсь за ламерский вопрос, а сколько выводов физически можно использовать одновременно для ADC на одной ESP?
 

pvvx

Активный участник сообщества
В ESP 12 1 вывод tout называется.
И при наличии на выводе 6 (ADC Pin ESP8266) напряжения более 1.1В в пару мА чип перезагружается. Причину не выявлял (с генератора сначала подал напряжение через резистор в 500 Ом и когда его выходная амплитуда уходила за окно 0..1В чип перезагружался). Возможно влияет на другие внутренние входы внутреннего АЦП или логику питания ядра. Ставьте внешний ограничитель по напряжению и току на этот пин, если хотите использовать для внешних измерений (самое простое: резистор + диоды :)).
Точно ещё не разобрал, есть или нет встроенный измеритель питания 3.3В - он может использоваться для коррекции управления выходной мощностью передатчика WiFi...
--------
В последней свалке исходников вроде всё, связанное с WEB, работает, но код кривой и не оптимизирован. Временно буду занят другим, потом надо будет дописать туда сканирование станций и другое, связанное с выделением статических буферов в памяти на время их обработки...
Ещё не знаю, стоит или нет прикручивать такое:
Начало, как это сделать уже есть тут https://github.com/ly0/esp8266-smartlink
Смысл в том, что задаем имя AP ESP8266 на подключаемом устройстве, путем ввода специфического имени SSID для соединения и модуль временно откликается на это имя. По истечении какого-то заданного времени, после последнего соединения с временным именем SSID, модуль опять переключается на ожидание нового имени. Это обеспечивает связь с устройством, не зная и не заботясь о его личных WiFi установках. Ну и подобные вещи. Работает на том, что запрашивающее устройство ищет AP со специфическим именем (на видео - это начало имени c TTT...), и если в зоне охвата есть модуль, то он отзывается на заданное имя. К данному проекту это не столь актуально, но если у вас много модулей с датчиками на больших расстояниях и вы снимаете с них показания путем объезда зон их приема (или модули установлены на сотнях авто и они заезжают в спец. парковочный зону/бокс), то метод годится. Они все могут откликаться по одному заданному имени SSID включающему некий параметр, например, уровень доступа к накопленной информации. И курьеру, собирающему инфу, ничего кроме одного специфического имени SSID знать не надо. :) Но всё это реализуется и фиксированными именами SSID...
 
Последнее редактирование:
у меня настройки скорости портов и настройки wifi не сохраняются.
А smartlink это тема. Только вот что делать в случае когда 8266 штук 10 рядом ? :)
 

pvvx

Активный участник сообщества
у меня настройки скорости портов и настройки wifi не сохраняются.
А там технологическое сохранение. Команда сохранить установленные параметры путем считывания их из аппаратуры, а не формы htm. Сначала примените настройки - сохранение из формы htm и применение их к аппаратуре - это другая функция. Писать htm за вас я не буду, а эти кнопки - просто тест функций и отношения к Web библиотеке не имеет (эдакий ключик чтобы телепузики типа brig пока не использовали данную свалку, да и уже просил - кто нарисует нормальные страницы?).
Функции, для записи/чтения малых объектов (типа EEPROM, но для объектов по ID с размером от 0 до MAX_FOBJ_SIZE (пока задан в 512 байт)):
sint16 flash_read_cfg(void *ptr, uint16 id, uint16 maxsize);
bool flash_save_cfg(void *ptr, uint16 id, uint16 size);
ещё не полны. Нет функции чистки по диапазону ID объектов (или при другом подходе - удаления объекта с заданным ID). Без неё может накопиться куча ненужных сохранений, которые будут тащиться при перезаписи flash всю жизнь модуля. Пока используется всего 4-ре ID и это не требуется - решается очисткой зоны сохранений при первой записи прошивки. Еще нет проверки, что объект не требует сохранения, т.к. сохраненный имеет те-же данные. Но это и производиться и внешне - перед записью прочитать и если равен, то не сохранять. Всё это нужно для уменьшения кол-ва итераций сохранения в flash, от образования дырки в ней и чтобы исключить потерю, при вырубании питания во время сохранения...
А smartlink это тема. Только вот что делать в случае когда 8266 штук 10 рядом ? :)
smartlink - это глупость для телепузиков, чтобы нажав кнопку дать заранее известное(!) имя модулю. Больших применений ему нет. Сотню рядом, можно разрулить только кнопкой на модуле или временем: при включении модуль проверяет, активна или нет уже это имя и переговаривается с активным... что реализуется одним фиксированным SSID на группу без всяких smartlink. По тому и спрашиваю - если найдете хоть одно нормальное применение этого smartlink - то вставим в исходники.
 
Последнее редактирование:

brig

New member
телепузики типа brig
Не нравится, когда безграмотность твою выставляют напоказ? А ты повышай свой уровень образованности, проблем меньше будет.
не использовали данную свалку
Ну, не все же роются в помойках...

Обрати внимание - кто инициатор ругани?
 
  • Like
Реакции: pvvx
Сверху Снизу