Обзор клона меги328 -LGT8F328P

zra123
Offline
Зарегистрирован: 05.05.2020

прошу прошения, с 25мГц завелось, TF38 не подошел или умер.

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

а есть такой же камень но на 64кб или  128 ?

arduino328
Offline
Зарегистрирован: 01.09.2016

yuhenotix@2p-mail.com пишет:
а есть такой же камень но на 64кб или 128 ?

Точно такого нет, так как в любом случае это будет другой камень.

Alex-Bee
Offline
Зарегистрирован: 13.03.2020

EzR1d3r, вы не это, случайно, хотели залить на LGT8F328P?
https://alexgyver.ru/colormusic/
А то больно схожий результат у меня с вашим. Прям один-в-один. И так же проблему с компиляцией решила ссылка на github.
Если да, то как себя ведёт готовый проект? Не пришлось переносить его на Pro mini?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

yuhenotix@2p-mail.com пишет:

а есть такой же камень но на 64кб или  128 ?

Что вы подразумеваете под "такой же"? Совместимость по распиновке? Совместимость по регистрам?

LGT8F328P это клон (частично) ATmega328P. Камня с бОльшим количеством памяти, но c такой же распиновкой и такими же регистрами нет. 

Например есть ATmega640 с 64кб и ATmega1280 с 128кб. Но они отличаются от ATmega328P/LGT8F328P как распиновкой (там даже пинов больше), так и регистрами.

Chon
Offline
Зарегистрирован: 28.08.2019

ua6em пишет:

 DDRF = 1<<2 | 1<<1; // Разрешаем вывод в порты D1 и D2 

 

Почему DDRF для пинов порта D? Ошибка или так и надо?

Chon
Offline
Зарегистрирован: 28.08.2019

Подскажите место в Даташите на МК где написано про перенаправление портов? (ремапинг)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Chon пишет:

Почему DDRF для пинов порта D? Ошибка или так и надо?

В 32-х ногом корпусе некоторые пины порта "F" и "D" сидят на одних физических ногах. Об этом есть информация в "описании выводов" даташита.

Chon пишет:

Подскажите место в Даташите на МК где написано про перенаправление портов? (ремапинг)

В описании регистров мультиплексирования (PMX)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

dimax пишет:

Новость: Из обсуждений скетча-программатора для LGT8F на гитхабе - один из пользователей пишет, что связался с техническим директором производителя, и тот сообщил, что в ближайшее время выпустят новую версию скетча-прошивальщика с поддержкой LGT8F328P.

Таки свершилось.  Новая версия скетча-программатора с поддержкой LGT8F328P  оказывается вышла 2 месяца назад.  https://github.com/LGTMCU/LarduinoISP  Кто проверит отпишитесь.

 

Домосед
Домосед аватар
Offline
Зарегистрирован: 18.09.2019

Куплено сих плат на LGT8F328P некоторое количество ввиду расширенного функционала.
WeMos XI Alpha 8F328P-U
Arduino Nano Alpha LGT8F328P
Arduino Pro Mini Alpha LGT8F328P-SSOP20

Качество достойное. По методе dimax проверил качество тактирующих внутренних RC генераторов. Так вот, джиттер не обнаружен. От слова совсем. Частоты (32 мГц) - красная платка +6 кГц, средняя -3 кГц, нижняя - 3 кГц. При касании пальцем небольшой уход вниз частоты от прогрева, с последующим постепенным возвратом. То же с кварцами. Я впечатлен..
На средней зеленой плате экспериментировал с тактированием от кварцев. Я удивлен..


48 и 50 мегагерц. Проверил правда только блинком
 

//переключения тактирования 
#include "lgtx8p.h"

