Теория и практика AVR ассемблера.

Обсуждаем контроллеры компании Atmel.
Ответить
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

это не прикольная идея, а макросы - когда программа перевалит за тысячу строк, разобраться в ней будет тяжело даже автору (лучше сразу вырабатывать стиль написания программ ... набор кода - это еще не программа ....)
Реклама
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

Как подавить дребезг кнопки с помощью программы? Кнопка подключена напрямую к контроллеру, схему подавления дребезга использовать не хочу.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

АндрейАвербах писал(а):Как подавить дребезг кнопки с помощью программы?
Простейший вариант - тупо подождать сотню-другую мкс после первого прерывания.
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

Есть неувязочка, у меня НЕ прерывания, тупое сканирование кнопки.
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

То же самое - после первого срабатывания условия ждём, в конце проверяем ещё раз.
Реклама
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

написал такой макрос
.macro proverkamac
proverka:
dec R23
brne proverka
dec R16
brne proverka
SBIC PINB, 4
rjmp dalee
если условие не выполнено(кнопка нажата), топаем куда надо(на метку dalee), а если не выполнено, топаем далее по коду. Так?
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

АндрейАвербах писал(а):написал такой макрос

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

.macro proverkamac
.......
.....
Так?
нет, не так - обратившись к макросу более 1 раза, получишь ошибку.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

в макросах нельзя использовать абсолютные метки. можно использовать переходы типа

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

rjmp PC-3
Этот код вернет программный счетчик на 3 команды вверх.
Ставим плюсы: )
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

ibiza11 писал(а):в макросах нельзя использовать абсолютные метки ...
.. вообще-то можно, если эти метки локальные (... и такое поддерживает компилятор) или передавать имя метки в качестве параметра ( как раз для rjmp dalee )
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Как вариант:

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

	.macro	testmacro
	RJMP	@0
@0:	NOP
	.endm
вызов:

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

	testmacro PC
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Ну это уже костыли.
Макросы следует с умом использовать. Например для повышения читаемости кода (SBI XX YY заменить лаконичным LED_ON). Или где нужно что-то вычислять до компиляции, то однозначно лучше возложить это на плечи компилятора. Или стандартные заготовки, с условными операциями, чтобы было проще переносить эти куски между проектами.

Если код макроса объёмный, и используется более одного раза, имеет смысл оформить это подпрограммой.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

ploop писал(а):Ну это уже костыли.
... ну почему-же ... с помощью подобных вещей легко реализовать С-шный switch/case
ploop писал(а):Макросы следует с умом использовать. Например для повышения читаемости кода
...тут добавить нечего - именно для повышения читаемости и уменьшения "работы ручками" их и используют ..
orinoko

Сообщение orinoko »

тупое сканирование кнопки.
а есть у этого процесса некоторый период? или когда захотел? Потому как
написал такой макрос
.macro proverkamac
proverka:
- проверка состояния кнопок должна быть не чаще 5-10 мсек. И программа тупо тормознёт на эти 5 мсек? Некрасиво это как то
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Ставим плюсы: )
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

Ой, как много понаписАли-то :shock: Будем разгребать :)
На СИ я переходить в ближайшее время не собираюсь.
а есть у этого процесса некоторый период? или когда захотел? Потому как
Всю программу смысла выкладывать нет. Сканирование кнопки в процессе задержки(для мигания/переключения светодиодов)

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

delay: SBIC PINB, 4
	proverkamac
	dec R24
	brne delay
	dec R25
	brne delay
	ret
проверка состояния кнопок должна быть не чаще 5-10 мсек
Почему? Дребезг?
Короче, ладно без макросов.
Пугает оформить это как подпрограмму, то что она вызывается командой rcall.
Дело в том, что задержка у меня тоже оформлена как подпрограмма, т.е.

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

основной код
rcall задержка
в начало основного кода
А если оформить защиту от дребезга как подпрограмму, то выйдет вот что

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

задержка:
     Rcall защита_от_дребезга
     Собственно задержка
     rjmp задержка
Ну, подразумевается, что в задержку напиханы еще разные сравнения и т.п. и т.д.
И самое, что страшно, при вызове командой RCALL в конец стека записывается адрес возврата, а при вызове Rcall внутри уже вызванной Rcall, адрес в стеке заменится(заменится или положится поверх?) на адрес вызываемой Rcall, и вернемся мы в конце-концов черт знает куда.
Или нет?

А все, разобрался, можно, вот код

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

delay: SBIC PINB, 4
	rcall test
	dec R24
	brne delay
	dec R25
	brne delay
	ret

test:
	dec R23
brne test
dec R16
brne test
SBIC PINB, 4
rjmp dalee 
ret
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

С вызовами все нормально будет, на то он и стек. Чтобы подавить дребезг достаточно считывать состояние кнопки не чаще чем 1 раз в 10мс, а где это делать - не имеет значения. Можешь этот код встроить в алгоритм задержки - все равно там в холостую крутится. Если есть таймер с динамической индикацией - можно код считывания кнопок встроить туда, так чтобы считывание происходило примерно каждые 10мс.
Контактная информация:
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

контроллер может делать ШИМ, а я слышал, что с помощью ШИМ можно воспроизводить различные звуки, а если можно воспроизводить звуки, значит можно сделать синтезатор речи аля говорящий компьютер. Как-то так.
Кто-то уже пробовал что-либо подобное?
Ясное дело, пробовал. :)
На СИ я переходить в ближайшее время не собираюсь.
Это зря. Писать большие проекты (да и маленькие тоже) на асме бессмысленно. Хотя знать его, конечно, надо - он дает понимание железа и хорош для критичных по скорости мест. Ассемблер и Си можно и нужно совмещать. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

YS писал(а):Это зря. Писать большие проекты (да и маленькие тоже) на асме бессмысленно.
Позволю себе не согласиться с Вами. Поскольку автор не набрал достаточно опыта программирования на Ассемблере, к тому же не знаком со всеми командами ядра, также учитывая его юный возраст, в ближайшее время переходить на Си противопоказано. Позже конечно же можно и нужно, но не сейчас.
Ставим плюсы: )
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

YS писал(а):Это зря. Писать большие проекты (да и маленькие тоже) на асме бессмысленно.
Зависит от человека, от его способностей. Когда я учился в университете у нас в группе был парень, который почти всё писал на ассемблере, тогда ещё под ДОС. И проект в тыщу строк для него был обычным делом. У нас в группе был популярен его текстовый редактор оформленный под Turbo Vision полностью написанный на ассемблере. Исходник был, ЕМНП, больше 5000 строк. Так что "фор хум хау" :))

А на счёт "бессмысленно", так я бы сказал, что целесообразность написания на ассемблере в каждом конкретном случае надо учитывать.
Кто-то для саморазвития пишет на ассемблере то, что в ином случае проще или быстрее написать на Си. Для кого-то это увлечение.
А вот если что-то на заказ делать, то тут надо взвесить - целесообразно ли?
Последний раз редактировалось Kavka Вт июн 04, 2013 11:38:33, всего редактировалось 1 раз.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
orinoko

Сообщение orinoko »

У аасемблера есть одно преймущество: работа программы не зависит от особенностей компиляторов. Что написал, то и выполняется. И появляется чёткое понимание архитектуры МК. Соответственно есть и недостатки. Поэтому всегда нужно искать компромиссы.
Ответить

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