Обсуждаем контроллеры компании Atmel.
Ответить

AVR128DA28 - кто сталкивался?

Ср фев 09, 2022 23:50:58

А есть тут кто сталкивался уже с новой серией АВРов новой серии ?
Кодинг сильно отличается от старых мег?
Чем прошивать и к каким пинам цеплять программатор?

Re: AVR128DA28 - кто сталкивался?

Вс фев 13, 2022 17:31:58

Чем прошивать и к каким пинам цеплять программатор?

А что на этот счёт даташит говорит?

Re: AVR128DA28 - кто сталкивался?

Ср фев 23, 2022 16:29:31

Кодинг сильно отличается от старых мег?
Чем прошивать и к каким пинам цеплять программатор?


Приветствую!
Сам заинтересовался новой линейкой микроконтроллеров
Купил себе (вчера) попробовать плату AVR128DA48 Curiosity Nano.
Что касается прошивки. Прошивка идет по одному пину и называется это все дело UPDI программатор!
На моей плате он присутствует. Может прошивать все (память фьюзы и прочее), читать все, и вроде как внутрисхемная отладка. Работает это дело через студию.
В сети можно найти программатор из подручных средств.

Вот сейчас читаю даташит.
Отличия от меги есть. Больше регистров, больше настроек, всего больше. +Появилась гибкость переназначения функции пинов.
Пока еще сам не пробовал рулить ножками. Для управления пином предусмотрено 23 регистра :shock:

Вообще контроллер на первый взгляд интересный. Отличие от нашей меги как жигули с мерседесом :)) (И не говорите только про STM в этой ветки :) )

PS С праздников защитники! :beer:

Re: AVR128DA28 - кто сталкивался?

Чт фев 24, 2022 19:24:30

Привет!
Решил поиграться с новой игрушкой.
И по классике жанра начнем с Blink.

Начать хочется с тактирования МК. В новой AVR128DA имеется 2 встроенных генератора. На 1-24МГц и часовой. Часов (Из даташита) не очень точный. И поэтому есть ножки для подключения внешнего часового генератор. Вообще там уйма чего можно сделать с тактовым сигналом. И комбинировать это все можно как хочешь. Больше информации из картинки:
Изображение
Настроек много. И пока я не все изучил. В данном моменте нас интересует написать Blink.

Фьюзы.
В целом в них ничего не поменялось. Но исчезло все что связано с Тактовым генератором.
Теперь настройка частоты осуществляется в коде устройства. (По умолчанию МК работает на частоте 4МГц).
Нас интересует регистр OSCHFCTRLA.
Изображение
Именно в нем производится настройка частоты МК. И опять там не все просто. Есть регистры которые являются заблокированными для изменения.
Для их разблокировки нужно прописать команду в другой регистр. Эта затея не очень, так как я нашел решение получше.

Для задания частоты можно написать команду:
_PROTECTED_WRITE (CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc);
Первый аргумент это регистр, второй это значение которое мы хотим установить.

Самое прикольное что в файле ioavr128da48.h все константы определены и подписаны.

Частоту мы задали. Давайте теперь напишем Blink.
Управление портами :) Взгляните.
Изображение
DIR - Регистр управление направлением портов (Непосредственный)
DIRSET - Регистр для установки битов в DIR (Типа маски)
DIRCLR - Регистр для сброса битов в DIR (Типа маски)
DIRTGL - Регистр для инверсии битов в DIR (Типа маски)

OUT-Регистр вывода (Если порты на выход).(Непосредственный)
OUTSET -(Типа маски)
OUTCLR - (Типа маски)
OUTTGL - (Типа маски)

IN - Регистр входа (Считывает вход)
INTFLAGS - Регистр флагов прерывания. (Для сброса бит-флага, нужно записать туда 1).
PORTCTRL - Пока не знаю зачем он нужен.

PINCONFIG -Регистр конфигурации всего порта разом (Настройка сразу всех ног). Можно: включить прерывание, подтяжку резистором и настроить форму сигнала для обработки прерывания.
Изображение
PINCTRLUPD - (Типа маски)
PINCTRLSET - (Типа маски)
PINCTRLCLR - (Типа маски)

PIN0CTRL......PIN7CTRL - Тоже самое что и PINCONFIG, только можно настроить каждую ножку индивидуально.