void setup(){
  pinMode(13, OUTPUT);  
  //rc32khz();  // внутренний 32 кгц
  quartzHF();   // внешний кварц
    
  CLKPR = 1<<WCE;  // разрешить изменение
  CLKPR = 1<<CLKOE0 | 0<<DPS0; //делитель = 1 и вывод clk на PBO
}
void loop()
{ 
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}
void quartzHF()
{
  PMCR = 1<<PMCE;       // разрешить изменение
  PMCR |= 1<<OSCMEN;    // включить HF quartz

  PMCR = 1<<PMCE;       // разрешить изменение
  PMCR |= 1<<CLKSS;     // переключиться на HF quartz

  //PMCR = 1<<PMCE;     // разрешить изменение
  //PMCR &= ~(1<<CLKSS); // отключить RC 32 Mhz 
  
}
void rc32khz()
{
  PMCR = 1<<PMCE;   // разрешить изменение
  PMCR |= 1<<RCKEN;     // включить RC 32 kHz

  PMCR = 1<<PMCE;   // разрешить изменение
  PMCR |= 1<<CLKFS; // переключиться на RC 32 kHz

  PMCR = 1<<PMCE;   // разрешить изменение
  PMCR &= ~(1<<CLKSS); // отключить RC 32 Mhz 
  
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Что-то как-то не верится, что нет джиттера

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

Интересно, а как происходила проверка ? Джиттер есть  у всего, гдето 5ps гдето 5μs )

Домосед
Домосед аватар
Offline
Зарегистрирован: 18.09.2019

Джиттер конечно есть, он не может не есть ;) Но при наблюдении на осциллографе при бесконечном послесвечении луча на развертке 8 ns на деление не выявлен явно, наблюдалась некоторая флюктуация по показаниям частотомера в пределах десятой доли процента и ниже. Не хуже чем с кварцами.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Домосед, по всей вероятности вашему осциллографу измерить джиттер "не по зубам". Что за прибор то?

Домосед
Домосед аватар
Offline
Зарегистрирован: 18.09.2019

dimax пишет:
Домосед, по всей вероятности вашему осциллографу измерить джиттер "не по зубам". Что за прибор то?

Возможно.
Hantek DSO5102P и OWON SDS6062. Щюпы на 100 МГц, но я не верю, оценочно 30-50.
Хотел одно время прикупить RIGOL DS1054Z из gray партии разлоченный, но по отзывам запашок у них был сногшибательный, отвернуло меня. Да и нужна была мне гальваническая развязка по входам. Сейчас есть, Овен еще аккумулятор имеет.
Да кстати c кварцем на 50 МГц DAC работает - синус на выходе стоит как влитой. 11.48 кГц, против 3.683 кГц по дефолту. Кварц беленький такой, на фото верху видно. 

 

 

Chon
Offline
Зарегистрирован: 28.08.2019

Помогите усыпить  LGT8F328P_SSOP20 (светик по питанию и стабилизатор выпаял). Ток потребления не опускается ниже 3мА.

#define PRR1  (*((volatile unsigned char *)0x64))
#define SMCR  (*((volatile unsigned char *)0x53))

