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

Разработка ‘библиотеки’ малого 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

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
Сверху Снизу