Работа с портами пинам. Макросы, X-macro

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

Сообщение Demiurg »

Всем привет. Вы все меня знаете. Давно работаю с МК AVR. Приверженец автоматного программирования. Конечные автоматы. Всплыл момент. Систематизация опыта и практики. Детали позже.
На данный момент. Я сейчас в регионе с ограниченным доступом к инету.
Мне нужны материалы по работе с портами AVR. Макросы, X-macro.
Типа:
name
port
pin
KEY_COD 0
Вместо PORTA A
activ_level LOW HIGH
Пишем KEY_COD, A, 3, LOW
Контактная информация:
Реклама
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Demiurg писал(а): Сб июн 20, 2026 15:47:50 Вы все меня знаете.
Я не знаю
Demiurg писал(а): Сб июн 20, 2026 15:47:50 Детали позже.
Океюшки.
Demiurg писал(а): Сб июн 20, 2026 15:47:50 Пишем KEY_COD, A, 3, LOW
Это чето странное.

В общем случае на языке С запись в регистр микроконтроллера сводится к записи по указателю. Например, *(volatile uint8_t*)0x15 = 0x45; Чтение из регистра - аналогично, только наоборот.

Продвинутая работа с макросами основана на параметрах макроса:

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

#define SUM(a, b) a + b
int c = SUM(5, 7);
Особый вид извращения - конкатенация в макросе:

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

#define INT_SUM(a, b) a + b
#define CHAR_SUM(a, b) a + b
#define SUM(a, b, TYPE) TYPE##_SUM(a, b);
c = SUM(7, 8, INT);
c = SUM(7, 8, CHAR);
"Детали позже"(С) :))

С другой стороны, чем проще и прозрачнее написано, тем лучше. Особо большой вред от конкатенации в макросе, поскольку имена получаются неявно, в результате склеек. Приведенный выше пример показывает такую проблемку. Вобщемто, это устаревший ныне метод.
Если перейдете на С++, проблема макросов в работе с портами отпадет. Получится что-то типа такого:

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

using pa3 = GpioA::Pin3;
using pb6 = GpioB::Pin6;
pa3::Set();
pa3::Reset();
pb6::Toggle();
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1422
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Demiurg писал(а): Сб июн 20, 2026 15:47:50 Мне нужны материалы по работе с портами AVR.
Как же так? Давно в теме AVR, учился у инженеров АVR, всё умеешь, а макросов для работы с портами не знаешь? Что то не сходится...
Это не хвост, это антенна
Сообщения: 1491
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

OKF писал(а): Сб июн 20, 2026 19:08:54
Demiurg писал(а): Сб июн 20, 2026 15:47:50 Мне нужны материалы по работе с портами AVR.
Как же так? Давно в теме AVR, учился у инженеров АVR, всё умеешь, а макросов для работы с портами не знаешь? Что то не сходится...
Все сходится. И опыт ассемблера. И опыт си. Просто я пошел дальше. В данный момент я не дома. Далеко. В командировке. Связи нет. Интернета часто нет. А продумывать проекты нужно.
Обкатываю будущие идеи, проекты. Задумки
Потом поймёшь. Увидишь
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Ааа, пнятна, пнятна. Готовится прорыв. Скачок. Масштабная реновация. Гиперидея.
В принципе. Нужна лишь книжка по языку Си. Авторов Ритчи и Кернигана. Один раз скачать. И читать без инета.
Хотя макросы. Не являются "прорывной реновацией". Это, скорее, анахронизм. Морально устаревшая затея. Особенно виде "Пишем KEY_COD, A, 3, LOW".
"Потом поймешь. Увидишь"(С)

PS. Если я правильно понял "прорывную идею", то автор желает видеть что-то типа такого:

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