void setup() {
  pinMode(13, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(9, LOW);
  PRR = 0xFF; //отключении периферии
}

void loop() {
  // в режим DPS2
  SMCR |= (1 << 1);  SMCR |= (1 << 2);  SMCR |= (1 << 3);
  SMCR |= (1 << 0); //SLEEP
  delay(100);
  digitalWrite(13, HIGH);   
  delay(3000);  
}

 

Домосед
Домосед аватар
Offline
Зарегистрирован: 18.09.2019

Chon пишет:
Помогите усыпить  LGT8F328P_SSOP20  в режим DPS2

Может это из даташита поможет:
"Перед использованием режима DPS2 программное обеспечение

- устанавливает IOCWK для включения требуемого входа IO
- или включает LPRC через регистр DPS2R и настраивает период пробуждения,

- затем включает режим DPS2 через бит DPS2EN в регистре DPS2R. 

После настройки программное обеспечение должно
- установить режим спящего режима DPS2 через регистр SMCR,
- а затем выполнить команду SLEEP для перехода в спящий режим."

Домосед
Домосед аватар
Offline
Зарегистрирован: 18.09.2019

Вести с кварцевых полей.
Вышеименованная Arduino Nano Alpha LGT8F328P, избранная для опытов, с кварцем на 64 МГц типа HC-49S не завелась. Или надо было вывод на PB0 не включать? Хотя судя по осциллограмме хотела, характерные заломы 3-ей гармоники. А может мне почудилось..

В общем ВЧ кварц на 3 гармонике здесь не подходит. Одногармониковые на 64 МГц мне не попадались на глаза.
С кварцем на 48 мегагерц удалось "оцифровать" вот такой причудливый сигнал 21 Гц c DDS генератора.В общем считаю плата с камнем годные, в хозяйстве пригодятся :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Домосед, с разгоном этого МК не всё так просто как может показаться. Он действительно без труда запускается на частотах выше штатных 32 МГц, но если тщательно тестировать чтением/записью с флеша, всякими тяжёлыми математическими операциями, то нет-нет да и сбойнёт. Так что разгонять его если и есть смысл, то только в экспериментальных целях.

Домосед
Домосед аватар
Offline
Зарегистрирован: 18.09.2019

dimax пишет:
Так что разгонять его если и есть смысл, то только в экспериментальных целях.

Как писал Поэт - "И опыт сын ошибок трудных".. Тут дело такое, пока зуд сам не пройдет, расчесывание только усугубляет течение "болезни"

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

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

 Через телефон  эти платки (на этом клоне) программироваться  не захотели, возможно они не знают такой VID PID  CH340 без кварца, странно зачем надо было делать  разные  ID  микросзем если  отличия лишь в букве,  очень не  грамотное  китайское решение.

 

В целом  чипы оказались бесперспективными из-за   стремного АЦП, тем более  что  китаезы обманули  с разрядностью, она указана с учетом оверсемплинга. У производителя который так  пытается нае.-ть покупателя я  ничего брать не  буду.

Конечно чипы  значительно  гибче  atmega328, это лично меня сильно манит до сих пор.

Домосед
Домосед аватар
Offline
Зарегистрирован: 18.09.2019
yuhenotix@2p-mail.com пишет:
В целом чипы оказались бесперспективными из-за ;стремного АЦП, тем более; что китаезы обманули; с разрядностью, она указана с учетом оверсемплинга. У производителя который так пытается нае.-ть покупателя я ничего брать не буду.</p>
Правильно не берите, цены меньше будут. :D
И причем здесь оверсемплинг?
Сегодня занялся изучением ADC LGT8F.. Набросал простенький скетч без analogRead() подал  5 mV на А4 и был удивлен диким смещением оцифровки, причем имеющим плавающее значение.  C analogRead() проблем нет :O
Из даташита:
23.2.6.  Калибровка смещения АЦП  
Из-за изменений в производственном процессе и присущих характеристикам 
структуры схемы внутренняя схема компаратора АЦП будет производить разные 
уровни ошибки смещения.  Поэтому компенсация напряжения смещения имеет 
решающее значение для создания высокоточной структуры преобразования АЦП.   
АЦП внутри чипа LGT8FX8P поддерживает интерфейс, связанный с 
напряжением смещения, который может использоваться для завершения измерения 
и калибровки смещения.  ..

Смотрю Атмеловский wiring_analog.c

int analogRead(uint8_t pin)
{
	uint8_t low, high;
	...
	// start the conversion
	sbi(ADCSRA, ADSC);
	while (bit_is_set(ADCSRA, ADSC));
	low  = ADCL;
	high = ADCH;
	...
	// combine the two bytes
	return (high << 8) | low;
}

Коротко и понятно..
Смотрю LGT8F wiring_analog.c

int analogRead(uint8_t pin)
{
	uint16_t adcVal = __analogRead(pin);
	return adcVal;	
}
int __analogRead(uint8_t pin)
{
	uint16_t pVal;
	uint16_t nVal;
	// enable/disable internal 1/5VCC channel
	ADCSRD &= 0xf0;
	if(pin == V5D1 || pin == V5D4) { 
		ADCSRD |= 0x06;
	}	
        ...
	sbi(ADCSRC, SPN);
	nVal = adcRead();
	cbi(ADCSRC, SPN);
	pVal = adcRead();
	pVal = (pVal + nVal) >> 1;
	pVal -= (pVal >> 7);
	return pVal;
}
uint16_t adcRead()
{
	volatile uint8_t tmp = 0;
	// start the conversion
	sbi(ADCSRA, ADSC);
	// ADSC is cleared when the conversion finishes
	while (bit_is_set(ADCSRA, ADSC));
	// read low byte firstly to cause high byte lock.
	tmp = ADCL;
	return (ADCH << 8) | tmp;
}

И получается в analogRead() два замера с переключением входной полярности внутреннего компаратора, с последующим "усреднением" и компенсации смещения. Разряды преобразования то честные - 12. При этом правда теряем динамический диапазон и на референсе 4.096V будем иметь предел измерений например 3V.

Опробую еще дифференциальный усилитель, как разберусь как его включать.

 

Домосед
Домосед аватар
Offline
Зарегистрирован: 18.09.2019

Пример использования дифференциального усилителя в блоке ADC. Усиление х16, инвертирующий вход на gnd, неинвертирующий на А0, через мультиплексор. Присутствует напряжение смещения нуля зависящее по меньшей мере от коэф.усиления, соответственно его необходимо учитывать. Определяется замыканием входа на землю. Подавал на вход А0 4.4mV с RR делителя. Напряжение контролировал мультиметром XB-868.

#include "lgtx8p.h"
#define sbi(x,y) (x|=1<<y)
#define cbi(x,y) (x&=~(1<<y))
#define offset 440 // смещение нуля экспериментально

void setup() {
  //pinMode(A0, INPUT);
  Serial.begin(9600);
  ADCSRA=1<<ADEN 
    | 1<<ADPS0 | 1<<ADPS1 | 1<<ADPS2; // clk/8
  ADCSRB=0; ADCSRC=0;
  ADMUX=1<<REFS0 | 1<<REFS1 ; // A0, Vref 1V024
  DAPCR=0b11011000;    // усиление 16 по A0 входу
  ADCSRC|=1<<1;        // подключить ADC к диф.усилителю
}
void loop() {
  uint16_t adcVal;
  sbi(ADCSRA, ADSC);
  while (bit_is_set(ADCSRA, ADSC));
  adcVal = ADC - offset; // смещение нуля
  Serial.print(adcVal);
  Serial.print(" map -> mV ");
  Serial.println(
    map(adcVal, 0, 4095, 0, 1023)/16.0); 
  delay(500);
}
Думаю результат вполне удовлетворительный.
 

 

 

Green
Онлайн
Зарегистрирован: 01.10.2015

Домосед, мужики плюются от диф АЦП АVR. Говорят что редкая дрянь из за жуткого дрейфа нуля. И даже в документации написано, что для диф режима гарантируется точность не 10, а 8 бит.
Хотя, может быть китайские инженеры чего нибудь улучшили...

Домосед
Домосед аватар
Offline
Зарегистрирован: 18.09.2019

Мужики не зря плюются. До кучи ещё и входа диф.усилителя на Gnd до конца программно не прожимаются - компенсацию температурного дрейфа толковую не сделать..

Подключил таки К термопару, но точность +- 10гр. Ж(

---
Нет, вру.. 40uV на 1градус у термопары, итого.. в общем на пару градусов брешет.

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

Да, я  перепутал с этим чипом: 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

GennadyK
Offline
Зарегистрирован: 30.07.2020

Здравствуйте. Второй день ковыряю Pro Mini Alpha LGT8F328P-SSOP20 и читаю ветку данного форума. Много нового узнал, но в некоторых темах совершенно не разбираюсь. Прошу помощи и не кидать тапками, только сегодня узнал что такое регистры и работа с портами напрямую. Многого еще не понимаю. Пытаюсь сделать 1й пин программируемым (по умолчанию на нем reset)

Делаю следующее в setup. Но не могу прошить - плата зависает. Правильные ли регистры я прописал - это первый вопрос. И как обойти обработку этого пина при прошивке? По задумке на нем должен светиться управляемый светодиод (подключен с резистором).

PMX2= 1<<WCE; //разрешаем изменения регистра IOCR в ближайшие 6 тактов
PMX2= 1<<C6EN; //отвязываем reset от первого пина
DDRC= 1<<7; //назначаем порт на выход

upd: поправочка, reset все же отвязался. Но, в том числе, и набортная кнопка. Поэтому и перепрошить не получается. В этой плате перед заливкой скомпилированного скетча нужно как раз удерживать reset. А программатор у меня без DTR-контакта. Ребята, как быть?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

GennadyK, вместо ресета дёргать питание, тот же эффект по идее. Главное не притяните ресет к земле вашим светодиодом, иначе МК в принципе не запустится.

GennadyK
Offline
Зарегистрирован: 30.07.2020

Не, не срабатывает. Выпадает с ошибкой подключения:

avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x30

Питание снимаю, отомкнув черный и красный провод с программатора - он у меня в виде usb-шнурка

Домосед
Домосед аватар
Offline
Зарегистрирован: 18.09.2019

GennadyK пишет:
Не, не срабатывает. Выпадает с ошибкой подключения:

avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x30


Сталкивался с подобным, правда PC6 не ремапил, пришлось перепрошивать загрузчик по SWD интерфейсу через нану.
Судя по всему там там загрузчик слишком мало ждет загрузки скетча и запускает сразу user aplication. У меня в скетче был постоянный вывод в Serial, ставлю между сессиями вывода delay(), проблемы с загрузчиком пропадают. И самое интересное помогала иногда загрузка Blink :O

GennadyK
Offline
Зарегистрирован: 30.07.2020

Победа.

В общем, надо было вырубить питание перед загрузкой и зажать reset. Не отпуская его, врубить питание. И отпустить только когда скетч будет готов к загрузке.

P.S. Кстати, возвращал к жизни тоже blink'ом))

SieOK
Offline
Зарегистрирован: 29.03.2018

alex_r61 пишет:

Война клонов?  Или китайцы выпустили один клон и тиражируют его

в разных вариантах. Давно купил MD-328D, но руки до него так и не дошли.

Уже давно и не один клон. Чего стоит продукция RobotDyn.

Не понимаю зачем эксперименты с LGT8F328P, потратить уйму времени, лучше за это время изучить линейку STM8, 32.

Тоже купил сего зверька только в корпусе SSOP20. https://3v3.com.ua/product_8179.html Там же на странице ссылка на пакет аппаратной поддержки и PDF документация (правда на китаезском, если кто переведет огромное спасибо)

Но у меня была для этого серьезная мотивация - планировалось снятие контроллера и впаивание его в плату пульта радиоуправления моделями (там стоит неизвестный контроллер SSOP20, но уже есть плата, разводка питания, два джойстика, светодиоды и кнопки управления, плюс все это в корпусе с отсеком для батареек).

Всё это для автоматики рыболовного кораблика на nRF24L01 с дальностью до 1 километра

QuickWitted
Offline
Зарегистрирован: 30.08.2020

Зверька пока не покупал и заранее хотелось бы выяснить два момента

1) А что у этих процессоров с лок фусе битами? Есть ли на них описание?
в программаторе они упоминаются.
  param.lockbytes  = buff[6];
  param.fusebytes  = buff[7];

2) скачав исходники провел поиск в них по UCSR и не нашел таблички присвоения
inc файла с Register/Bit Definitions for the LGT8F328P
сами регистры используются. Откуда его выдрать можно?

