Привет!
Решил поиграться с новой игрушкой.
И по классике жанра начнем с
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
Если я правильно понял даташит, то они нужны для специфического кода программы который располагается в другой области памяти.....
Я встречал этот код в Бутлодере.... и сомневаюсь что для нас это актуально....
На сегодня как то так. Если вам интересно, то могу писать дальше свои эксперименты по этому контроллеру.