Прямой эфир

0
Да, я действительно читаю за пределами буфера, однако это не проблема, так как использую я всё равно только те данные, которые в него входят
  • avatar
  • afterer
  • 03 декабря 2022, 19:20
0
есди речь про блок в основном коде, то да, так призодится делать, ибо я точно не щнаю, где будет лежать буфер. изначально я действительно просто выравнивал все блоки, которые могут поцти в црц, однако я считаю такой подход неверным в общем случае, так что я сделал так же, как делается в HAL у F3/F7/H7
  • avatar
  • afterer
  • 03 декабря 2022, 18:19
0
Да нет же. Он у тебя прямо в основном цикле.
Кстати, а в хвосте ты вылазишь за пределы буфера. Как, впрочем, и код из статьи.
  • avatar
  • Vga
  • 03 декабря 2022, 15:24
0
Не на каждые. Этот блок применяется при длине не кратной 4 бацт и срабатывает лишь один раз — для хвоста.
  • avatar
  • afterer
  • 03 декабря 2022, 07:24
0
На каждые 4 байта. А если буфер выровнять, то это не потребуется.
  • avatar
  • Vga
  • 03 декабря 2022, 04:43
0
Я тут считал каждую отдельную операцию (в том числе и развменование) как один такт. Возможно ассемблерных команд будет не 14, а меньше
  • avatar
  • afterer
  • 03 декабря 2022, 04:35
0
столько же, сколь и для буфера любого другого размера — 14. Однако и для ручного подсчета она может юыть нужна
  • avatar
  • afterer
  • 03 декабря 2022, 04:34
0
А сколько тактов займет
temp = (uint32_t)*(data) + ((uint32_t)*((data)+1) << 8) + ((uint32_t)*((data)+2) << 16) + ((uint32_t)*((data)+3) << 24);

для буфера, ну, скажем, в пару килобайт размером?
  • avatar
  • Vga
  • 03 декабря 2022, 04:16
0
нет. Хардварный модуль считает CRC за 4 такта. Для 3 байт будет 12 тактов. А ручками будет 24 такта, если считать, что 1 бит считается за 1 такт (на самом деле там около 3 или 4, наверно)
  • avatar
  • afterer
  • 03 декабря 2022, 03:32
0
А не эффективнее ли будет выровнять буфер, посчитав ручками цырц для первых 1-3 байт?
  • avatar
  • Vga
  • 17 ноября 2022, 11:18
0
функция
uint32_t crc32_ether(char *buf, int len, int clear)

принимает на вход байты, но работает с uint32_t. Похоже, что при включении оптимизации кода, один из флагов отключает автоматическое смещение данных, из-за чего код
uint32_t *p = (uint32_t*) buf;
crc_reg = CRC_CalcCRC(reverse_32(*p++));

или даже просто
uint32_t temp = *p;

приведёт к HardFault и UNALIGNED error.

В качестве решения предлагаю такой вариант:

    uint32_t crcEthernetCalculate(volatile uint8_t* data,volatile uint32_t len){
        hcrc.State = HAL_CRC_STATE_BUSY;
        hcrc.Instance->CR |= CRC_CR_RESET;
        volatile uint32_t temp = 0;
        volatile uint32_t crc, crc_reg;

        if(len >= 4){
            for(    ; len >= 4; len -= 4){
                temp = (uint32_t)*(data) + ((uint32_t)*((data)+1) << 8) + ((uint32_t)*((data)+2) << 16) + ((uint32_t)*((data)+3) << 24);
                data+=4;
                hcrc.Instance->DR = ReverseWord(temp);
			    
            }
            crc_reg = hcrc.Instance->DR;
            crc = ReverseWord(crc_reg);
        }else{
            hcrc.Instance->DR = 0xEBABAB;
            crc_reg = hcrc.Instance->DR;
            crc = 0xFFFFFFFF;
        }
        if(len){
            hcrc.Instance->DR = crc_reg;
            temp = (uint32_t)*(data) + ((uint32_t)*((data)+1) << 8) + ((uint32_t)*((data)+2) << 16) + ((uint32_t)*((data)+3) << 24);
            hcrc.Instance->DR =  (ReverseWord((temp & (0xFFFFFFFF >> 8*(4-len))) ^ crc) >> 8*(4-len));
            crc = (crc >> 8*len) ^ ReverseWord(hcrc.Instance->DR);
        }
        
        hcrc.State = HAL_CRC_STATE_READY;
        return ~crc;
    }
  • avatar
  • afterer
  • 16 ноября 2022, 16:35
