EzR1d3r, вы не это, случайно, хотели залить на LGT8F328P? https://alexgyver.ru/colormusic/
А то больно схожий результат у меня с вашим. Прям один-в-один. И так же проблему с компиляцией решила ссылка на github.
Если да, то как себя ведёт готовый проект? Не пришлось переносить его на Pro mini?
Что вы подразумеваете под "такой же"? Совместимость по распиновке? Совместимость по регистрам?
LGT8F328P это клон (частично) ATmega328P. Камня с бОльшим количеством памяти, но c такой же распиновкой и такими же регистрами нет.
Например есть ATmega640 с 64кб и ATmega1280 с 128кб. Но они отличаются от ATmega328P/LGT8F328P как распиновкой (там даже пинов больше), так и регистрами.
Новость: Из обсуждений скетча-программатора для LGT8F на гитхабе - один из пользователей пишет, что связался с техническим директором производителя, и тот сообщил, что в ближайшее время выпустят новую версию скетча-прошивальщика с поддержкой LGT8F328P.
Таки свершилось. Новая версия скетча-программатора с поддержкой LGT8F328P оказывается вышла 2 месяца назад. https://github.com/LGTMCU/LarduinoISP Кто проверит отпишитесь.
Куплено сих плат на LGT8F328P некоторое количество ввиду расширенного функционала.
WeMos XI Alpha 8F328P-U
Arduino Nano Alpha LGT8F328P
Arduino Pro Mini Alpha LGT8F328P-SSOP20
Качество достойное. По методе dimax проверил качество тактирующих внутренних RC генераторов. Так вот, джиттер не обнаружен. От слова совсем. Частоты (32 мГц) - красная платка +6 кГц, средняя -3 кГц, нижняя - 3 кГц. При касании пальцем небольшой уход вниз частоты от прогрева, с последующим постепенным возвратом. То же с кварцами. Я впечатлен..
На средней зеленой плате экспериментировал с тактированием от кварцев. Я удивлен..
48 и 50 мегагерц. Проверил правда только блинком
Джиттер конечно есть, он не может не есть ;) Но при наблюдении на осциллографе при бесконечном послесвечении луча на развертке 8 ns на деление не выявлен явно, наблюдалась некоторая флюктуация по показаниям частотомера в пределах десятой доли процента и ниже. Не хуже чем с кварцами.
Домосед, по всей вероятности вашему осциллографу измерить джиттер "не по зубам". Что за прибор то?
Возможно.
Hantek DSO5102P и OWON SDS6062. Щюпы на 100 МГц, но я не верю, оценочно 30-50.
Хотел одно время прикупить RIGOL DS1054Z из gray партии разлоченный, но по отзывам запашок у них был сногшибательный, отвернуло меня. Да и нужна была мне гальваническая развязка по входам. Сейчас есть, Овен еще аккумулятор имеет.
Да кстати c кварцем на 50 МГц DAC работает - синус на выходе стоит как влитой. 11.48 кГц, против 3.683 кГц по дефолту. Кварц беленький такой, на фото верху видно.
Может это из даташита поможет:
"Перед использованием режима DPS2 программное обеспечение
- устанавливает IOCWK для включения требуемого входа IO
- или включает LPRC через регистр DPS2R и настраивает период пробуждения,
- затем включает режим DPS2 через бит DPS2EN в регистре DPS2R.
После настройки программное обеспечение должно
- установить режим спящего режима DPS2 через регистр SMCR,
- а затем выполнить команду SLEEP для перехода в спящий режим."
Вести с кварцевых полей.
Вышеименованная Arduino Nano Alpha LGT8F328P, избранная для опытов, с кварцем на 64 МГц типа HC-49S не завелась. Или надо было вывод на PB0 не включать? Хотя судя по осциллограмме хотела, характерные заломы 3-ей гармоники. А может мне почудилось..
В общем ВЧ кварц на 3 гармонике здесь не подходит. Одногармониковые на 64 МГц мне не попадались на глаза.
С кварцем на 48 мегагерц удалось "оцифровать" вот такой причудливый сигнал 21 Гц c DDS генератора.В общем считаю плата с камнем годные, в хозяйстве пригодятся :)
Домосед, с разгоном этого МК не всё так просто как может показаться. Он действительно без труда запускается на частотах выше штатных 32 МГц, но если тщательно тестировать чтением/записью с флеша, всякими тяжёлыми математическими операциями, то нет-нет да и сбойнёт. Так что разгонять его если и есть смысл, то только в экспериментальных целях.
Одно из достоинств этих мелкоплат то что детали с одной стороны, большинство NANO сделаны с двух сторонним монтажем и не всегда влазят куда надо. Каждый раз приходится довольно долго рыться чтоб найти версии односторонние на алике, повторно у того же продавана брать получается редко, они поднимают цену и даже нет смысла добавлять в избранное
Через телефон эти платки (на этом клоне) программироваться не захотели, возможно они не знают такой VID PID CH340 без кварца, странно зачем надо было делать разные ID микросзем если отличия лишь в букве, очень не грамотное китайское решение.
В целом чипы оказались бесперспективными из-за стремного АЦП, тем более что китаезы обманули с разрядностью, она указана с учетом оверсемплинга. У производителя который так пытается нае.-ть покупателя я ничего брать не буду.
Конечно чипы значительно гибче atmega328, это лично меня сильно манит до сих пор.
В целом чипы оказались бесперспективными из-за ;стремного АЦП, тем более; что китаезы обманули; с разрядностью, она указана с учетом оверсемплинга. У производителя который так пытается нае.-ть покупателя я ничего брать не буду.</p>
Правильно не берите, цены меньше будут. :D
И причем здесь оверсемплинг?
Сегодня занялся изучением ADC LGT8F.. Набросал простенький скетч без analogRead() подал 5 mV на А4 и был удивлен диким смещением оцифровки, причем имеющим плавающее значение. C analogRead() проблем нет :O
И получается в analogRead() два замера с переключением входной полярности внутреннего компаратора, с последующим "усреднением" и компенсации смещения. Разряды преобразования то честные - 12. При этом правда теряем динамический диапазон и на референсе 4.096V будем иметь предел измерений например 3V.
Опробую еще дифференциальный усилитель, как разберусь как его включать.
Пример использования дифференциального усилителя в блоке ADC. Усиление х16, инвертирующий вход на gnd, неинвертирующий на А0, через мультиплексор. Присутствует напряжение смещения нуля зависящее по меньшей мере от коэф.усиления, соответственно его необходимо учитывать. Определяется замыканием входа на землю. Подавал на вход А0 4.4mV с RR делителя. Напряжение контролировал мультиметром XB-868.
Домосед, мужики плюются от диф АЦП АVR. Говорят что редкая дрянь из за жуткого дрейфа нуля. И даже в документации написано, что для диф режима гарантируется точность не 10, а 8 бит.
Хотя, может быть китайские инженеры чего нибудь улучшили...
Мужики не зря плюются. До кучи ещё и входа диф.усилителя на Gnd до конца программно не прожимаются - компенсацию температурного дрейфа толковую не сделать..
Подключил таки К термопару, но точность +- 10гр. Ж(
---
Нет, вру.. 40uV на 1градус у термопары, итого.. в общем на пару градусов брешет.
Здравствуйте. Второй день ковыряю Pro Mini Alpha LGT8F328P-SSOP20 и читаю ветку данного форума. Много нового узнал, но в некоторых темах совершенно не разбираюсь. Прошу помощи и не кидать тапками, только сегодня узнал что такое регистры и работа с портами напрямую. Многого еще не понимаю. Пытаюсь сделать 1й пин программируемым (по умолчанию на нем reset)
Делаю следующее в setup. Но не могу прошить - плата зависает. Правильные ли регистры я прописал - это первый вопрос. И как обойти обработку этого пина при прошивке? По задумке на нем должен светиться управляемый светодиод (подключен с резистором).
PMX2= 1<<WCE; //разрешаем изменения регистра IOCR в ближайшие 6 тактов
2
PMX2= 1<<C6EN; //отвязываем reset от первого пина
3
DDRC= 1<<7; //назначаем порт на выход
upd: поправочка, reset все же отвязался. Но, в том числе, и набортная кнопка. Поэтому и перепрошить не получается. В этой плате перед заливкой скомпилированного скетча нужно как раз удерживать reset. А программатор у меня без DTR-контакта. Ребята, как быть?
GennadyK, вместо ресета дёргать питание, тот же эффект по идее. Главное не притяните ресет к земле вашим светодиодом, иначе МК в принципе не запустится.
avrdude: stk500_getsync() attempt 1 of 10: not insync: resp=0x30
Сталкивался с подобным, правда PC6 не ремапил, пришлось перепрошивать загрузчик по SWD интерфейсу через нану.
Судя по всему там там загрузчик слишком мало ждет загрузки скетча и запускает сразу user aplication. У меня в скетче был постоянный вывод в Serial, ставлю между сессиями вывода delay(), проблемы с загрузчиком пропадают. И самое интересное помогала иногда загрузка Blink :O
В общем, надо было вырубить питание перед загрузкой и зажать reset. Не отпуская его, врубить питание. И отпустить только когда скетч будет готов к загрузке.
Война клонов? Или китайцы выпустили один клон и тиражируют его
в разных вариантах. Давно купил MD-328D, но руки до него так и не дошли.
Уже давно и не один клон. Чего стоит продукция RobotDyn.
Не понимаю зачем эксперименты с LGT8F328P, потратить уйму времени, лучше за это время изучить линейку STM8, 32.
Тоже купил сего зверька только в корпусе SSOP20. https://3v3.com.ua/product_8179.html Там же на странице ссылка на пакет аппаратной поддержки и PDF документация (правда на китаезском, если кто переведет огромное спасибо)
Но у меня была для этого серьезная мотивация - планировалось снятие контроллера и впаивание его в плату пульта радиоуправления моделями (там стоит неизвестный контроллер SSOP20, но уже есть плата, разводка питания, два джойстика, светодиоды и кнопки управления, плюс все это в корпусе с отсеком для батареек).
Всё это для автоматики рыболовного кораблика на nRF24L01 с дальностью до 1 километра
Зверька пока не покупал и заранее хотелось бы выяснить два момента
1) А что у этих процессоров с лок фусе битами? Есть ли на них описание?
в программаторе они упоминаются.
param.lockbytes = buff[6];
param.fusebytes = buff[7];
2) скачав исходники провел поиск в них по UCSR и не нашел таблички присвоения
inc файла с Register/Bit Definitions for the LGT8F328P
сами регистры используются. Откуда его выдрать можно?
3) Кто нибудь пользовался программатором?
"Новая версия скетча-программатора с поддержкой LGT8F328P оказывается вышла 2 месяца назад. Кто проверит отпишитесь."
На лог заливки посмотреть можно?
Сам спросил - сам отвечаю
1) Чтение документации показывает, что их НЕТ.
Что не запиши читается FF FF FF
Так же тут НЕТ выделенного бут блока как в Мега328.
И соответственно НЕТ лок битов.
2) А ее НЕТ. Табличку выковырял из пдф - и да там ОШИБКИ сверяться с lgtx8p.h из ардуино комплекта.
Как я понял в файле lgtx8p.h описаны только различия с мегой328 - т.е. он не полный.
3) В 260 посте есть картинка - я себе купил такую же
Ловить на PD6, причём в данном режиме переводить PD6 в OUTPUT категорически запрещено, иначе будет к.з т.к. сигнал OC3A будет выводится не на сам PD6, а на запараллеленый ему физически вход компаратора. В общем там всё запутанно :)
Ловить на PD6, причём в данном режиме переводить PD6 в OUTPUT категорически запрещено, иначе будет к.з т.к. сигнал OC3A будет выводится не на сам PD6, а на запараллеленый ему физически вход компаратора. В общем там всё запутанно :)
QuickWitted, да я позже сам проверял -всё ок, -lgt8f328p шьётся и читается новым прошивальщиком без проблем. Помню, что вешал пулл-ап резисторы на swd шину как советовали, и добавлял в файл LGT-аддона Progammers.txt строчки о программаторе "Arduino as ISP". Почему-то по умолчанию его там не было. Там кстати можно в скетче задействовать три выхода под отладочные светодиоды, тогда при включении "программатора" они каждый по очереди подмигивают, а при прошивке 2 из них мигают.
PS: хотя вру, читать записанную прошивку я не пробовал. Но она вливается, это самое главное :)
QuickWitted, поскольку в даташите про программирование через SWD нет ни слова, то можно только гадать. Есть там лок-биты или нет. Мне кажется более вероятным что инженер из logicgreen скетч программатора просто не тестировал на чтение, и где-то в программе есть косячок. По хорошему нужно написать об этом на https://github.com/LGTMCU/LarduinoISP/issues , создать new issue, и описать проблему.
QuickWitted, попробовал прочесть МК. Действительно стоит один раз прочесть, и всё, залитая программа больше не работает. Даже не обязательно считывать прошивку, достаточно просто обратится к МК, и всё..
Просили не цитировать.
На 1 странице вопрос
>А как он по совместимости с Atmega328 на уровне регистров? Хотябы обратной?
Ответ был
>я каждый регистр не сверял :) думаю обратно совместимы, хотя какие-то нюансы скорее всего есть.
После моего подробного копания выяснилось что 99% регистров лежит там же где и у АВР
новые регистры напиханы в свободных местах между старыми, НО!!! (согласно датащиту)
1) у них другой размер таблицы прерываний.
2) у них другой алгоритм чтения H регистров. В начале L потом Nop и только потом H.
3) у аппаратных модулей есть доп регистры которые не мешало бы настроить
Как итог
Прошивка - помигать светодиодом - за исключением сдвижки таблицы прерываний 1 в 1
Но прошивки использующие аппаратные части (например таймер регистры которого для обращения требует нопа) - скорее всего не заведуться. Лечится и то не всегда - пересборкой из исходников под эту плату.
OCR3AH=r3ah; // Важно, вначале необходимо загрузить верхний регистр!!!
2
OCR3AL=r3al; // затем нижний
3
// Нельзя как для Atmega328 - OCR3A = topValue;
Как по мне так как нужен или ноп или за это время присвоить значение регистру.
И пару раз писали что у некоторых H по их менеию обнуляется... а по моему просто не записывается.
Т.е. когда ты читаешь OCR3A то думаешь, что получишь 16 бит, но отдаётся тот-же самый младший char. Надо как минимум поменять на uint16_t , что б отдавалось слово. Или ещё лучше заюзать специальный авр-овский макрос, так будет более корректно.
Хотя, я не профессионал, надо у взрослых спросить.
Небыло. Они в разных сегментах памяти потому и не работает. Код по адресу 0х1234 и данные на таком же адресе - две большие разницы, хотя указатели численно и равны будут. Компилятор их в разные сегменты сует. Для МК это какбыдаже очевидно - одно во флеше другое ОЗУ. У ПК оба в ОЗУ, а сегменты разные.
забрёл случайно на старую запись, если файл типа COM то там один адрес для всех сегментов, потому и программа не могла быть более 64кб
прошу прошения, с 25мГц завелось, TF38 не подошел или умер.
а есть такой же камень но на 64кб или 128 ?
Точно такого нет, так как в любом случае это будет другой камень.
EzR1d3r, вы не это, случайно, хотели залить на LGT8F328P?
https://alexgyver.ru/colormusic/
А то больно схожий результат у меня с вашим. Прям один-в-один. И так же проблему с компиляцией решила ссылка на github.
Если да, то как себя ведёт готовый проект? Не пришлось переносить его на Pro mini?
а есть такой же камень но на 64кб или 128 ?
Что вы подразумеваете под "такой же"? Совместимость по распиновке? Совместимость по регистрам?
LGT8F328P это клон (частично) ATmega328P. Камня с бОльшим количеством памяти, но c такой же распиновкой и такими же регистрами нет.
Например есть ATmega640 с 64кб и ATmega1280 с 128кб. Но они отличаются от ATmega328P/LGT8F328P как распиновкой (там даже пинов больше), так и регистрами.
DDRF = 1<<2 | 1<<1; // Разрешаем вывод в порты D1 и D2
1
Почему DDRF для пинов порта D? Ошибка или так и надо?
Подскажите место в Даташите на МК где написано про перенаправление портов? (ремапинг)
Почему DDRF для пинов порта D? Ошибка или так и надо?
В 32-х ногом корпусе некоторые пины порта "F" и "D" сидят на одних физических ногах. Об этом есть информация в "описании выводов" даташита.
Подскажите место в Даташите на МК где написано про перенаправление портов? (ремапинг)
В описании регистров мультиплексирования (PMX)
Новость: Из обсуждений скетча-программатора для LGT8F на гитхабе - один из пользователей пишет, что связался с техническим директором производителя, и тот сообщил, что в ближайшее время выпустят новую версию скетча-прошивальщика с поддержкой LGT8F328P.
Таки свершилось. Новая версия скетча-программатора с поддержкой LGT8F328P оказывается вышла 2 месяца назад. https://github.com/LGTMCU/LarduinoISP Кто проверит отпишитесь.
Куплено сих плат на LGT8F328P некоторое количество ввиду расширенного функционала.
WeMos XI Alpha 8F328P-U
Arduino Nano Alpha LGT8F328P
Arduino Pro Mini Alpha LGT8F328P-SSOP20
Качество достойное. По методе dimax проверил качество тактирующих внутренних RC генераторов. Так вот, джиттер не обнаружен. От слова совсем. Частоты (32 мГц) - красная платка +6 кГц, средняя -3 кГц, нижняя - 3 кГц. При касании пальцем небольшой уход вниз частоты от прогрева, с последующим постепенным возвратом. То же с кварцами. Я впечатлен..