3) Кто нибудь пользовался программатором?
"Новая версия скетча-программатора с поддержкой LGT8F328P  оказывается вышла 2 месяца назад. Кто проверит отпишитесь."
На лог заливки посмотреть можно?

QuickWitted
Offline
Зарегистрирован: 30.08.2020

Сам спросил - сам отвечаю
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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

"Так же отремаппить можно и выход таймера OC3A, который сидит на пине Txd, и так же страдает от резистора" как???

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ua6em,

PMX0= 1<<7;//разрешить ремаппинг
PMX1= (1<<C3AC);
 

Ловить на PD6, причём в данном режиме переводить PD6 в OUTPUT категорически запрещено, иначе будет к.з   т.к. сигнал OC3A будет выводится не на сам PD6, а на запараллеленый ему физически вход компаратора. В общем там всё запутанно :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

ua6em,

PMX0= 1<<7;//разрешить ремаппинг
PMX1= (1<<C3AC);
 

Ловить на PD6, причём в данном режиме переводить PD6 в OUTPUT категорически запрещено, иначе будет к.з   т.к. сигнал OC3A будет выводится не на сам PD6, а на запараллеленый ему физически вход компаратора. В общем там всё запутанно :)

проще наверно резисторы и светодиоды оторвать

QuickWitted
Offline
Зарегистрирован: 30.08.2020

