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

Обсуждаем контроллеры компании Atmel.
Ответить
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

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

Сообщение OKF »

Код: Выделить всё

#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 раз.
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Благодарствую. Вроде годный пример.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7080
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

Не уверен, в тему ли... т.к. тут не совсем про периферию, но и про неё тоже...
Спойлер

Код: Выделить всё

//бинарная математика
#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" пойдут? и для чего они?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Эиком - электронные компоненты и радиодетали
OKF
Это не хвост, это антенна
Сообщения: 1445
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4307671#p4307671"]OKF, не очень понял, а куда "H" и "L" пойдут? и для чего они?[/uquote]
Активный уровень. Типа:
on(LED); //и пофигу как он подключен - к плюсу или общему.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7080
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

Понял, эта часть пока не описана...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1445
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4307687#p4307687"]Понял, эта часть пока не описана...[/uquote]
А вот это уже "додумаете сами"). Вообще, коль demiurg постоянно кичится тем что тусуется на электрониксе, сахаре и пр. проф форумах уж должен знать об Аскольде Волкове. Или нет?
Поставщик валерьянки для Кота
Сообщения: 1948
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

if(!QF(BUTTON)) SF(Btn_s_p); //если нажата кнопка - взведем флаг нажатия
... и впоследствии изо "всех сил" пытаемся добавить метод "устранения дребезга" :).

Некоторое время назад я пытался таким же образом "автоматизировать" писание кода с много #define, теперь: только при необходимости. В противном случае перенос кода в другой проект начинается с бесконечной кастомизации, почти равносильной написания нового кода. Даже больше теряю время: есть изначально: "что я имел в виду для кода в #define напр. 1-5 лет назад?" Поэтому используем шаблоны, но только если они нам нужны :).
Контактная информация:
OKF
Это не хвост, это антенна
Сообщения: 1445
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Ну да. А для некоторых МК нет С++ и шаблонов соответственно и чо?
Ну ежели придуман препроцессор, то зачем то это, всё таки, нужно? И он (препроцессор) есть везде!
Друг Кота
Аватара пользователя
Сообщения: 7080
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

veso74, это только как пример применения... для кнопок с подавлением дребезга, опознанием комбинаций и различием короткого нажатия/удержания у меня используется другая библиотека... может выложу позже, если оформлю красиво... (она у меня кусками по проектам таскается т.к. в основном последнее время на тини13 сижу и ради экономии места её постоянно урезаю...)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
OKF
Это не хвост, это антенна
Сообщения: 1445
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

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

Вернуться в «AVR»