Обзор клона меги328 -LGT8F328P
- Войдите на сайт для отправки комментариев
Вс, 09/09/2018 - 20:54
Купил поизучать що це таке вот такую платку а-ля Nano от небезызвестного китайского завода WAVGAT
На самом МК маркировка как и на картинке - WAVGAT AVGA328P, а фактически там стоит МК LGT8F328P от компании LogicGreen, об этом говорит хотя бы аддон, который продавец рекомендует установить. Кстати продавец честно пишет, что это нано-совместимая плата. В принципе об этом МК уже неоднократно писали, но информация неполная, а местами даже недостоверная. Так что решил что будет лучше собрать всё в одном месте. Подобные ардуины кстати делают так-же и другие производители, так что в целом всё будут справедливо и для других вариаций, типа промини WemosXI и прочих.
И так, принципиальные отличия от меги 328:
-поддерживаются тактовые частоты до 32МГц как от внутреннего PLL-синтезатора, так и от внешнего кварца или кварцевого генератора.
-питание 1.8-5.5 вольт, причём 1.8 вольт поддерживается даже на самой высокой частоте.
-у этого МК нет фьюзов, любые параметры, аналогичные тем, что настраиваются в меге328 фьюзами можно настроить или изменить прямо из программы.
-Что-бы МК поддерживал ардуино на стандартной частоте 16Мгц регистр управления системными клоками настраивается в бутлоадере.
-Поэтому не смотря на то, что там залит стандартный оптибутовский бутлоадер -с другими ардуиновскими лоадерами он не совместим, так как адаптирован под данный МК. Если залить обычный бутлоадер от меги, то пологаю МК может и запуститься, но на какой-то дефолтовой частоте.
- На конкретно моей плате ещё стоят 2 кварца на 12МГц (для CH340 и для МК). Причём для МК он по умолчанию не используется, т.к. бутлоадер настраивает системные клоки на внутренний генератор 32МГц с делителем 2, т.е. так получаются заветные 16МГц.
Из первых разочарований -внутренний генератор не смотря на то, что довольно точный (заявлена 1% точность) - но по сути всё равно паршивый, у него жуткий джиттер. Включаю вывод тактовой на ногу PB0
И смотрю осциллом:
А вот какая картинка, если переключится на кварц:
Гораздо лучше, хотя всё равно небольшой джиттер есть, но что его производит не могу понять, видимо кварц на борту тоже не высокого качества.
Затактировал от внешнего генератора 32MHz
Совершенно другое дело, сигнал с той же ноги:
-ещё WatchDog тут умеет тактироваться как от своего, так и от системного rc-осциллятора. Т.е. должен быть гораздо точнее во втором случае.
- Таймеры. В сравнении с мегой328 добавился 16-битный таймер3. Обладает всеми возможностями 1-го, но имеет доп. регистры. Аппаратных ног у третьего таймера как и у остальных таймеров (в 32х выводном МК) тоже две- OCR3A/B , которые доступны на арду-пинах TXd и D2. Соответссно всего на плате имеется 8 ног с PWM. Таймеры 0 , 1 могут тактироваться от внутреннего PLL синтезатора 64МГц. Соответственно умеют шиммить на гораздо более высоких частотах чем мега328. Так же 0 , 1 и 3 таймеры умеют делать дид-тайм, и у них есть возможность отключать свои выходы по всяким событиям (срабатывание компаратора, внешнее прерывание, переполнение от другого таймера).
- ЦАП имеется в количестве 1 штука, 8-битный. Может брать референс от Vcc или от внутренних источников. Вывел пилу для визуальной оценки:
Сперва что-то не пошло, выдавало кривую пилу. Со второго захода вроде нормально стало.
Но есть нюанс,- у этого ЦАПа выход с каким-то большим внутренним сопротивлением, попробовал подключил киломный резюк -сигнал схлопнулся почти что в ноль. Так что без ОУ этот ЦАП не стоит использовать. Судя по этому, а так же по высокой скорости работы и по картинке в даташите -цап чисто резисторный :)
-Компаратор (2 штуки) тут гораздо более продвинутый. Есть возможность использовать DAC как один из входов. Или любое из калиброванных внутренних референсных напряжений (а их тут 3 - 1.024V, 2.048V и 4.096V) А главное, чего не было в меге -тут есть гистерезис!
-АЦП -12 битный, есть возможность дифф.включения входов и усиления входного сигнала в 8/16/32 раз. Доступны любые референсы, в том числе от ЦАПа. АЦП этот бегло протестировал, не очень впечатляет. Возможно это недостаток платы , на которой припаян МК, но 12-битного разрешения мне не удалось выжать даже при идеальном источнике сигнала и референса, 10 бит пожалуй будет, но с программным усреднением: при референсе 2,048V удалось добиться гуляние результата оцифровки измерения напряжения батарейки +/- 1mV
-Порты здесь рассчитаны в основном на 30мА нагрузки. Но есть некоторые у которых ток по умолчанию лишь 12 мА, но через регистр HDR (high-current push-pull) можно включить буффер, и максимальная нагрузка на них возрастает до 80мА. Но таких портов немного, (PE5) (PE4) (PD2) (PD1) (PD6) (PD5)
-Есть ещё интересные регистры мультиплексирования - с помощью них можно перекинуть некоторые сигналы таймеров или сериала на альтернативные ноги. Есть даже возможность переназначить ногу AREF как порт PE6 , и даже ресет в порт PC6 .
Пример задействования ног SWC,SWD,ADC6,ADC7,AREF - их можно сделать выходами порта E
Пример ногодрыга с переключением клоков на тактовую 32МГц.
Как видно полный цикл ногодрыга получится из 4х тактов МК (инверсия ноги, jamp, инверсия ноги, jamp) Поэтому на выходе меандр с частотой 8 МГц. (32/4)
-Дополнил распиновку модуля теми сигналами, что не были указаны. Так же исправил несколько ошибок на исходной картинке.
-Документация оригинальный даташит на МК на китайском, есть так же его переведённая на инглиш гуглом версия, но там убились все картинки и сбился формат строк. Наш коллега Green нашёл русскоязычный даташит LGT8F328P datasheet за что спасибо ему и большое спасибо автору перевода. Даташит сам по себе не очень хороший, в нём например не все регистры описаны, которые есть в сводной таблице. Внимание, в даташите есть мелкие ошибки! Примеры приводить не буду, что б не раздувать пост.
Так же переведён на русский даташит на более старую модель МК LGT8F328D, в нём максимальная частота 20МГц, нет третьего таймера, но зато вроде как есть два ЦАПа. Предположительно он ставился в платы MassDuino и WEMOS XI. Определить какой у вас МК пологаю можно запрограммировав 3й таймер. Его можно запустить даже без аддона, я указал для таймера прямые адреса без дефайнов)
-Аддон (пакет поддержки мк) для Arduino IDE лучше брать не тот, который со страницы продавца, а родной, от производителя контроллера. С ним меньше проблем.
-прошивка производится либо через бутлоадер , либо специальным программатором через serial wire debug (SWD) interface по двум проводам. К счастью добрые люди уже написали скетч для ардуины, которая превращается в SWD программатор.
Напоследок табличка, где сравнивается скорость выполнения в тактах некоторых ассемблерных команд в обычном AVR и в LGT8
Добавлено 25.07.2019
На этой плате неправильно разведён USART, специально срисовал схему для наглядности:
Как видно обмен данными возможен только между мк и usb-мостом. Какой-либо внешний сериальный сигнал подать нет возможности, он просто не прожмёт линию, которую каждый чип и светодиоды тянут вверх. Но выход есть, на помощь приходят регистры port multiplexing (PMX). Можно перенести Rx и Tx (оба одновременно или только какой то один ) на другие пины:
Так что подключить bluetooth/GPS не проблема. Так же отремаппить можно и выход таймера OC3A, который сидит на пине Txd, и так же страдает от резистора.
На этом всё. Просьба не нажимать кнопку "цитировать", т.к. у меня пропадёт возможность что-то добавлять в этот пост.
P-n-D.)
https://drive.google.com/open?id=1mRlRiS9b4hcG4jFiz3icp7Fy8mxjwk9J
https://drive.google.com/open?id=1ScDkBKDiA0INSZiI_TEP4YBLuOlzPS0H
Война клонов? Или китайцы выпустили один клон и тиражируют его
в разных вариантах. Давно купил MD-328D, но руки до него так и недошли.
Сейчас глянул доки, блок-схемы один в один. Только названия ядра разные и
некоторые другие отличия. У моего, например, АЦП 10/12/16 бит.
Сейчас глянул на их сайт, они новый клон запилили MD-3248P. И сделали на нём плату.
http://www.inhaos.com/product_info.php?products_id=168
Но ИМПЕРИЯ наносит ответный удар. http://www.microchip.com/promo/atmegaavr-family
Да, EEPROM у них нет. “ (simulate E2PROM) “ В флеше область выделяют.
Logik, сейчас проверил ссылка на продавца работает.. кликнул -открылась.
alex_r61, подозреваю, что Inhaos как и WAVGAT крупный покупатель у ложик грина, и для них МК маркируют по-другому. За 16 бит АЦП там выдают оверсемплинг 12ти бит.
Logik, сейчас проверил ссылка на продавца работает.. кликнул -открылась.
То известная багофича сайта. Вставте через кнопку "Вставить/редактировать ссылку". Хотя себе я уже нашел его https://ru.aliexpress.com/item/WAVGAT-Nano-Mini-USB-Nano-3-0/32868170637.html Закажу пожалуй.
А он чё, реально в коробочке приезжает? Там жеж одна коробочка этих денег стит ;) В половине случаев она за корпус прибора сойдет.
В даташите с цветными картинками
[Важно] Максимальная рабочая частота LGT8FX8D составляет 20 МГц.
Поэтому, когда в качестве основного источника синхронизации выбран внутренний
32-мегагерцовый RC, необходимо убедиться, что CLKPR настроен на правильную
конфигурацию частотного разделения (минимум 2-х частотное деление).
Получается 32МГц официально нет?
Logik, читайте внимательней ,dimax выше писал что LGT8FX8D это немного другой по возможностям чем LGT8F328P (AVGA328P) .
И в даташите написали что 20мгц предел это только для LGT8FX8D, на LGT8F328P это ограничение не распространяется.
пост №15 про бутлоадер...
Уважаемые Dimax и Logic, следуя вашим рекомендациям создам новую ветку с более подробным описанием. Вот только проведу дополнительные пробы, чтоб лишний раз не отвлекать по мелочам. Вдруг проблемы тут вовсе нет. Единственный вопросик: может раз уж у вас в руках имеются подобные девайсы может гляните у себя как ведет себя аналоговый вход?
Скеч предельно прост:
Схему подключения можно также предельно упростить:
пробрасывать перемычкой на А1 напругу с пинов 5В; 3,3В и GND. У меня выдает в мониторе соответственно 2340, 4061, 0. хотя по логике вещей должно быть 4096, 2703 и 0.
Обновил первый пост:
- добавил осцилограмму с ноги D8 при тактировании от внешнего генератора + команды переключения
- c ЦАПа снял нормальную осцилограмму другим щупом, поменял картинку.
- пример и осцилограмма ногодрыга на тактовой 32МГц -> 8МГц
-ссылки на руские даташиты
-тест на наличие таймера3
AleksandrGHJ, загрузил ваш скетч, подключил переменник 10 кОм -у меня всё линейно регулируется. Отдельно от 3.3 вольта показывает 3100 попугаев, от 5 вольт - 3968 попугаев. Тут наверное вам стоит обратить внимание на то, что это _нано_, у неё питание идёт через диод. В результате на Vcc приходит (на моей плате) 4,65в. И 3,3 у меня тоже не соответствует -реально 3,63. Если всё это пересчитать -то именно так и должно быть.
А 4095 в максимуме тут быть не обязано, т.к. функция analogRead в этом аддоне навороченная, и делает калибровку смещения АЦП (страница 251 русского даташита), так что в моём случае АЦП откалибровалось с потолком 3968. В вашем -4061. Можете проверить чтение без арудиновских причуд моим скетчем, там будет 0..4095. Сигнал подавать на вход A0:
dimax, Какова максимально возможная скорость работы АЦП, можете измерить? Какой минимальный делитель тянет АЦП, пусть с потерей разрядности..
Какая максимальная частота у SPI. Ждёмс конкретных результатов работы с LCD TFT.
Кто-то загружал бутлоадер в эту плату?
dimax, Какова максимально возможная скорость работы АЦП, можете измерить? Какой минимальный делитель тянет АЦП, пусть с потерей разрядности..
Даташит говорит, что больше 3МГц разрешение будет падать. Проверил минимум -делитель на 2 держит однако, т.е. 8 МГц тактовую. Ну и 15 тактов на преобразование. 0,125µS * 15 = 1,875 µS. Не помню уж сколько у простой меги было. Для проверки завернул сигнал-треугольник с выхода ЦАПа через ОУ на вход АЦП, картинку рисует приемлемую.
Но с дефолтовым делителем более ровно рисует.
Какая максимальная частота у SPI. Ждёмс конкретных результатов работы с LCD TFT.
Если вопрос ко мне, то у меня не было планов подключать LCD..
А как он по совместимости с Atmega328 на уровне регистров? Хотябы обратной?
sav13, я каждый регистр не сверял :) думаю обратно совместимы, хотя какие-то нюансы скорее всего есть.
Уже нефигово. А с 32Мгц тактовой делитель на 2 - держит? (16Мгц частота Ацп)? У него 15 тактов преобразование? Впрочем, если 12 бит, то должно быть так, пасибки.
Arhat109-2, на 32х МГц тоже завелось, но картинка уж совсем непривлекательна..
Ну .. непривлекательность картинки для меня - явление условное. А вот делитель 2 с 32метров .. это очень даже круто - практическая скорость оцифровки за мегагерц. :) На 8Мгц блока АЦП у Меги она ещё больше "непривлекательна", промежду прочим и ещё и не каждая мега такое может (328-я к примеру нет) .. там ваще рабочих макс. 6 разрядов и это при низкоомном выходе (как у Вас с ОУ) и правильной разводке ножек АЦП.. а в типовых платат так и ваще 5 бит. :)
P.S. на этом уже вполне можно лепить следящую систему за десятком целей.. :)
.. очень интересная машинка. Правда помнится микрочип тоже грозился выпустить обновление линеек, не знаю как там у них с этим - пошли или нет, не следил.
Создал другую ветку
http://arduino.ru/forum/apparatnye-voprosy/klon-atmega328p-lgt8f328p-ana...
Всякие полезняшки:
Аналог "секретного вольтметра" для lgt8f328p Измеряется напряжение на шине Vcc. Теория метода та-же самая, что и для меги 328. Ставится референс =AVCC, вход АЦП мультиплексором переключается на внутреннее, заведомо известное опорное напряжение (в данном случае 2,048 V). Затем через опорное вычисляется какое же было референсное. Ну тут я ещё усреднение добавил.
Следующий скетч поочерёдно выводит внутренние референсные напряжения на вывод AVREF. Можно проконтролировать их точным вольтметром, и например учесть в расчётах. Или подкрутить заводские калибровочные константы VCAL*
dimax , чутка не по теме, но как тож развитие atmega328, не посматривал ли такие контроллеры ATxmega32D4 ?https://ru.aliexpress.com/item/-/32843431511.html
по деньгам рядом с atmega328p(b)-au , зато тож всяких возможностей гораздо прибавилось. ATXMEGA32A4 еще покруче , но и подороже https://ru.aliexpress.com/item/10pcs-ATXMELA32A4-AU-ATXMEGA32A4-QFP-sold-together-new/32800983407.html . мож потом кто и поддержку в IDE придумает.
slider, не, семейством xMega вообще не интересовался. Психологически я уже перешёл на stm32, и другие МК меня не интересуют. Данный МК, которому посвящена тема исключение, заинтересовало что у любимой "тёплой, ламповой" меги328 появился братик со сверхспособностями, и его захотелось изучить :)
У xMega несколько странноватый способ прошивки, поэтому она не получила большого развития, ну и цена тоже "не айс". Хотя, когда ковырял даташит, была мысля что можно запилить обыкновенный USB-UART программатор, но так и не удалось найти камни по вменяемым ценам на тот момент.
Очень ясно. Вопрос закрыт.
А есть на памяти какой скетч тестовый арифметический ?, попробую от внешних активных кварцев погонять wavgat328 , интересно до какой частоты он стабильно может работать , 40 , 50мгц ? (Скетч , что сбои давал при разгоне)
Конечно такие опыты от лукавого , если надо быстрее - бери проц другой . но все таки хотелось бы проверить запас у него по частоте.
Наверно БПФ посчитать подойдет. И познавательно будет.
Ещё в копилку полезняшек, этот МК обладает глобальным уникальным идентификационным номером. (GUID) Можно в чём-то это использовать, например привязать программу к этому номеру, и на другом МК она уже не заработает. Скетчик , считывающий GUID сначала заприметил на китайском сайте, но ещё при первом взгляде зародились сомнения, что правильно он работать не сможет. И точно, проверил -выдаёт только часть номера, думаю знающие люди сразу поймут почему. А незнающим хорошая задачка на самостоятельный разбор причины ;) Предлагаю другой вариант чтения GUID, без всяких байтовых сдвигов.
dimax , гениально. китайцы до этого не додумались :)
хорошая плюшка.
Есть ещё в этом МК такая любопытная штука, как цифровой вычислительный ускоритель (uDSC). Позволяет производить массу различный операций с целочисленными 16-битными числами (кроме вычислений с плавующей точкой). Ускорение достигается за счёт того, что этот модуль любую операцию выполняет всего за 1 такт МК, правда тут возникают накладные расходы времени что-бы загрузить и выгрузить данные. Но загрузка и выгрузка каждого 16-разрядного слова тоже занимает 1 такт. Выгружается кстати в 32-битный регистр (за 2 такта), так же есть ещё 16-битный регистр переполнения. Так что в теории можно производить операции с числами до 40 бит. Жалко что входные регистры не 32-битные, а то можно было бы посоревноваться с 72х мегагерцовым stm32 . Из-за специфики доступа к этому модулю компилятор понятия не имеет что он существует, поэтому что бы задействовать все эти способности нужно написать свою функцию. Опять же из-за особенностей доступа к портам ускорителя напрямую языком СИ невозможно к ним обратится. Я написал простую функцию на ассемблере, они принимает 3 операнда - первые два -это числа для ариф. операции, и третий операнд - код арифметической операции (подробности смотреть в русском даташите, страница36 )
Ну и естессно захотелось сравнить реально ли оно быстрее обычных вычислений? Проверка скорости дело не такое простое как может показаться на первый взгляд, компилятор может взять, и полностью изменить код. Поэтому надо не давать ему такой возможности, но при этом сильно не мудря, что-бы посторонними операциями мк занимался минимальное время. Я решил умножать счётные регистры таймеров.
Уж не знаю, оптимальный ли это код для тестирования. Я старался создать одинаковые условия. И обычный счёт и счёт через ускоритель вывел в отдельные функции, которые получали по два 16 бит операнда, а возвращали один 32 бит. Время считает таймер1, у микроса точность гораздо хуже. Результат такой, -на 100 циклах операции DA = DA + (DX*DY) вывелось следущее:
Test uDSC 269.75 uS
Test Normal 451.00 uS
То есть с ускорителем в 1,5 раза быстрее. Ну если вычисление обычным способом убрать из отдельной функции и вставить в тело основной программы то результат сравнится. Но возможно, что все эти результаты полная фигня из-за того что я выбрал неудачно счётную задачу. Возможно в какой-то другой ситуации, где идёт какой-то входящий поток данных ускоритель даст в разы большую скорость. Интересно протестировать на FFT. Я за это пожалуй уже не возьмусь, и так времени целый день убил.
Реальная круть! Прямо целый DSP! И то что на входе всего 16-бит нормально, даже правильно. Если не тяжело, прогоните тест еще например на 200 циклах, чтоб исключить потери времени на организацию цикла и т.д.
Хотя даже лучше просто продублировать строки 60-62. Типа так.
Тогда увеличение времени на тех же 100 тактах по сравнению с предыдущими Test uDSC 269.75 uS делим на 100 и получаем чистое время на DA = DA + (DX*DY) . Вывод результата из DA в время операции вносить не стоит. Назначение строк 58-59 (или 3-4 в этом сообщении) я не понял, может и их надо повторять?
ПС. посмотрел строк 58-59 вобще один раз нужы. Включают DCS просто.
Чего пишут то! "При использовании команды LD / ST для доступа к SRAM от 0x2100 до 0x28FF, ядро автоматически включает 16-разрядную функцию LD / ST, чтобы включить прямой доступ между SRAM и uDSC." Получается вместо out можна LD / ST но с адресов 0x2100 до 0x28FF куда дублировано обычное ОЗУ.
А еще там сдвиги есть на N бит! Причем хочеш со знаком, хочеш без. И деление быстрое.
Logik, 500 циклов
Test uDSC 1344.75 uS
Test Normal 2251.00 uS
Т.е соотношение не меняется . Добавлять повторы в функцию особого смысла не, т.к. уже её потактово просчитал. 2 такта уйдёт что б внести операнды в адресные регистры. Потом 7 команд по такту описанных в функции, и 1 такт выход из функции. Выходит полный цикл 10 тактов, похоже большая часть времени уходит непонятно на что..:-\ Что-бы повторить вычисление без изменения входных данных достаточно всёго двух тактов -загрузить код операции в временный регистр, и выгрузить его в порт (или одного, если код уже лежит в регистре). На данной операции конечно скорость будет сверхзвуковая )
PS: строки 58-59 просто включают ускоритель. Да! в принципе можно убрать, включив его один раз в сетапе. Этот регистр 8-битный, и можно им управлять из Си. Выходит любую операцию функция будет выполнять за 8 тактов. Найти бы этому полезное применение..
//соотношение не меняется .
И не поменяется, не в нем дело. В эти времена входит много чего - переходы циклов, вызовы функций, извлечение из аккумулятора. Все это вобщем не связано с самим временем DA = DA + (DX*DY). Чтоб исключить эту чепуху надо сделать допустим 500 (или сколько угодно вобщем, но достаточно много) раз с однократным DA = DA + (DX*DY), а потом столькоже с двукратным и вычесть одно из другого чтоб чепуха, которая одинакова в обоих опытах сократилась. Так с точностю до такта можна определить.
//Потом 7 команд по такту описанных в функции, и 1 такт выход из функции.
Не факт что эти команды именно при работе с DCS остаются с такими же тактами а не ждут пока насчитают
Хотя и из Ваших цифр уже интересно получается. По первому опыту 269,75/100=2,7мксек По второму 1344,75/500=2,7мксек По разностям, здесь плохо что итератор в первом опыте байт а в втором 2 байта, но (1344,75-269,75)/(500-400)=2,7мксек. Вобщем везде одинаково. Вывод - время самой операции DA = DA + (DX*DY) существенно больше чем на организацию циклов и прочую чепуху и порядка 2,7мксек. Если нужно точней - методику я описал.
//похоже большая часть времени уходит непонятно на что..:-\
Ага, порядка 2,7мксек какраз на работу DCS по расчету математики. Ну немного меньше понятно, но не на много, на те самые тактов 10.
//На данной операции конечно скорость будет сверхзвуковая )
Все проверять нужно, это же китайцы! )))))
Я вот чего подумал. Включение ускорителя может вызывать его инициализацию на сколькото тактов. И будет влиять сильно, т.к. все тормознется до завершения инита. Возможно. Надо стр 58-59 в сетап нафиг убирать.
Не факт что эти команды именно при работе с DCS остаются с такими же тактами а не ждут пока насчитают
Решил проверить, ниже скетч, выполняет измерение один раз, и только времени работы функции uDSC. Поместил включение таймера прямо перед вызовом ассемблерной вставки , а выключение таймера сразу после.
И получаю:
Test uDSC 10 tic mk
dx=22017 dy=33589dx x dy =739529013
Решил ещё один тест провести, вписал включение таймера в начало ассемблерного кода, выключение в конец.
Start..
Test uDSC 9 tic mk
dx=18689 dy=40 dx x dy =12648448
Добавлено: переписал результаты этих тестов в этом посте, т.к. сам допустил небольшую ошибочку. В общем все накрутки идут когда программа уже выходит из функции.
//dx=18689 dy=40 dx x dy =12648448
вощето 18689*40=747560. Заметил что уВас множитель заканчивается на 0 а результат - нет. ))
А зачем перешли с операции DA = DA + (DX*DY), код 0х47 на DA = DX*DY, код 0х44? Они могут различатся длительностю.
Не морочтесь с этими таймерами. Когда вносится в код много изменений всегда ошибки влезут. Возмите код из #28 второй Ваш скетч, убедитесь что выдаст как ранее Test uDSC 269.75 uS, это для самопроверки, поменяйте функцию на приведеную в #29 и все, новое время все сразу покажет, т.к. в код добавлена только одна операция, то и время добавится только на неё (с учетом разумеется повтора 100 раз).
Logik, ну проверил:
Start..
Test uDSC 288.50 uS
Test Normal 451.00 uS
uDSC вырос на 18,75 мкС, тобишь на 0,1875мкС на один круг круг, что равняется 3м тактам, что точно соответствует 3-м добавленным командам. :) Стало быть ещё раз подтвердилось, что функция работает быстро, получается что основной вычислительный ресурс уходит куда-то ещё. 60мкС на 100 кругов функции , а оставшиеся 200мкС на подтягивание в функцию двух 16-битных данных? Очень не правдоподобно :-/
ОК. Вот и вопрс решен. ))
Одна DA = DA + (DX*DY) - 0,1875мксек, что очень класно.
//равняется 3м тактам
А частота что 16МГц? тогда период 1/16МГц=0,0625мксек. Я думал 32МГц. Кстати про точност 0,0625*3=0,1875 - просто идеально )))
//получается что основной вычислительный ресурс уходит куда-то ещё.
Ага. Уходит. Ну и хрен с ним. Ответ на волновавший вопрос о скорости DSC получили. Найти пропажу - оно конечно тоже любопытно по своему. Там нужно код в ассемблере рассматривать. Думаю все найдется.
ПС. А что с нумерацией сообщений творится?! Невозможно ж рабтать в таких условиях ;)
Запостил предыдущее - терь нормально с нумерацией. Глюк.
Прикинул БПФ 16бит 128 точек, 128*7=896 бабочек, по две операции типа DA = DA + (DX*DY), 336мксек. С пересылками и адресацией в пару мсек должно влазить.
Что еще нарыл в поиске цельных портов для подключения 8/16 бит дисплеев , и благодаря интересу dimaxа:
Из-за того что мы имеем урезанную версию чипа в 32выводном корпусе вместо 48выводного , у чипа всего 2 порта цельных B и D.
8бит PortB 01234567 (6,7 биты забрать можно у кварца , один фиг он медленный 12Мгц)
7бит PortC 0123456 (6 бит забираем у ресета. Благо никаких фьюзов не надо, все перенастраивается в скетче)
8бит PortD 01234567
7бит PortE 0123456 ( 4,5 биты забыли вывести, но можно подпаять)
и того 30 GPIO + VCC и GND , вот и очень экономно в 32пин корпусе.
не то что в оригинальной atmega328 продублированы питающие пины.
получается даже шина 16 бит реализуема. и еще десяток пинов для художеств.
Думаю, что кому-то пригодится для контроля настроек :-)
Измерил скорость АЦП с делителем клоков на 2.
Результат при тактовой МК 16МГц:
Test speed ADC 3.31 uS 1247 mV
Что поболее рассчётного ( 0,125 * 15 =1,875µS)
С делителем /128 -166 µS
У Вас ко времени преобразования добавилось время обработки и подготовки. Наступал на эти грабли в это теме и тоже долго не мог понять почему не получалось снять АЦП за заявленные 13.5 тактов. Оказывается, там есть регистр-защелка вых. данных, и после выставления флага/прерывания вполне можно сначала(!) запустить следующий цикл измерений, и уже по его ходу считывать значение предыдущего замера. Только в этом случае получается то, что написано в даташите. А так, на чтение и сохранение значения уходит около 8-10 тактов ЦП (4-5 тактов АЦП при делителе 1:2), даже если его складывать в массив по автоинкременту регистра.
В общем, чтобы добиться 13.5 тактов на замер мне там пришлось нефигово попотеть пока дошло "что тут не так"..
По вашему коду: Запуск таймера перед запуском АЦП .. -2 такта ЦП; выход из цикла -1 такт и останов таймера .. -1 такт ЦП; Итого измеренное время надо уменьшить на время "накладных расходов" в 4 такта ЦП. Нет? :)
P.S. Пересчитал ваши замеры и просмотрел код внимательней. 2 такта Вы и так вычитаете при печати .. всё как-то очень странно.
Прибейте тему гвоздиком вверху - утонет жеж! :)
Ну все таки, почему не
inline void guid(uint32_t *guid) {
*((uint8_t *)guid)+0)=GUID0;
*((uint8_t *)guid)+1)=GUID1;
*((uint8_t *)guid)+2)=GUID2;
*((uint8_t *)guid)+3)=GUID3;
};
В данном конкретном случае совершенно излишне, понимаю, но код порождается ничуть не больший, зато переносимость, хотя я признал, что она не нужна.
Приехал с https://ru.aliexpress.com/item/WAVGAT-Nano-Mini-USB-Nano-3-0/32868170637.html?spm=a2g0s.9042311.0.0.512b33edV45Rza Пока он ехал, я забыл че хотел ;)
Фото с старшим братом. Похожи.
Тыкаю как есть в USB. Заморгал продвинутым блинком, по несколько вспышек подряд. Заливаю стандартный блинк. Успешно, но моргает в 4 раза медленей обычного. Знчить завелся на 4МГц.. Ах да аддон, выбор платы. Тяну по ссылке в начале темы папку update, из неё копирую hardware в ...\Documents\Arduino\hardware, либы пока не спешу копировать, там имена частично перекрываются с стандартными. После рестарта ИДЕ имею 3 новые платы WAVGAT: UNO, NANO и ProMini. Первые две пробовал - разницы не заметил.
Теперь блинк честно моргает с периодом 2 сек, значить 16МГц есть. Дописываем пару строк, получаем
и моргает в 2 раза быстрей. Значить на 32МГц перешли.
Иду далее.
Start..
a= 16173 b= 7522
a * b = 0
299C385A
Хмм... Умножалка не работает, а UID дает. Пробую перевести на 32МГц, добавив 2 строки аналогично блинку. Посыпался обменн.. Ну понятно, меняю скорость в скетче на 57600, а в мониторе остается 115200.
EÉѹ.
a= 16173 b= 7522
a * b = 0
299C385A
Хмм... Ну допустим. Но чего умножалка не пашет?
скетч из #57 дает
Test - PMCR: 0xF2
=================
PMCE CLKFS CLKSS WCLKS OSCKEN OSCMEN RCKEN RCMEN
0 0 0 1 0 0 1 1
Test - CLKPR: 0x03
==================
CLKPCE CLKOEN1 CLKOEN0 - CLKPS3 CLKPS2 CLKPS1 CLKPS0
0 0 0 - 0 0 0 1
Test - PRR : 0x64
==================
PRTWI PRTIM2 PRTIM0 - PRTIM1 PRSPI PRUSART0 PRADC
0 0 0 - 0 0 0 0
Test - PRR1 : 0x65
==================
- - PRWDT - - PREFL PRPCI -
- - 0 - - 1 0
Из #58 тест ацп подтверждается
Test speed ADC 3.31 uS 1151 mV
Test speed ADC 3.31 uS 1151 mV
Test speed ADC 3.31 uS 1151 mV
Test speed ADC 3.31 uS 1151 mV
Test speed ADC 3.31 uS 1087 mV
Test speed ADC 3.31 uS 1203 mV
Test speed ADC 3.31 uS 1151 mV