Выше просили отписываться о проверке программатора.

Купил плату на которой написано LGT8F328P SSop20
Заливал в нее прошивку через самодельный программатор с гитхаба
(делал из Nano V3)

SSop20 так же пишется как и плата с процом в корпусе LQFP
после залива прошивка работает...

и так же при попытке чтения прошивка с него слетает...
(читаются одни FF).

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

QuickWitted, да я позже сам проверял -всё ок, -lgt8f328p шьётся и читается новым прошивальщиком без проблем. Помню, что вешал пулл-ап резисторы на swd шину как советовали, и добавлял в файл LGT-аддона Progammers.txt строчки о программаторе "Arduino as ISP". Почему-то по умолчанию его там не было. Там кстати можно в скетче задействовать три выхода под отладочные светодиоды, тогда при включении "программатора" они каждый по очереди подмигивают, а при прошивке 2 из них мигают. 

PS: хотя вру, читать записанную прошивку я не пробовал. Но она вливается, это самое главное :)

QuickWitted
Offline
Зарегистрирован: 30.08.2020

dimax пишет:
PS: хотя вру, читать записанную прошивку я не пробовал. Но она вливается, это самое главное :)

Как по мне главное наличие лок битов или невозможность студентам считать (скопипастить за вечер) собранный девайс.

