Используем LGT8F328P вместо атмеги

Post Reply
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Используем LGT8F328P вместо атмеги

Post by UR5FFR »

После аццкого подъема цен на микропроцессоры я таки решил посмотреть в сторону китайских клонов 328й атмеги.
Внезапно, но это не просто клон, а улучшенная версия. Список отличий есть в сети и я не буду на нем заострять внимание. Тут больше буду писать про то, как задействовать этот контроллер вместо 328й атмеги.

Вначале в ардуино IDE надо установить ядро. Для этого заходим в настройки среды (Файл->Настройки) и добавляем следующий путь в поле "Дополнительные ссылки для Менеджера плат":
https://raw.githubusercontent.com/dbuez ... index.json

Далее выбираем Инструменты->Плата->Менеджер плат, в поиске пишем lgt8f, выбираем ядро и устанавливаем.
Вся прорцедура так же описана с картинками тут: https://github.com/dbuezas/lgt8fx

Нюансы начались сразу же :) Ядро поддерживает платы с установленным кварцем на 32MHz. Либо позволяет выбрать внутреннее тактирование. Мне с али приехали платы с установленным кварцем на 16МГц. Естественно если выбрать 32МГц при прошивке то все тайминги будут некоректные. И компорт работать тоже не будет.
Лечится либо переключением на внутреннее тактирование. Либо использованием внешнего тактирования но с указанием прескалера. При этом в настройках платы надо выбрать Clock равным 16МГц и внешнее тактирование, а в начале setup() указать прескалер

Code: Select all

void setup() {
  clock_prescale_set(clock_div_1);
  ...............
}
ADC имеет разрядность 12бит вместо привычных 10бит в атмеге. Соответственно максимальное значение которое он возвращает - 4096 а не 1024. Для совместимости в коде можно использовать такую конструкцию

Code: Select all

  int val = analogRead();
  #ifdef __LGT8F__
    val >>= 2;
  #endif
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Re: Используем LGT8F328P вместо атмеги

Post by UR5FFR »

LGT8F имеет внутрение референсы для ADC. Но в переключении в DEFAULT присутствует баг. Правится добавлением строки ADCSRD = 0x00;

Code: Select all

  analogReference(INTERNAL4V096);
  int new_value = analogRead(pin);
  analogReference(DEFAULT);
  ADCSRD = 0x00;
UR5FFR
Site Admin
Posts: 2187
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Re: Используем LGT8F328P вместо атмеги

Post by UR5FFR »

В Visual Studio Code ставим Platformio и создаем для проекта конфиг с платформой lgt8f. Не забываем добавить параметр FCPU и прописать там правильное значение. В итоге в platformio.ini будет что-то такое

Code: Select all

[env:nanoatmega328]
platform = atmelavr
board = nanoatmega328
framework = arduino
lib_extra_dirs = С:\........\Arduino\Libraries

[env:lgt8f]
platform = lgt8f
framework = arduino
board = LGT8F328P
board_build.f_cpu = 16000000
lib_extra_dirs = С:\........\Arduino\Libraries
lib_extra_dirs прописываем руками путь к библиотекам ардуины иначе не найдет
Post Reply