Добрый вечер. Нужно реализовать операцию с битами двух регистров, соответственно таблице истинности:
1,1=0
0,0=0
1,0=1
0,1=0
или импликации
1,1=1
0,0=1
1,0=0
0,1=1
В общем хочу опрашивать входящие сигналы, и вызывать подпрограмму, если один из входов смениться с 0 на 1.
Камешек: Atmega8
Сам еще только с малой частью команд знаком, надеюсь подскажете.
командами SBIC\SBIS можно проверить текущее состояние входа, и если оно "0" - пропустить дальнейшую проверку, а если оно = "1", то смотреть ранее считанное состояние, которое предварительно где-то сохранили, например в T-бите статусного регистра, тогда воспользовавшись командами BRTS\BRTC можно если оно было "0" перейти в нужную вам подпрограмму. А вообще эту задачу можно решить полностью аппаратно, с помощью прерываний INT0-INT1, если они конечно еще не заняты.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Это бесполезная трата времени. Если товарищ поленился купить скачать книги по МК AVR, то объяснять что-либо дальше просто бесполезно. Начнет долбить по малейшим вопросам не затрудняясь искать ответы самостоятельно.
gaw.ru
Вольфганг Трамперт "AVR-RISC микроконтроллеры фирмы ATMEL"
Джон Мортон "Микроконтроллеры AVR. Вводный курс"
Этих материалов вполне достаточно для самостоятельного изучения.
Илья ответил из вежливости. Вопрос ТС элементарен до безобразия. Нужно взять книжку и почитать.
Давайте всем форумом соберемся и объясним ТС-у, какая команда за что отвечает?
Не кажiть ГОП...
в задачке не только отдельный бит, но и комбинация из двух (и более) единиц. Причем два из вариантов с одинаковым результатом.
А такой перебор четырех ( и более) возможных комбинаций простой побитовой проверкой накладненько делать.
Лучше уж переход по изменяемому вектору.
А не все ли равно - разбор четырех возможных комбинаций с применением последующего результата в каких-то целях.
Аппаратно это вариант дешифратора входной комбинации.
Согласитесь, тут мало данных? Что на входах? Контакты, нужно ли подавление дребезга? Цифровой сигнал? Какая задача в целом?
Более конкретно: Управление шаговыми двигателями с лпт порта. В частности хотелось бы не мучать бабушку, и провести желаемую логическую операцию с регистром настоящего и прошлого опрошенного значения. Потом проверить на нуль, прогнать биты по условию, и выполнить что хотелось. Также к программе шага собираюсь прикрутить недошим 1кГц на половину тока, если движки в простое N времени. Конечно необходимо, чтобы весь цикл программы вписывался в период импульса входа. Поэтому и спрашиваю, вдруг существует способ быстрой проверки на появившиеся единицы, нежели проверять каждый выход отдельно, и тратить драгоценное время.
В общем пока дискуссировали, накопал составляющие импликации. Пока вопрос закрыт.
в вашем коде "сюда" будет выполняться ВСЕГДА, а "туда" - иной раз перед "сюда"
Ну не скажите , я ведь могу уйти из Rcall куда захочу , при необходимости. А TC было даже лень почитать про эту команду.
Ну пусть попробует прочитать про rjmp и в чём отличие от rcall.
Тогда грамотный вектор-переход в лапы - более скоростного варианта не предвидится.
Для АВРок
в Z базовый адрес таблицы векторов вида 0xnn00
в регистр ZL помещаем наши данные в виде 0b000000yy
делаем один lsl Zl
и выполняем ijmp
а в таблице векторов стоит второй JMP или ежли по-хитрее
icall на адрес содержащий команду подстановки с последующим ret - но тогда надо правильно скорректировать содержимое Zl перед вызовом
Вобчем вариантов... На любой вкус!
Кстати...
насчет
rcall туда
rcall сюда
не есть хорошо - ибо попав в первый rcall возврат по ret без "подстановки адреса возврата через стек" вынесет нас на второй rcall со всеми проистекающими... другое дело ежли там rjmp поставить
А вы пишете на асме? Лично я дошел в написании программ на асме до уровня создания многоуровневых меню. Заопасался за свой рассудок, перешел на си.
Это я к тому, что на асме можно реализовать что хочешь, как хочешь. Главное, знать архитектуру, систему команд. И четко представлять, что ты делаешь, что будет происходить в программе и в кишках МК.
я, как и многие, начинал с асма. дело в том, что я начинал в те времена, когда компиляторов Си для микроконтроллеров еще практически не было, да и из микроконтроллеров были, в основном, КР1816ВЕ31... поэтому освоение AVR прошло через ассемблер долгое время сопротивлялся Си, но потом как-то попривык, вошел во вкус.
Demiurg писал(а):на асме можно реализовать что хочешь, как хочешь
можно - не означает нужно
на форуме с определенной периодичностью появляются камрады, желающие из прерывания выходить не в прерванную точку, а в другую, или входить в подпрограмму, а выходить из нее при помощи jmp совсем в другое место... и ни разу я никому не советовал так делать, хотя совершенно четко осознаю реальность реализации этого. не представляю, какая польза может перевесить извращенность такого подхода?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):на форуме с определенной периодичностью появляются камрады, желающие из прерывания выходить не в прерванную точку, а в другую, или входить в подпрограмму, а выходить из нее при помощи jmp совсем в другое место...
Я тоже когда-то проходил этот этап. Пока не разобрался. Уже убей не вспомню зачем и почему мне нужен такой переход.
Но я помню причину. дело в том, что железячников выбивает с толку зацикленность работы микроконтроллеров. И бесполезные телодвижения МК в программе с их точки зрения. Когда начинаешь понимать, что микроконтроллер работает по кругу основного цикла, потом мозги нужно заново разбирать и собирать в кучу, чтобы понять что такое распараллеливание процессов в программировании. Я имею в виду не программирование высшего уровня, а уровень МК.