Для чего столько всего? Как пишут в даташите это сделано ради быстродействия кода.
Когда мы обращаемся к (Непосредственным) регистрам это требуется несколько тактов.
Когда мы взаимодействуем используя (Регистры Маски) то код выполняется за 1 такт.

И БОЛЬШОЕ нововведение это то что на каждую ножку можно повесить прерывание!!!!!

Сначала классический "Полный" Код
Код:
#define F_CPU      24000000UL       
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
   _PROTECTED_WRITE (CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc); //Установка частоты
   PORTC.DIR= PIN6_bm; //Порт 6 на выход
   while (1)
   {
      PORTC.OUT|= PIN6_bm; //Установка на порте 6 лог.1
      _delay_ms(1000);
      PORTC.OUT&=~PIN6_bm; //Установка на порте 6 лог.0
      _delay_ms(1000);
   }
}

Можно и по другому:
Код:
   PORTC.DIRSET= PIN6_bm;
   while (1)
   {
      PORTC.OUTSET= PIN6_bm;
      _delay_ms(1000);
      PORTC.OUTCLR=PIN6_bm;
      _delay_ms(1000);
   }

или
Код:
   PORTC.DIRSET= PIN6_bm;
   while (1)
   {
      PORTC.OUTTGL= PIN6_bm;
      _delay_ms(1000);
   }

В общем вариаций много.
Так же нужно сказать про виртуальные порты VPORTx
Изображение
Если я правильно понял даташит, то они нужны для специфического кода программы который располагается в другой области памяти..... :shock:
Я встречал этот код в Бутлодере.... и сомневаюсь что для нас это актуально....

На сегодня как то так. Если вам интересно, то могу писать дальше свои эксперименты по этому контроллеру. :beer:
Вложения
VPORTx.PNG
(6.03 KiB) Скачиваний: 928
PINCONFIG.PNG
(45.49 KiB) Скачиваний: 934
PORT.PNG
(35.25 KiB) Скачиваний: 936
OSCHFCTRLA.PNG
(65.94 KiB) Скачиваний: 936
тактирование.PNG
(31.86 KiB) Скачиваний: 933

Re: AVR128DA28 - кто сталкивался?

Сб фев 26, 2022 10:43:42

Что то уже не получается запустить UART на этом МК.....
Ковыряюсь уже 2 дня. И Пример даже не работает от производителя :(

Re: AVR128DA28 - кто сталкивался?

Вс фев 27, 2022 12:00:09

Ситуация на данный момент такая.
UART на МК работает четко. Проблема с программатором.
На ножку микросхемы программатора сигнал UART приходит. (Проверил анализатором и ткнул в эту ножу другими usb to com преобразователем).
Я думаю что проблема в прошивке программатора. Уже создал на форуме производителя тему с описанием проблемы. Но пока ответа нет..... Буду долбить их дальше.

Надо обязательно починить программатор. Он очень годный.

Re: AVR128DA28 - кто сталкивался?

Вс фев 27, 2022 12:28:35

Поставьте буферные резисторы (470..1000 Ом) к программатору. Не будет блокировать уровни пинах.
При необходимости постаьте резисторы и на UART.

Re: AVR128DA28 - кто сталкивался?

Пн фев 28, 2022 16:22:05

Ну как обычно. Виной всему невнимательность :facepalm:

Нужно в программе мониторинга COM порта включить DTR (Готовность приемника данных). Это даже в инструкции к плате написано.
А я это проморгал..... А потом и инструкцию посеял и забыл про неё. Все в другую смотрел (Очень похожую на вид). :facepalm:

Ладно. Хорошо что все работает!
Очень кратенько. "Быстрый старт UART"
По настройкам говорить бесполезно. Их там очень много. Приведу просто список.
Изображение
С программной точки зрения особо отличий от старых МК нет.
Только чуть по другому рассчитывается скорость. (Формула работает с разными частотами кварца).
Приведу классически пример кода. Он возвращает строку что вы отправили в COM порт.
Код:
#define F_CPU                           24000000UL         
#define USART1_BAUD_RATE(BAUD_RATE)     ((float)(64 * F_CPU / (16 * (float)BAUD_RATE)) + 0.5)

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>

static int uart_putchar(char c, FILE *stream);
static int uart_getchar(FILE *stream);

static FILE mystd = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW); //Поток