0
Привет!
Смотрю, ты получаешь картинку в режиме Stream разрешением 160*120.
У меня аналогичная задача получить картинку на ESP32S3, но хотелось бы получить фотографию более высокого качества.
Это режим Still, когда поток приостанавливается, и ты забираешь фотографию более высокого разрешения, чем Stream. Удавалось тебе такое? Сам пока бьюсь над этим…
0
Да, хорошо. Убрал лишний курсив. Была ошибка из-за попытки управлять размером шрифта, после чего не закрылся тэг и этот стиль распространился на всю статью.
Спасибо за замечание.
  • avatar
  • Gilaks
  • 11 ноября 2022, 21:33
0
Статья отличная! Замечание по форме: постарайтесь не перебарщивать с курсивом, глаза устают (
0
Следующая моя статья будет посвящена дельта-сигма АЦП на компараторе и конденсаторе. Там будут описаны неудачные попытки сделать такой АЦП без компаратора и проведен общий сравнительный анализ этих двух схем и дельта-сигма АЦП на компараторе и конденсаторе по быстродействию, точности, разрешающей способности, сложности реализации.
Спасибо за внимание к моей статье.
  • avatar
  • Gilaks
  • 11 ноября 2022, 17:55
0
На встроенном компараторе и интегрирующей RC-цепочке можно сделать сигма-дельта АЦП. Для 12 бит АЦП делаем цикл на 4096 измерений. В цикле проверяем выход компаратора, если 1 -> ставим 0 на RC (разряд) и инкрементируем счетчик, если 0 -> то 1(заряд). По окончании цикла в счетчике получим код АЦП. Количество тактов МК должно быть одинаковым для 1 и 0 на выходе компаратора.
RC-цепочка отфильтрует битовый поток и даст среднее напряжение, которое пойдет на второй вход компаратора, а 1й вход компаратора будет входом АЦП.
0
Хорошие 2 статьи.
Но в первой измеряется терморезистор и сравнивается с эталонным. Про измерение напряжение там нет речи. Эта схема использует 3 вывода МК, один из них — это компаратор.
Вторая статья уже ближе к теме. Однако, тоже использует 3 вывода МК, один из них компаратор и там предполагается, что до 2/5 заряд конденсатора линейный, а это не так даже по теоретическим расчетам, как показано в моей статье. В этой статье ничего не было сказано про ошибки, возникающие в результате нелинейности заряда.
Мой вариант предлагает использование 2-х или одного вывода МК без компаратора при минимальном количестве внешних деталей. Можно использовать совсем древний Pic16F84. Если есть готовая плата и на МК есть 1 или 2 свободных вывода, тогда в схему можно добавить 3 детали и получить новую функцию.
Спасибо за внимание к моей статье.
  • avatar
  • Gilaks
  • 11 ноября 2022, 16:46
0
По поводу остального: у Вас очень специфичные задачи) Обещать ничего не буду, записал себе, чтоб не забыть. По возможности подумаю, что можно сделать.
0
Обратная аннотация будет, но не очень скоро. Скорей всего ближе к 3 версии, или даже после нее. Очень много других задач.

Замены корпусов пока нет. Только удалять и ставить новый. Но идея хорошая, добавим. При замене в Eagle проводники подключаются к новому корпусу автоматически? По номерам площадок?

По смещению цепи не понял, она не выделяются в Основном режиме редактора схем? Посмотрите тут, как это должно быть. Здесь гифки похоже не поддерживаются.
0
что-то не пришло уведомление на почту о новом каменте, только сейчас добрался до проги проверить ее и вот вижу уже ответ

сделайте эту фишку, иначе ваша прога это просто еще одна прога типа орла, диптрейса или китайского в браузере

сейчас попробовал и вот что неудобно
на схеме нельзя интуитивно двигать линии проводников, я так и не понял, как это сделать
в игле это легко делается
оказалось, что надо переключаться в режим цепей и тогда можно двигать

а если мне надо подвинуть линию и тут же компонент? то это опять надо переключаться и это бесит
в игле это все делается легче

что картинку подложить можно — плюс и что можно отключить схемы и разводить по плате и что лут есть тоже плюс
попробую еще лут поюзать

очень жду фишку для реверса схемы из платы

пока я не нашел в редакторе плат пункт замены корпусов
в игле это через правую кнопку делается
еще могу подкинуть идею о автозамене класса корпусов с дип на смд, где это возможно

например у нас была плата с дип, сделали реверс, получили схему и нам надо сделать такое же устройство. только на смд
можно выбрать автозамену корпусов среди маркированных деталей и если в библиотеке есть смд корпус, то поменять
ну и настройка, что например по дефолту размер компонента резистора 1206 будет

но это так, на будущее