Так он читается (и я что то не так делаю) или нет (и это замена лок битов)?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

QuickWitted, поскольку в даташите про программирование через SWD нет ни слова, то можно только гадать. Есть там лок-биты или нет. Мне кажется более вероятным что инженер из logicgreen скетч программатора просто не тестировал на чтение, и где-то в программе есть косячок. По хорошему нужно написать об этом на https://github.com/LGTMCU/LarduinoISP/issues , создать new issue, и описать проблему.

QuickWitted
Offline
Зарегистрирован: 30.08.2020

dimax пишет:
Мне кажется более вероятным что инженер из logicgreen скетч программатора просто не тестировал на чтение, и где-то в программе есть косячок.

чтение при верификации работает...
Или по простому чтение СРАЗУ после записи = работает
А самостоятельное чтение - сносит прошивку.

чтение

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.08s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as FF
avrdude: safemode: efuse reads as FF
avrdude: reading flash memory:

Reading | ################################################## | 100% 20.34s

avrdude: Flash is empty, resulting file has no contents.
avrdude: writing output file "D:\MaK.hex"

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as FF
avrdude: safemode: efuse reads as FF
avrdude: safemode: Fuses OK (E:FF, H:FF, L:FF)

avrdude done.  Thank you.

и запись

 

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as FF
avrdude: safemode: efuse reads as FF
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be perfo
ed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "D:\AvrAsm\ALGT328\main.hex"
avrdude: writing flash (314 bytes):

Writing | ################################################## | 100% 0.35s

avrdude: 314 bytes of flash written
avrdude: verifying flash memory against D:\AvrAsm\ALGT328\main.hex:
avrdude: load data flash data from input file D:\AvrAsm\ALGT328\main.hex:
avrdude: input file D:\AvrAsm\ALGT328\main.hex contains 314 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.24s

avrdude: verifying ...
avrdude: 314 bytes of flash verified
avrdude: reading input file "0x3f"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x3f:
avrdude: load data lock data from input file 0x3f:
avrdude: input file 0x3f contains 1 bytes
avrdude: reading on-chip lock data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lock verified

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as FF
avrdude: safemode: efuse reads as FF
avrdude: safemode: Fuses OK (E:FF, H:FF, L:FF)

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

QuickWitted, попробовал прочесть МК. Действительно стоит один раз прочесть, и всё, залитая программа больше не работает. Даже не обязательно считывать прошивку, достаточно просто обратится к МК, и всё..