int main(void)
{
   _PROTECTED_WRITE (CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc);  //Настройка частоты кварца
   
   PORTC.DIRSET = PIN0_bm;                        /* set pin 0 of PORT C (TXd) as output*/
   PORTC.DIRCLR = PIN1_bm;                        /* set pin 1 of PORT C (RXd) as input*/
   
   USART1.BAUD = (uint16_t)(USART1_BAUD_RATE(9600));   //Задаем скорость
   USART1.CTRLC = USART_CHSIZE_8BIT_gc|USART_SBMODE_2BIT_gc; //Формат: 8Бит, 2 Стоп кадра         
   USART1.CTRLB = USART_TXEN_bm|USART_RXEN_bm;         //Включить Передатчик и приемник.
   
   stdout=&mystd;
   stdin=&mystd;
   while (1)
   {
      if (USART1.STATUS & USART_RXCIF_bm)            //Проверяем наличие данных
      {
         char str[80];
         scanf("%s", str);                     //Читаем данные
         printf("%s\n", str);                  //Печатаем то что прочитали
      }

      //printf("Hello World!\n");
   }
}

static int uart_putchar(char c, FILE *stream)         //отправка данных по USART
{
   if (c == '\n') uart_putchar('\r', stream);
   
   while(!(USART1.STATUS & USART_DREIF_bm));
   USART1.TXDATAL=c;
   return 0;
}

static int uart_getchar(FILE *stream)               //чтение данных по USART
{
   while(!(USART1.STATUS & USART_RXCIF_bm));
   return USART1.RXDATAL;
}

Также хочу сказать про PORTMUX (Port Multiplexer).
Он дает возможность переключать пины периферии на альтернативные ножки. Список регистров:
Изображение
Сводная табличка по UART
Изображение
Вложения
tabl.JPG
(33.74 KiB) Скачиваний: 781
PORTMUX.JPG
(41.46 KiB) Скачиваний: 796
uart.JPG
(50.15 KiB) Скачиваний: 790

Re: AVR128DA28 - кто сталкивался?

Сб мар 05, 2022 18:58:15

Всем привет!
Продолжаю свои эксперименты с микроконтроллером AVR128DA48.
Не буду приводить больше описания из даташита, так как смысла не вижу. Я почти не пользуюсь всякими хитрыми настройками, а использую только стандартный функционал.

Сегодня I2C+DS3231
I2C знатно попил крови. :)) Регистры и последовательность действий отличается от МЕГИ. Лично мне не удалось запустить правильно шину. Все время что то отсылалось не так, либо приходили не те данные.
Мне удалось найти рабочий пример кода на забугорном форуме. Пример очень хороший! И в примере более шире раскрыт функционал I2С. Так что кому интересно изучайте. :)

Для себя я использую стандартную "Тупую" последовательность. (Без прерываний и прочего). Пока мне такого кода хватает за глаза.
Приведу код I2C.

Про переменную "ticks". Она нужна для того что бы не зависала программа если I2C устройство отсутствует или неисправно на шине.
Благодаря этой переменной можно подключать/отключать I2C устройства на "Горячую" и не волноваться что МК зависнет.

Прикладываю свой пример тестовый программы.
*Сразу скажу что я не программист, а любитель! И если вы напишете более оригенально и лучше, то не стесняйтесь! Выкладывайте!
Вложения
UART_I2C_DS3231.rar
(63.3 KiB) Скачиваний: 242

Re: AVR128DA28 - кто сталкивался?

Вс мар 06, 2022 18:56:47

Продолжаем разговор!
RTC - Real-Time Counter
Изображение
Часовой таймер.
В МК есть внутренний часовой кварц. И так же можно подключить внешний кварц. (Переключение источника тактирования осуществляется в регистре).
Внутренний кварц может выдавать стандартную частоту 32768Hz или через пределитель на 32 (1024Hz)
Далее эти такты можно разделить еще на 2;4;8;16;32;64;128;256;512;1024;2048;4096;8192;16384;32768.
Эти такты поступают в специальный счетный регистр (CNT размером 2 байта).

У часов есть 2 вектора прерывания:
Регистр (CMP размером 2 байта) - Compare Сравнение. Сгенерирует прерывания при совпадении.
Регистр (PER размером 2 байта) - Overflow Переполнение. Сгенерирует прерывания при совпадении И сбросит счетный регистр CNT.