На средней зеленой плате экспериментировал с тактированием от кварцев. Я удивлен..
48 и 50 мегагерц. Проверил правда только блинком
01
//переключения тактирования
02
#include "lgtx8p.h"
03
04
void
setup
(){
05
pinMode(13, OUTPUT);
06
//rc32khz(); // внутренний 32 кгц
07
quartzHF();
// внешний кварц
08
09
CLKPR = 1<<WCE;
// разрешить изменение
10
CLKPR = 1<<CLKOE0 | 0<<DPS0;
//делитель = 1 и вывод clk на PBO
11
}
12
void
loop
()
13
{
14
digitalWrite(13, HIGH);
// turn the LED on (HIGH is the voltage level)
15
delay(1000);
// wait for a second
16
digitalWrite(13, LOW);
// turn the LED off by making the voltage LOW
17
delay(1000);
// wait for a second
18
}
19
void
quartzHF()
20
{
21
PMCR = 1<<PMCE;
// разрешить изменение
22
PMCR |= 1<<OSCMEN;
// включить HF quartz
23
24
PMCR = 1<<PMCE;
// разрешить изменение
25
PMCR |= 1<<CLKSS;
// переключиться на HF quartz
26
27
//PMCR = 1<<PMCE; // разрешить изменение
28
//PMCR &= ~(1<<CLKSS); // отключить RC 32 Mhz
29
30
}
31
void
rc32khz()
32
{
33
PMCR = 1<<PMCE;
// разрешить изменение
34
PMCR |= 1<<RCKEN;
// включить RC 32 kHz
35
36
PMCR = 1<<PMCE;
// разрешить изменение
37
PMCR |= 1<<CLKFS;
// переключиться на RC 32 kHz
38
39
PMCR = 1<<PMCE;
// разрешить изменение
40
PMCR &= ~(1<<CLKSS);
// отключить RC 32 Mhz
41
42
}
Что-то как-то не верится, что нет джиттера
Интересно, а как происходила проверка ? Джиттер есть у всего, гдето 5ps гдето 5μs )
Джиттер конечно есть, он не может не есть ;) Но при наблюдении на осциллографе при бесконечном послесвечении луча на развертке 8 ns на деление не выявлен явно, наблюдалась некоторая флюктуация по показаниям частотомера в пределах десятой доли процента и ниже. Не хуже чем с кварцами.
Домосед, по всей вероятности вашему осциллографу измерить джиттер "не по зубам". Что за прибор то?
Возможно.
Hantek DSO5102P и OWON SDS6062. Щюпы на 100 МГц, но я не верю, оценочно 30-50.
Хотел одно время прикупить RIGOL DS1054Z из gray партии разлоченный, но по отзывам запашок у них был сногшибательный, отвернуло меня. Да и нужна была мне гальваническая развязка по входам. Сейчас есть, Овен еще аккумулятор имеет.
Да кстати c кварцем на 50 МГц DAC работает - синус на выходе стоит как влитой. 11.48 кГц, против 3.683 кГц по дефолту. Кварц беленький такой, на фото верху видно.
Помогите усыпить LGT8F328P_SSOP20 (светик по питанию и стабилизатор выпаял). Ток потребления не опускается ниже 3мА.
01
#define PRR1 (*((volatile unsigned char *)0x64))
02
#define SMCR (*((volatile unsigned char *)0x53))
03
04
void
setup
() {
05
pinMode(13, OUTPUT);
06
pinMode(9, OUTPUT);
07
digitalWrite(9, LOW);
08
PRR = 0xFF;
//отключении периферии
09
}
10
11
void
loop
() {
12
// в режим DPS2
13
SMCR |= (1 << 1); SMCR |= (1 << 2); SMCR |= (1 << 3);
14
SMCR |= (1 << 0);
//SLEEP
15
delay(100);
16
digitalWrite(13, HIGH);
17
delay(3000);
18
}
Может это из даташита поможет:
"Перед использованием режима DPS2 программное обеспечение
- устанавливает IOCWK для включения требуемого входа IO
- или включает LPRC через регистр DPS2R и настраивает период пробуждения,
- затем включает режим DPS2 через бит DPS2EN в регистре DPS2R.
После настройки программное обеспечение должно
- установить режим спящего режима DPS2 через регистр SMCR,
- а затем выполнить команду SLEEP для перехода в спящий режим."
Вести с кварцевых полей.
Вышеименованная Arduino Nano Alpha LGT8F328P, избранная для опытов, с кварцем на 64 МГц типа HC-49S не завелась. Или надо было вывод на PB0 не включать? Хотя судя по осциллограмме хотела, характерные заломы 3-ей гармоники. А может мне почудилось..
В общем ВЧ кварц на 3 гармонике здесь не подходит. Одногармониковые на 64 МГц мне не попадались на глаза.
В общем считаю плата с камнем годные, в хозяйстве пригодятся :)
С кварцем на 48 мегагерц удалось "оцифровать" вот такой причудливый сигнал 21 Гц c DDS генератора.
Домосед, с разгоном этого МК не всё так просто как может показаться. Он действительно без труда запускается на частотах выше штатных 32 МГц, но если тщательно тестировать чтением/записью с флеша, всякими тяжёлыми математическими операциями, то нет-нет да и сбойнёт. Так что разгонять его если и есть смысл, то только в экспериментальных целях.
Как писал Поэт - "И опыт сын ошибок трудных".. Тут дело такое, пока зуд сам не пройдет, расчесывание только усугубляет течение "болезни"
Одно из достоинств этих мелкоплат то что детали с одной стороны, большинство NANO сделаны с двух сторонним монтажем и не всегда влазят куда надо. Каждый раз приходится довольно долго рыться чтоб найти версии односторонние на алике, повторно у того же продавана брать получается редко, они поднимают цену и даже нет смысла добавлять в избранное
Через телефон эти платки (на этом клоне) программироваться не захотели, возможно они не знают такой VID PID CH340 без кварца, странно зачем надо было делать разные ID микросзем если отличия лишь в букве, очень не грамотное китайское решение.
В целом чипы оказались бесперспективными из-за стремного АЦП, тем более что китаезы обманули с разрядностью, она указана с учетом оверсемплинга. У производителя который так пытается нае.-ть покупателя я ничего брать не буду.
Конечно чипы значительно гибче atmega328, это лично меня сильно манит до сих пор.
23.2.6. Калибровка смещения АЦП
Из-за изменений в производственном процессе и присущих характеристикам
структуры схемы внутренняя схема компаратора АЦП будет производить разные
уровни ошибки смещения. Поэтому компенсация напряжения смещения имеет
решающее значение для создания высокоточной структуры преобразования АЦП.
АЦП внутри чипа LGT8FX8P поддерживает интерфейс, связанный с
напряжением смещения, который может использоваться для завершения измерения
и калибровки смещения. ..
Смотрю Атмеловский wiring_analog.c
01
int
analogRead(uint8_t pin)
02
{
03
uint8_t low, high;
04
...
05
// start the conversion
06
sbi(ADCSRA, ADSC);
07
while
(bit_is_set(ADCSRA, ADSC));
08
low = ADCL;
09
high = ADCH;
10
...
11
// combine the two bytes
12
return
(high << 8) | low;
13
}
Коротко и понятно..
Смотрю LGT8F wiring_analog.c
01
int
analogRead(uint8_t pin)
02
{
03
uint16_t adcVal = __analogRead(pin);
04
return
adcVal;
05
}
06
int
__analogRead(uint8_t pin)
07
{
08
uint16_t pVal;
09
uint16_t nVal;
10
// enable/disable internal 1/5VCC channel
11
ADCSRD &= 0xf0;
12
if
(pin == V5D1 || pin == V5D4) {
13
ADCSRD |= 0x06;
14
}
15
...
16
sbi(ADCSRC, SPN);
17
nVal = adcRead();
18
cbi(ADCSRC, SPN);
19
pVal = adcRead();
20
pVal = (pVal + nVal) >> 1;
21
pVal -= (pVal >> 7);
22
return
pVal;
23
}
24
uint16_t adcRead()
25
{
26
volatile uint8_t tmp = 0;
27
// start the conversion
28
sbi(ADCSRA, ADSC);
29
// ADSC is cleared when the conversion finishes
30
while
(bit_is_set(ADCSRA, ADSC));
31
// read low byte firstly to cause high byte lock.
32
tmp = ADCL;
33
return
(ADCH << 8) | tmp;
34
}
И получается в analogRead() два замера с переключением входной полярности внутреннего компаратора, с последующим "усреднением" и компенсации смещения. Разряды преобразования то честные - 12. При этом правда теряем динамический диапазон и на референсе 4.096V будем иметь предел измерений например 3V.
Опробую еще дифференциальный усилитель, как разберусь как его включать.
Пример использования дифференциального усилителя в блоке ADC. Усиление х16, инвертирующий вход на gnd, неинвертирующий на А0, через мультиплексор. Присутствует напряжение смещения нуля зависящее по меньшей мере от коэф.усиления, соответственно его необходимо учитывать. Определяется замыканием входа на землю. Подавал на вход А0 4.4mV с RR делителя. Напряжение контролировал мультиметром XB-868.
01
#include "lgtx8p.h"
02
#define sbi(x,y) (x|=1<<y)
03
#define cbi(x,y) (x&=~(1<<y))
04
#define offset 440 // смещение нуля экспериментально
05
06
void
setup
() {
07
//pinMode(A0, INPUT);
08
Serial
.begin(9600);
09
ADCSRA=1<<ADEN
10
| 1<<ADPS0 | 1<<ADPS1 | 1<<ADPS2;
// clk/8
11
ADCSRB=0; ADCSRC=0;
12
ADMUX=1<<REFS0 | 1<<REFS1 ;
// A0, Vref 1V024
13
DAPCR=0b11011000;
// усиление 16 по A0 входу
14
ADCSRC|=1<<1;
// подключить ADC к диф.усилителю
15
}
16
void
loop
() {
17
uint16_t adcVal;
18
sbi(ADCSRA, ADSC);
19
while
(bit_is_set(ADCSRA, ADSC));
20
adcVal = ADC - offset;
// смещение нуля
21
Serial
.print(adcVal);
22
Serial
.print(
" map -> mV "
);
23
Serial
.println(
24
map(adcVal, 0, 4095, 0, 1023)/16.0);
25
delay(500);
26
}
Домосед, мужики плюются от диф АЦП АVR. Говорят что редкая дрянь из за жуткого дрейфа нуля. И даже в документации написано, что для диф режима гарантируется точность не 10, а 8 бит.
Хотя, может быть китайские инженеры чего нибудь улучшили...
Мужики не зря плюются. До кучи ещё и входа диф.усилителя на Gnd до конца программно не прожимаются - компенсацию температурного дрейфа толковую не сделать..
Подключил таки К термопару, но точность +- 10гр. Ж(
---
Нет, вру.. 40uV на 1градус у термопары, итого.. в общем на пару градусов брешет.
Да, я перепутал с этим чипом: http://www.inhaos.com/uploadfile/otherpic/DS-MD-328D-V01-20160412.pdf
Обещали 16 бит, а оказалось там инструкция analogRead_16bits() с оверсемплингом 12 битного АЦП https://aliexpress.ru/item/32655296623.htm Я как раз искал МК что бы напрямую подцепить термомпару. Радость была не долгой :)
http://arduino.ru/forum/obshchii/massduino-uno-r3-lc-md-328d-analog-arduino-uno-r3
Здравствуйте. Второй день ковыряю Pro Mini Alpha LGT8F328P-SSOP20 и читаю ветку данного форума. Много нового узнал, но в некоторых темах совершенно не разбираюсь. Прошу помощи и не кидать тапками, только сегодня узнал что такое регистры и работа с портами напрямую. Многого еще не понимаю. Пытаюсь сделать 1й пин программируемым (по умолчанию на нем reset)
Делаю следующее в setup. Но не могу прошить - плата зависает. Правильные ли регистры я прописал - это первый вопрос. И как обойти обработку этого пина при прошивке? По задумке на нем должен светиться управляемый светодиод (подключен с резистором).
1
PMX2= 1<<WCE;
//разрешаем изменения регистра IOCR в ближайшие 6 тактов
2
PMX2= 1<<C6EN;
//отвязываем reset от первого пина
3
DDRC= 1<<7;
//назначаем порт на выход
upd: поправочка, reset все же отвязался. Но, в том числе, и набортная кнопка. Поэтому и перепрошить не получается. В этой плате перед заливкой скомпилированного скетча нужно как раз удерживать reset. А программатор у меня без DTR-контакта. Ребята, как быть?
GennadyK, вместо ресета дёргать питание, тот же эффект по идее. Главное не притяните ресет к земле вашим светодиодом, иначе МК в принципе не запустится.
Не, не срабатывает. Выпадает с ошибкой подключения:
1
avrdude: stk500_getsync() attempt 1 of 10: not
in
sync: resp=0x30
Питание снимаю, отомкнув черный и красный провод с программатора - он у меня в виде usb-шнурка
1
avrdude: stk500_getsync() attempt 1 of 10: not
in
sync: resp=0x30
Сталкивался с подобным, правда PC6 не ремапил, пришлось перепрошивать загрузчик по SWD интерфейсу через нану.
Судя по всему там там загрузчик слишком мало ждет загрузки скетча и запускает сразу user aplication. У меня в скетче был постоянный вывод в Serial, ставлю между сессиями вывода delay(), проблемы с загрузчиком пропадают. И самое интересное помогала иногда загрузка Blink :O
Победа.
В общем, надо было вырубить питание перед загрузкой и зажать reset. Не отпуская его, врубить питание. И отпустить только когда скетч будет готов к загрузке.
P.S. Кстати, возвращал к жизни тоже blink'ом))
Война клонов? Или китайцы выпустили один клон и тиражируют его
в разных вариантах. Давно купил MD-328D, но руки до него так и не дошли.
Уже давно и не один клон. Чего стоит продукция RobotDyn.
Не понимаю зачем эксперименты с LGT8F328P, потратить уйму времени, лучше за это время изучить линейку STM8, 32.
Тоже купил сего зверька только в корпусе SSOP20. https://3v3.com.ua/product_8179.html Там же на странице ссылка на пакет аппаратной поддержки и PDF документация (правда на китаезском, если кто переведет огромное спасибо)
Но у меня была для этого серьезная мотивация - планировалось снятие контроллера и впаивание его в плату пульта радиоуправления моделями (там стоит неизвестный контроллер SSOP20, но уже есть плата, разводка питания, два джойстика, светодиоды и кнопки управления, плюс все это в корпусе с отсеком для батареек).
Всё это для автоматики рыболовного кораблика на nRF24L01 с дальностью до 1 километра
Зверька пока не покупал и заранее хотелось бы выяснить два момента
1) А что у этих процессоров с лок фусе битами? Есть ли на них описание?
в программаторе они упоминаются.
param.lockbytes = buff[6];
param.fusebytes = buff[7];
2) скачав исходники провел поиск в них по UCSR и не нашел таблички присвоения
inc файла с Register/Bit Definitions for the LGT8F328P
сами регистры используются. Откуда его выдрать можно?
3) Кто нибудь пользовался программатором?
"Новая версия скетча-программатора с поддержкой LGT8F328P оказывается вышла 2 месяца назад. Кто проверит отпишитесь."
На лог заливки посмотреть можно?
Сам спросил - сам отвечаю
1) Чтение документации показывает, что их НЕТ.
Что не запиши читается FF FF FF
Так же тут НЕТ выделенного бут блока как в Мега328.
И соответственно НЕТ лок битов.
2) А ее НЕТ. Табличку выковырял из пдф - и да там ОШИБКИ сверяться с lgtx8p.h из ардуино комплекта.
Как я понял в файле lgtx8p.h описаны только различия с мегой328 - т.е. он не полный.
3) В 260 посте есть картинка - я себе купил такую же
http://arduino.ru/sites/default/files/u50122/lgt3.jpg
мне ее продали как LGT8F328P
она шьется и верифицируется программатором с первой страницы.
после этого прошивка работает.
НО!!! При попытке самостоятельного чтения - прошивка слетает.
Вопрос - прошивку прочитать ТОЧНО нельзя?
(в сети всплывали сообщения что у других не получалось)
Дуде выковырял из ардуино комплекта = arduino-1.8.6-windows
команда для чтения
D:\Dude\avrdude -CD:\Dude\avrdude.conf -v -patmega328p -cstk500v1 -PCOM3 -b19200 -Uflash:r:"D:\Main.hex":i
"Так же отремаппить можно и выход таймера OC3A, который сидит на пине Txd, и так же страдает от резистора" как???
ua6em,
Ловить на PD6, причём в данном режиме переводить PD6 в OUTPUT категорически запрещено, иначе будет к.з т.к. сигнал OC3A будет выводится не на сам PD6, а на запараллеленый ему физически вход компаратора. В общем там всё запутанно :)
ua6em,
Ловить на PD6, причём в данном режиме переводить PD6 в OUTPUT категорически запрещено, иначе будет к.з т.к. сигнал OC3A будет выводится не на сам PD6, а на запараллеленый ему физически вход компаратора. В общем там всё запутанно :)
проще наверно резисторы и светодиоды оторвать
Выше просили отписываться о проверке программатора.
Купил плату на которой написано LGT8F328P SSop20
Заливал в нее прошивку через самодельный программатор с гитхаба
(делал из Nano V3)
SSop20 так же пишется как и плата с процом в корпусе LQFP
после залива прошивка работает...
и так же при попытке чтения прошивка с него слетает...
(читаются одни FF).
QuickWitted, да я позже сам проверял -всё ок, -lgt8f328p шьётся и читается новым прошивальщиком без проблем. Помню, что вешал пулл-ап резисторы на swd шину как советовали, и добавлял в файл LGT-аддона Progammers.txt строчки о программаторе "Arduino as ISP". Почему-то по умолчанию его там не было. Там кстати можно в скетче задействовать три выхода под отладочные светодиоды, тогда при включении "программатора" они каждый по очереди подмигивают, а при прошивке 2 из них мигают.
PS: хотя вру, читать записанную прошивку я не пробовал. Но она вливается, это самое главное :)
Как по мне главное наличие лок битов или невозможность студентам считать (скопипастить за вечер) собранный девайс.
Так он читается (и я что то не так делаю) или нет (и это замена лок битов)?
QuickWitted, поскольку в даташите про программирование через SWD нет ни слова, то можно только гадать. Есть там лок-биты или нет. Мне кажется более вероятным что инженер из logicgreen скетч программатора просто не тестировал на чтение, и где-то в программе есть косячок. По хорошему нужно написать об этом на https://github.com/LGTMCU/LarduinoISP/issues , создать new issue, и описать проблему.
чтение при верификации работает...
Или по простому чтение СРАЗУ после записи = работает
А самостоятельное чтение - сносит прошивку.
чтение
01
avrdude: AVR device initialized and ready to accept instructions
02
03
Reading | ################################################## | 100% 0.08s
04
05
avrdude: Device signature = 0x1e950f (probably m328p)
06
avrdude: safemode: lfuse reads
as
FF
07
avrdude: safemode: hfuse reads
as
FF
08
avrdude: safemode: efuse reads
as
FF
09
avrdude: reading flash memory:
10
11
Reading | ################################################## | 100% 20.34s
12
13
avrdude: Flash
is
empty, resulting file has no contents.
14
avrdude: writing output file
"D:\MaK.hex"
15
16
avrdude: safemode: lfuse reads
as
FF
17
avrdude: safemode: hfuse reads
as
FF
18
avrdude: safemode: efuse reads
as
FF
19
avrdude: safemode: Fuses OK (E:FF, H:FF, L:FF)
20
21
avrdude done. Thank you.
и запись
01
avrdude: AVR device initialized and ready to accept instructions
02
03
Reading | ################################################## | 100% 0.03s
04
05
avrdude: Device signature = 0x1e950f (probably m328p)
06
avrdude: safemode: lfuse reads
as
FF
07
avrdude: safemode: hfuse reads
as
FF
08
avrdude: safemode: efuse reads
as
FF
09
avrdude: NOTE:
"flash"
memory has been specified, an erase cycle will be perfo
10
ed
11
To disable
this
feature, specify the -D option.
12
avrdude: erasing chip
13
avrdude: reading input file
"D:\AvrAsm\ALGT328\main.hex"
14
avrdude: writing flash (314 bytes):
15
16
Writing | ################################################## | 100% 0.35s
17
18
avrdude: 314 bytes of flash written
19
avrdude: verifying flash memory against D:\AvrAsm\ALGT328\main.hex:
20
avrdude: load data flash data from input file D:\AvrAsm\ALGT328\main.hex:
21
avrdude: input file D:\AvrAsm\ALGT328\main.hex contains 314 bytes
22
avrdude: reading on-chip flash data:
23
24
Reading | ################################################## | 100% 0.24s
25
26
avrdude: verifying ...
27
avrdude: 314 bytes of flash verified
28
avrdude: reading input file
"0x3f"
29
avrdude: writing
lock
(1 bytes):
30
31
Writing | ################################################## | 100% 0.01s
32
33
avrdude: 1 bytes of
lock
written
34
avrdude: verifying
lock
memory against 0x3f:
35
avrdude: load data
lock
data from input file 0x3f:
36
avrdude: input file 0x3f contains 1 bytes
37
avrdude: reading on-chip
lock
data:
38
39
Reading | ################################################## | 100% 0.01s
40
41
avrdude: verifying ...
42
avrdude: 1 bytes of
lock
verified
43
44
avrdude: safemode: lfuse reads
as
FF
45
avrdude: safemode: hfuse reads
as
FF
46
avrdude: safemode: efuse reads
as
FF
47
avrdude: safemode: Fuses OK (E:FF, H:FF, L:FF)
QuickWitted, попробовал прочесть МК. Действительно стоит один раз прочесть, и всё, залитая программа больше не работает. Даже не обязательно считывать прошивку, достаточно просто обратится к МК, и всё..
01
F:\>avrdude.exe -pm328p -cstk500v1 -PCOM4 -b19200
02
03
avrdude.exe: AVR device initialized and ready to accept instructions
04
05
Reading | ################################################## | 100% 0.05s
06
07
avrdude.exe: Device signature = 0x1e950f
08
09
avrdude.exe: safemode: Fuses OK
10
11
avrdude.exe done. Thank you.
После этой команды залитый предварительно блинк уже не мигает.
Просили не цитировать.
На 1 странице вопрос
>А как он по совместимости с Atmega328 на уровне регистров? Хотябы обратной?
Ответ был
>я каждый регистр не сверял :) думаю обратно совместимы, хотя какие-то нюансы скорее всего есть.
После моего подробного копания выяснилось что 99% регистров лежит там же где и у АВР
новые регистры напиханы в свободных местах между старыми, НО!!! (согласно датащиту)
1) у них другой размер таблицы прерываний.
2) у них другой алгоритм чтения H регистров. В начале L потом Nop и только потом H.
3) у аппаратных модулей есть доп регистры которые не мешало бы настроить
Как итог
Прошивка - помигать светодиодом - за исключением сдвижки таблицы прерываний 1 в 1
Но прошивки использующие аппаратные части (например таймер регистры которого для обращения требует нопа) - скорее всего не заведуться. Лечится и то не всегда - пересборкой из исходников под эту плату.
2) у них другой алгоритм чтения H регистров. В начале L потом Nop и только потом H.
Если речь про регистры таймера, то нопы между операциями нужны только когда таймер работает в турбо-режиме (на тактовой 64 МГц).
Не прокоментируете тогда почему остальные выше писали для таймера который не умеет 64м ?
1
OCR3AH=r3ah;
// Важно, вначале необходимо загрузить верхний регистр!!!
2
OCR3AL=r3al;
// затем нижний
3
// Нельзя как для Atmega328 - OCR3A = topValue;
Как по мне так как нужен или ноп или за это время присвоить значение регистру.
И пару раз писали что у некоторых H по их менеию обнуляется... а по моему просто не записывается.
QuickWitted, это подкол от автора "ядра". Я вроде писал про это где-то. В файлике lgtx8p.h написано вот это:
1
#define OCR3A (*((volatile unsigned char *)0x98))
2
#define OCR3AL (*((volatile unsigned char *)0x98))
3
#define OCR3AH (*((volatile unsigned char *)0x99))
Т.е. когда ты читаешь OCR3A то думаешь, что получишь 16 бит, но отдаётся тот-же самый младший char. Надо как минимум поменять на uint16_t , что б отдавалось слово. Или ещё лучше заюзать специальный авр-овский макрос, так будет более корректно.
1
#define OCR3A _SFR_MEM16(0x98)
Хотя, я не профессионал, надо у взрослых спросить.
Небыло. Они в разных сегментах памяти потому и не работает. Код по адресу 0х1234 и данные на таком же адресе - две большие разницы, хотя указатели численно и равны будут. Компилятор их в разные сегменты сует. Для МК это какбыдаже очевидно - одно во флеше другое ОЗУ. У ПК оба в ОЗУ, а сегменты разные.
забрёл случайно на старую запись, если файл типа COM то там один адрес для всех сегментов, потому и программа не могла быть более 64кб
можно было и exe в один сегмент запхать, если указать модель компиляции tiny (или small)