#define MACRO(var, KEY_CODE, PORT_LETTER, PIN, LEVEL) \
	if((PORT##PORT_LETTER & (1 << PIN)) == LEVEL) \
		var = KEY_CODE;
		
int keyCode;
MACRO(keyCode, 45, A, 3, LOW)
Реклама
Это не хвост, это антенна
Сообщения: 1491
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Готовится не прорыв. А накопленный материал. Я в свое время баловался в разных направлениях. Это и дискретная логика.. "Идеальный триггер". Это и автоматное программирование. Как слой мышления. Состояниями. И перенос парадигмы автоматного программирования на схемотехники разных уровней. Цифровая электроника, релейно-контактные схемы. Программирование.
Дело в том, что применительно к промышленному оборудованию и термины "автоматное программирование", "конечный автомат" ложится как есть. Состояния. Аварийный стоп, Стоп, Ручной режим, Полуавтомат, Автомат. Ну, примерно как то так ..
Контактная информация:
Реклама
Это не хвост, это антенна
Сообщения: 1491
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

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

#define MACRO(var, KEY_CODE, PORT_LETTER, PIN, LEVEL) \
	if((PORT##PORT_LETTER & (1 << PIN)) == LEVEL) \
		var = KEY_CODE;
		
int keyCode;
MACRO(keyCode, 45, A, 3, LOW)
Хм. Попробую...
Контактная информация:
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Demiurg писал(а): Вс июн 21, 2026 08:00:25 "Идеальный триггер"
Эт что-то новое. Действительно какой-то "прорыв". Че за идеальный триггер и на кой он нужон - х.з.
Demiurg писал(а): Вс июн 21, 2026 08:00:25 Цифровая электроника, релейно-контактные схемы. Программирование.
Эти лозунги как раз в духе времени "прорыва".
Demiurg писал(а): Вс июн 21, 2026 08:00:25 . Это и автоматное программирование. Как слой мышления. Состояниями.
Аа, теперь понятно, откуда у вас это. Отрывистое мышление. Обрывками по два-три. Слова. Состояниями. Автоматное мышление. Состояние раз. Состояние два.
Потрогал лапой паяльник
Сообщения: 300
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Rapra писал(а): Пн июн 22, 2026 03:37:41 Че за идеальный триггер и на кой он нужон - х.з.
Мне стало любопытно, и, хотя я предполагал, что это связано со скоростью и гистерезисом, всё же спросил ИИ (оказалось, есть ещё два параметра, если, конечно, нейросеть опять не наврала):
Характеристики идеального триггера:
Нулевая задержка между событием и запуском системы.
Отсутствие дребезга.
Нулевой гистерезис.
Бесконечная чувствительность.
Дребезг к чему тут - непонятно. Это же не триггера проблема.

Что-то мне подсказывает немного, что даже для ПЛИС подобное будет утопией.
Нужно использовать квантовую спутанность.
#define QUANT 0
#define QUANT 1
Идеальный квантовый триггер. Он уже переключится препроцессором. Моментально, без дребезга и т.д :)
OKF
Это не хвост, это антенна
Сообщения: 1422
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Во раздули. Гений AVR! Набери макросы Аскольда Волкова. Кажется, он даже земляк твой. Запишешь себе в плюсы тогда).
Это не хвост, это антенна
Сообщения: 1491
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Нормальная тема. RS-триггер. Инженеры всего мира решали проблему. Запрещённая строка состояния таблицы истинности. Обошли эту проблему. Изобретением других триггеров. Счётчик. С запретом счета до 1. D-триггер. JK-триггер.
Контактная информация:
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Блин, так то JK триггер, известный уже более полувека. Только это никакой не "идеальный триггер", зачем придумывать свои названия. Это синхронный RS-триггер, полученный добавлением счетного входа.

Изображение

И если внутри J и K входы, получится простой счетный D-триггер. Без каких-то там запретов счета до 1.
OKF
Это не хвост, это антенна
Сообщения: 1422
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Demiurg писал(а): Вт июн 23, 2026 00:43:03 Нормальная тема.
Спасибо не забудь сказать. А то один пафос от тебя. ППЦ!
Это не хвост, это антенна
Сообщения: 1491
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

...
В 90-е года, когда настал черед изучения цифровой электроники, я столкнулся с RS-триггерами. С этой пресловутой запрещённой строкой состояния таблицы истинности. Как было написано в одной книжке, эту проблему решали инженеры всего мира. Я пытался обойти эту проблему. Собирал схемы. Не вышло. В 2005 году мне была поставлена задача, модернизировать станок Chodos. Экструдер, выдувные изделия. Старое управление было собрано на рассыпухе, комбинационная логика. Два огромных шкафа с кучей плат с логикой.
Я когда начал, опять вернулся к проблеме RS-триггеров. Отложил в сторону, занялся другими подзадачами. В том числе, к реле времени. Начал баловаться с К561ИЕ8. Счет, схемы совпадения. И неожиданно понял, что решил проблему. Идеальный триггер. Смотрите. Вход C теперь условно вход S. Выход 0 инверсный выход, выход 1 - прямой выход. Вход запрета счета на выход 1. Вход R остаётся как есть. Асинхронный сброс.
Пожалуйста. Вот основа идеального триггера. Позже проанализировав таблицы истинности я нашел ещё два решения. D-триггер и JK-триггер.
Станок был успешно реализован я собрал что то вроде матрицы идеальных триггеров. По сути, это получилась реализация конечных автоматов на логике. Станок успешно отработал более 10 лет, пока железо не стерлось. Выкинули на свалку. Электроника осталась целой.
Контактная информация:
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Блин, Demiurg, а что, книжки почитать было не судьба чтоль? JK-триггер был придуман даже задолго до твоего рождения. Если тебе кажется, что изобрел велосипед, оглянись - быть может он уже давно придуман.
Это не такая уж сложная задача, если честно, чтобы "инженеры всего мира" над ней бились. Надо было просто читать правильные книжки.
Есть еще ассиметричный RS-триггер, у которого сигнал на S имеет приоритет
OKF
Это не хвост, это антенна
Сообщения: 1422
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Rapra, хочешь анекдот? Думаю, можно, т.к. форум едва дышит.
Году, этак, в 1981-м я решил собрать ус-во. АДКМ - Автоматический Датчик Кода Морзе. Для меня это было очень актуально. Статья была в журнале Радио. Там было порядка 40 мс и фиг знамо сколько переключателей П2К, причём многосекционных. В общем, у меня получился 3-х платный вариант, платы связаны жгутами. Но основная беда получилась с JK триггерами. А их там было, как бы не 3 штуки. Так вот. Из этих трёх правильно работал только один! При том что все были новые, но разных заводов. Этто чтотто! Я кучу нервов потратил на то что бы найти нормальные, работающие так как надо, по спецификации!!! Не помню уже подробности, но и проблема была найти КАК правильно они должны работать!) Вообще, оглядываясь назад, думаю что сейчас бы я так точно не смог. А тогда было много сил и энергии. Помнится, даже в командировке, в гостинице паял. Ужас.)
Это я к тому что не так прост JK триггер, как его малюют.)
Это не хвост, это антенна
Сообщения: 1491
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Слышь, друг. Ты докопался до меня? Жёстко ответил? Да! Ты чё до2,14бался?! Срань несусветная?
Конечно, пардон за мой хромой хранцузкий...
Не важно. Просто переоценка. Отвали моя черешня. Гуляй друг
Ты провокатор. Я хотел создать конструктивную тему. Ты пришел все обкакал? Зачем?!
Контактная информация:
OKF
Это не хвост, это антенна
Сообщения: 1422
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

И после этого ты будешь говорить что ты нормальный? Друг? Кому, чего? ППЦ! И как люди могут с таким работать? По тебе дурка плачет. Ей богу.
Модератор
Аватара пользователя
Сообщения: 19060
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Demiurg писал(а): Ср июн 24, 2026 08:50:04до2,14бался
2,14 - это сколько?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Основание натурального логарифма e = 2,72,а не 2,14 вообсщета. Зовется числом Эйлера. В школах изучается классе в 9-м где-то
Ответить

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