Теория и практика AVR ассемблера.
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
это не прикольная идея, а макросы - когда программа перевалит за тысячу строк, разобраться в ней будет тяжело даже автору (лучше сразу вырабатывать стиль написания программ ... набор кода - это еще не программа ....)
- Реклама
Как подавить дребезг кнопки с помощью программы? Кнопка подключена напрямую к контроллеру, схему подавления дребезга использовать не хочу.
Простейший вариант - тупо подождать сотню-другую мкс после первого прерывания.АндрейАвербах писал(а):Как подавить дребезг кнопки с помощью программы?
Есть неувязочка, у меня НЕ прерывания, тупое сканирование кнопки.
То же самое - после первого срабатывания условия ждём, в конце проверяем ещё раз.
- Реклама
написал такой макрос
.macro proverkamac
proverka:
dec R23
brne proverka
dec R16
brne proverka
SBIC PINB, 4
rjmp dalee
если условие не выполнено(кнопка нажата), топаем куда надо(на метку dalee), а если не выполнено, топаем далее по коду. Так?
.macro proverkamac
proverka:
dec R23
brne proverka
dec R16
brne proverka
SBIC PINB, 4
rjmp dalee
если условие не выполнено(кнопка нажата), топаем куда надо(на метку dalee), а если не выполнено, топаем далее по коду. Так?
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
нет, не так - обратившись к макросу более 1 раза, получишь ошибку.АндрейАвербах писал(а):написал такой макрос.....Код: Выделить всё
.macro proverkamac .......
Так?
в макросах нельзя использовать абсолютные метки. можно использовать переходы типа Этот код вернет программный счетчик на 3 команды вверх.
Код: Выделить всё
rjmp PC-3Ставим плюсы: )
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
.. вообще-то можно, если эти метки локальные (... и такое поддерживает компилятор) или передавать имя метки в качестве параметра ( как раз для rjmp dalee )ibiza11 писал(а):в макросах нельзя использовать абсолютные метки ...
Как вариант:
вызов:
Код: Выделить всё
.macro testmacro
RJMP @0
@0: NOP
.endm
Код: Выделить всё
testmacro PC
Ну это уже костыли.
Макросы следует с умом использовать. Например для повышения читаемости кода (SBI XX YY заменить лаконичным LED_ON). Или где нужно что-то вычислять до компиляции, то однозначно лучше возложить это на плечи компилятора. Или стандартные заготовки, с условными операциями, чтобы было проще переносить эти куски между проектами.
Если код макроса объёмный, и используется более одного раза, имеет смысл оформить это подпрограммой.
Макросы следует с умом использовать. Например для повышения читаемости кода (SBI XX YY заменить лаконичным LED_ON). Или где нужно что-то вычислять до компиляции, то однозначно лучше возложить это на плечи компилятора. Или стандартные заготовки, с условными операциями, чтобы было проще переносить эти куски между проектами.
Если код макроса объёмный, и используется более одного раза, имеет смысл оформить это подпрограммой.
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
... ну почему-же ... с помощью подобных вещей легко реализовать С-шный switch/caseploop писал(а):Ну это уже костыли.
...тут добавить нечего - именно для повышения читаемости и уменьшения "работы ручками" их и используют ..ploop писал(а):Макросы следует с умом использовать. Например для повышения читаемости кода
а есть у этого процесса некоторый период? или когда захотел? Потому кактупое сканирование кнопки.
- проверка состояния кнопок должна быть не чаще 5-10 мсек. И программа тупо тормознёт на эти 5 мсек? Некрасиво это как тонаписал такой макрос
.macro proverkamac
proverka:
Ой, как много понаписАли-то
Будем разгребать
На СИ я переходить в ближайшее время не собираюсь.
Короче, ладно без макросов.
Пугает оформить это как подпрограмму, то что она вызывается командой rcall.
Дело в том, что задержка у меня тоже оформлена как подпрограмма, т.е.
А если оформить защиту от дребезга как подпрограмму, то выйдет вот что
Ну, подразумевается, что в задержку напиханы еще разные сравнения и т.п. и т.д.
И самое, что страшно, при вызове командой RCALL в конец стека записывается адрес возврата, а при вызове Rcall внутри уже вызванной Rcall, адрес в стеке заменится(заменится или положится поверх?) на адрес вызываемой Rcall, и вернемся мы в конце-концов черт знает куда.
Или нет?
А все, разобрался, можно, вот код
На СИ я переходить в ближайшее время не собираюсь.
Всю программу смысла выкладывать нет. Сканирование кнопки в процессе задержки(для мигания/переключения светодиодов)а есть у этого процесса некоторый период? или когда захотел? Потому как
Код: Выделить всё
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
С вызовами все нормально будет, на то он и стек. Чтобы подавить дребезг достаточно считывать состояние кнопки не чаще чем 1 раз в 10мс, а где это делать - не имеет значения. Можешь этот код встроить в алгоритм задержки - все равно там в холостую крутится. Если есть таймер с динамической индикацией - можно код считывания кнопок встроить туда, так чтобы считывание происходило примерно каждые 10мс.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Ясное дело, пробовал.контроллер может делать ШИМ, а я слышал, что с помощью ШИМ можно воспроизводить различные звуки, а если можно воспроизводить звуки, значит можно сделать синтезатор речи аля говорящий компьютер. Как-то так.
Кто-то уже пробовал что-либо подобное?
Это зря. Писать большие проекты (да и маленькие тоже) на асме бессмысленно. Хотя знать его, конечно, надо - он дает понимание железа и хорош для критичных по скорости мест. Ассемблер и Си можно и нужно совмещать.На СИ я переходить в ближайшее время не собираюсь.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Позволю себе не согласиться с Вами. Поскольку автор не набрал достаточно опыта программирования на Ассемблере, к тому же не знаком со всеми командами ядра, также учитывая его юный возраст, в ближайшее время переходить на Си противопоказано. Позже конечно же можно и нужно, но не сейчас.YS писал(а):Это зря. Писать большие проекты (да и маленькие тоже) на асме бессмысленно.
Ставим плюсы: )
Зависит от человека, от его способностей. Когда я учился в университете у нас в группе был парень, который почти всё писал на ассемблере, тогда ещё под ДОС. И проект в тыщу строк для него был обычным делом. У нас в группе был популярен его текстовый редактор оформленный под Turbo Vision полностью написанный на ассемблере. Исходник был, ЕМНП, больше 5000 строк. Так что "фор хум хау"YS писал(а):Это зря. Писать большие проекты (да и маленькие тоже) на асме бессмысленно.
А на счёт "бессмысленно", так я бы сказал, что целесообразность написания на ассемблере в каждом конкретном случае надо учитывать.
Кто-то для саморазвития пишет на ассемблере то, что в ином случае проще или быстрее написать на Си. Для кого-то это увлечение.
А вот если что-то на заказ делать, то тут надо взвесить - целесообразно ли?
Последний раз редактировалось Kavka Вт июн 04, 2013 11:38:33, всего редактировалось 1 раз.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
У аасемблера есть одно преймущество: работа программы не зависит от особенностей компиляторов. Что написал, то и выполняется. И появляется чёткое понимание архитектуры МК. Соответственно есть и недостатки. Поэтому всегда нужно искать компромиссы.