F:\>avrdude.exe -pm328p -cstk500v1 -PCOM4 -b19200

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.05s

avrdude.exe: Device signature = 0x1e950f

avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.

После этой команды залитый предварительно блинк уже не мигает. 

QuickWitted
Offline
Зарегистрирован: 30.08.2020

Просили не цитировать.
На 1 странице вопрос
>А как он по совместимости с Atmega328 на уровне регистров? Хотябы обратной?

Ответ был
>я каждый регистр не сверял :)  думаю обратно совместимы, хотя какие-то нюансы скорее всего есть.

После моего подробного копания выяснилось что 99% регистров лежит там же где и у АВР
новые регистры напиханы в свободных местах между старыми, НО!!! (согласно датащиту)
1) у них другой размер таблицы прерываний.
2) у них другой алгоритм чтения H регистров. В начале L потом Nop и только потом H.
3) у аппаратных модулей есть доп регистры которые не мешало бы настроить

Как итог
Прошивка - помигать светодиодом - за исключением сдвижки таблицы прерываний 1 в 1
Но прошивки использующие аппаратные части (например таймер регистры которого для обращения требует нопа) - скорее всего не заведуться. Лечится и то не всегда - пересборкой из исходников под эту плату.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

QuickWitted пишет:

2) у них другой алгоритм чтения H регистров. В начале L потом Nop и только потом H.

Если речь про регистры таймера, то нопы между операциями нужны только когда таймер работает в турбо-режиме (на тактовой 64 МГц).

QuickWitted
Offline
Зарегистрирован: 30.08.2020

dimax пишет:
Если речь про регистры таймера, то нопы между операциями нужны только когда таймер работает в турбо-режиме (на тактовой 64 МГц).

Не прокоментируете тогда почему остальные выше писали для таймера который не умеет 64м ?
 

 OCR3AH=r3ah;          // Важно, вначале необходимо загрузить верхний регистр!!!
 OCR3AL=r3al;          // затем нижний
                       // Нельзя как для Atmega328 -  OCR3A = topValue;

Как по мне так как нужен или ноп или за это время присвоить значение регистру.
И пару раз писали что у некоторых H по их менеию обнуляется... а по моему просто не записывается.
 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

QuickWitted, это подкол от автора "ядра". Я вроде писал про это где-то.  В файлике lgtx8p.h написано вот это:

#define OCR3A	(*((volatile unsigned char *)0x98))
#define OCR3AL	(*((volatile unsigned char *)0x98))
#define OCR3AH	(*((volatile unsigned char *)0x99))

Т.е. когда ты читаешь OCR3A  то думаешь, что получишь 16 бит, но отдаётся тот-же самый младший char. Надо как минимум поменять на uint16_t , что б отдавалось слово. Или ещё лучше заюзать специальный авр-овский макрос, так будет более корректно.  

#define OCR3A     _SFR_MEM16(0x98)


 

gaalx
Offline
Зарегистрирован: 07.02.2018
Новая версия скетча-программатора с поддержкой LGT8F328P  https://github.com/LGTMCU/LarduinoISP.
Пробовал под 7х32 и 10-ке, на Arduino 1.8.7 и 1.8.12. 
На 1.8.13 не пошла ( не смог выбрать программатор arduino as ISP). Заливал в Nano и Uno. аддон использовал https://github.com/dbuezas/lgt8fx.
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Logik пишет:

DetSimen пишет:

Хотя, я не профессионал, надо у взрослых спросить.

Небыло. Они в разных сегментах памяти потому и не работает. Код по адресу 0х1234 и данные на таком же адресе - две большие разницы, хотя указатели численно и равны будут. Компилятор их в разные сегменты сует. Для МК это какбыдаже очевидно - одно во флеше другое ОЗУ. У ПК оба в ОЗУ, а сегменты разные.

забрёл случайно на старую запись, если файл типа COM то там один адрес для всех сегментов, потому и программа не могла быть более 64кб

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

можно было и exe в один сегмент запхать, если указать модель компиляции tiny (или small)