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

Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 08:41:16

Всем привет. Хотел попросить вас поделиться библиотеками, примерами применения макросов для работы с IO AVR. На данный момент мне каждый раз приходится тщательно прописывать каждый используемый пин. Если у вас есть инструменты для облегчения этого процесса просьба поделиться библиотеками и примерами применения. Также, обоснования применения примеров, подходов. Плюсы, минусы.
Считаю, что данный топик будет полезен не только мне, предварительная просьба не засорять данный топик флудом, перепалками. "У кого короче".
Сложности кода не боимся, если есть примеры на плюсах, тоже интересно. В качестве примера для подхода.
Последний раз редактировалось Demiurg Пт окт 21, 2022 09:32:01, всего редактировалось 1 раз.

Re: Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 09:21:49

Код:
#define _out(port,bit,...)        (DDR##port |= 1<<bit)
#define out(x)                    _out(x)

#define _in(port,bit,...)         (DDR##port &= ~(1<<bit))
#define in(x)                     _in(x)

// поправил

#define LED                      B,5,H
#define KEY                      D,2,L

  out(LED);
  in(KEY);
Последний раз редактировалось OKF Пт окт 21, 2022 10:10:42, всего редактировалось 1 раз.

Re: Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 09:27:06

Благодарствую. Вроде годный пример.

Re: Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 11:10:47

Не уверен, в тему ли... т.к. тут не совсем про периферию, но и про неё тоже...
Спойлер
Код:
//бинарная математика
#define SB(b,n)    b|= (1<<n)    //установка бита
#define CB(b,n)    b&=~(1<<n)    //сброс     бита
#define IB(b,n)    b^= (1<<n)    //инверсия  бита
#define QB(b,n)    (b&(1<<n))    //проверка  бита
#define SF(x)      SB(x)         //установка флага
#define CF(x)      CB(x)         //сброс     флага
#define IF(x)      IB(x)         //инверсия  флага
#define QF(x)      QB(x)         //проверка  флага

//описание флагов
register uint08_t Flag0 = 0;//переменная с флагами
#define div10_u   Flag0,0   //напряжение > 9.99 вольт
#define div10_i   Flag0,1   //ток        > 9.99 ампер
#define mode_cv   Flag0,2   //идет стабилизация по напряжению
#define OnBlnk    Flag0,3   //мигание
#define Btn_s_p   Flag0,4   //зафиксировано нажатие кнопки
#define Btn_l_p   Flag0,5   //зафиксировано длинное  нажатие кнопки

//описание периферии
#define BUZZER PORTB,0
#define BUTTON  PINB,1

//.............
//работа с битами
CB(DDRB,1);
SB(PORTB,1);
SB(DDRB,0);
//так можно до любого бита добраться, а если ему дать своё имя, то можно будет работать как с флагом:

//работа с флагами
while(1){
if(!QF(BUTTON)) SF(Btn_s_p); //если нажата кнопка - взведем флаг нажатия
if(QF(Btn_s_p)) IF(BUZZER);  //если есть флаг - пищим, постоянно перекидывая порт динамика
}
начало взял из имеющейся задачи, а далее с коментария "описание периферии" пришлось придумывать...
удобство в работе с флагами и периферией в полной мере проявляется в случае если придётся менять привязку имен - в этом случае достаточно изменить только дефайн... (ну, ещё у портов DDRки поправить... их, конечно тоже можно вынести в начало, но я не уверен, что оптимизатор инициализацию портов, описанную в произвольном порядке поймёт правильно).

Добавлено after 3 minutes 50 seconds:
OKF, не очень понял, а куда "H" и "L" пойдут? и для чего они?

Re: Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 11:42:40

OKF, не очень понял, а куда "H" и "L" пойдут? и для чего они?

Активный уровень. Типа:
on(LED); //и пофигу как он подключен - к плюсу или общему.

Re: Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 12:03:13

Понял, эта часть пока не описана...

Re: Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 12:17:38

Понял, эта часть пока не описана...

А вот это уже "додумаете сами"). Вообще, коль demiurg постоянно кичится тем что тусуется на электрониксе, сахаре и пр. проф форумах уж должен знать об Аскольде Волкове. Или нет?

Re: Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 12:20:50

if(!QF(BUTTON)) SF(Btn_s_p); //если нажата кнопка - взведем флаг нажатия

... и впоследствии изо "всех сил" пытаемся добавить метод "устранения дребезга" :).

Некоторое время назад я пытался таким же образом "автоматизировать" писание кода с много #define, теперь: только при необходимости. В противном случае перенос кода в другой проект начинается с бесконечной кастомизации, почти равносильной написания нового кода. Даже больше теряю время: есть изначально: "что я имел в виду для кода в #define напр. 1-5 лет назад?" Поэтому используем шаблоны, но только если они нам нужны :).

Re: Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 12:32:48

Ну да. А для некоторых МК нет С++ и шаблонов соответственно и чо?
Ну ежели придуман препроцессор, то зачем то это, всё таки, нужно? И он (препроцессор) есть везде!

Re: Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 12:42:57

veso74, это только как пример применения... для кнопок с подавлением дребезга, опознанием комбинаций и различием короткого нажатия/удержания у меня используется другая библиотека... может выложу позже, если оформлю красиво... (она у меня кусками по проектам таскается т.к. в основном последнее время на тини13 сижу и ради экономии места её постоянно урезаю...)

Re: Макросы, библиотеки, примеры для работы с IO AVR

Пт окт 21, 2022 13:59:05

Обычно макро используется для в/в. Это удобно.
С тем что бы отделить физику от логики. Большего применения я не вижу.
Т.е., в хедере описал в/в, а в .с описываешь ни от чего не зависимую логику. А затем легко и просто переносишь на другую платформу. Именно для этого и придумали высокоуревневый язык. Однако многие об этом забывают, или используют Си по недомыслию (ограниченного мысления, то бышь).
Ответить