Пример кода. Поморгаем лампочкой.
Код:
#define F_CPU 24000000UL   //Частота МК

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
   _PROTECTED_WRITE (CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc); //Настройка частоты МК

   PORTC.DIRSET= PIN6_bm; //Пин Светодиода
   
   RTC.CLKSEL = RTC_CLKSEL_OSC32K_gc; //Тактирование от внутреннего кварца 32к
   RTC.INTCTRL=RTC_OVF_bm; //Прерывание при переполнении
   RTC.CTRLA=RTC_RTCEN_bm; //Включить Таймер
   RTC.PER = 0x8000; //Совпадение и сброс 0x8000=32768Hz

   sei(); //Разрешить прерывание
   
   while (1){}
}
   ISR(RTC_CNT_vect)
   {
      PORTC.OUTTGL= PIN6_bm; //Инвертировать пин светодиода
      RTC.INTFLAGS = RTC_OVF_bm; //Сбросить флаг прерывания
   }

Так же есть одно замечание в даташите. При настройке регистров конфигурации требуется некоторое количество тактов для синхронизации. То есть внесенные изменения применяются не сразу.
Для отслеживание синхронизации есть специальный регистр и флаги. (Так что если критично то все можно отслеживать.)
Еще есть возможность корректировки ± 1 PPM - ± 127 PPM.

Про Sleep Mode. Таймер может работать в Sleep Mode при условии что установлен специальные бит в регистре настроек.

Нам осталось понять что такое PIT Таймер Периодического Прерывания
Тут вообще все просто. PIT генерирует прерывания в зависимости от количества тактов RTC
Можно выбрать из следующих значений тактов: 4;8;16;32;64;128;256;512;1024;2048;4096;8192;16384;32768.
PIT работает в любом спящем режиме.

Пример кода.
Код:
#define F_CPU 24000000UL   //Частота МК

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
   _PROTECTED_WRITE (CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc); //Настройка частоты МК

   PORTC.DIRSET= PIN6_bm; //Пин Светодиода

   RTC.CLKSEL = RTC_CLKSEL_OSC32K_gc; //Тактирование от внутреннего кварца 32к
   RTC.PITCTRLA=RTC_PITEN_bm|RTC_PRESCALER_DIV16384_gc; //Включить PIT + Каждые 16384 такта
   RTC.PITINTCTRL=RTC_PI_bm; //Включить прерывания PIT
   sei(); //Разрешить прерывание
   
   while (1){}
}
   ISR(RTC_PIT_vect)
   {
      PORTC.OUTTGL= PIN6_bm; //Инвертировать пин светодиода
      RTC.PITINTFLAGS = RTC_PI_bm; //Сбросить флаг прерывания
   }

Напоследок все регистры разом.
Изображение
Вложения
reg.JPG
(57.43 KiB) Скачиваний: 700
CLK_RTC.JPG
(38.49 KiB) Скачиваний: 702

Re: AVR128DA28 - кто сталкивался?

Чт май 19, 2022 14:43:22

Приветствую!
Сам заинтересовался новой линейкой микроконтроллеров
Купил себе (вчера) попробовать плату AVR128DA48 Curiosity Nano.


Доброго дня.
А где брали? Яндекс не выдает возможности покупки.

Re: AVR128DA28 - кто сталкивался?

Пт сен 22, 2023 22:31:00

И так же можно подключить внешний кварц...

Как я понял, можно подключить только кварц на 32 кГц, а кварц, скажем, 4 МГц уже не подключить.

Re: AVR128DA28 - кто сталкивался?

Вт сен 26, 2023 19:53:09

Как я понял, можно подключить только кварц на 32 кГц, а кварц, скажем, 4 МГц уже не подключить.


Я пока бросил заниматься микроконтроллером. Его негде не купить.
А что касается вопроса, то его лучше уточнить в даташите.

Re: AVR128DA28 - кто сталкивался?

Вс окт 08, 2023 21:39:14

Я пока бросил заниматься микроконтроллером. Его негде не купить.
А что касается вопроса, то его лучше уточнить в даташите.

Разбирался с AVR32DA32-I/PT из аналогичной серии, покупал в ЧипДипе за 200 рублей. Нужны были несколько штук USART и SPI в одном корпусе, они там есть.
МК и сейчас можно купить, но несколько дороже.
Интересные МК с хорошо развитой периферией. Регистров для работы с периферией около 550 штук. Корпус легкопаяемый в домашних условиях.
Скорее всего, будет неплохая возможность для отладки, поскольку можно просматривать SRAM при работе.
Начал делать проект, где задействованы пара USART, один, как обычно, с компьютером, второй с другим устройством. Всё работает, понравилось.

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