Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт апр 07, 2011 21:16:41
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19733 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
GP1 писал(а):
поправлю чуток, задержек в прерываниях не делают.
Я это и имел в виду
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
хорошо. а тогда такой вопрос - как грамотные люди осуществляют эту задержку на ассемблере?
Грамотные люди паяют кондёр на 0,1мкФ параллельно кнопке, и забывают про них. А когда действительно понадобится обработать дребезг, у них уже будет накоплен опыт программирования, и проблем это не составит.
Я делаю так (на каждую кнопку) 1. флаг нажатия (устанавливается при нажатии) 2. флаг необходимости действия при нажатии 3. Флаг необходимости действия при отпускании 4. Счетчик антидребезга (регистр, память, не важно)
Далее при опросе кнопок такой алгоритм: проверяем флаг нажатия, если небыло и кнопка нажата - увеличиваем счетчик. Как досчитает - ставим флаг действия по нажатию. При отпускании - снимаем флаг нажатия и устанавливаем флаг действия по отпусканию.
Флаги действий снимаются (или нет для повторяющихся действий) уже в обработчике этих действий.
Такой простенький флаговый автомат. Звучит сложно, но на самом деле работает быстро, надёжно, и, самое главное, писать дальнейший код просто приятно - проверяй флаги действий и всё.
Пример кода (без счетчика, я кондёры люблю Куда добавить догадаетесь)
Код:
; rx1 - флаги нажатия кнопок ; rx2 - флаги действий. Младшие 4 бита - действий по нажатию, старшие - по отпусканию. ; как раз один регистр на 4 кнопки. sbic btn1_pin,btn1_bit rjmp bt01 ; если кнопка нажата sbrc rx1,3 ; проверяем, была ли она нажата ранее rjmp bt02 ; если да - выходим ori rx2,(1<<3) ; если нет - устанавливаем действие по нажатию ori rx1,(1<<3) ; и факт нажатия rjmp bt02 bt01: ; если не нажата sbrs rx1,3 ; и не была нажата ранее rjmp bt02 ; выходим andi rx1,~(1<<3) ; иначе сбрасываем факт нажатия ori rx2,(1<<7) ; ставим действие по отпусканию bt02:
существуют различные способы, как правило конкретный метод определяется задачей, скажем определить факт нажатия - это одно, а различить короткое/длинное нажатие это совсем другое. чаще всего кнопки опрашивают по прерываню таймера, но попадаются и по внешним прерываниям, но реже.
кстати в таком случае с какой частотой стоит проверять кнопку? я все-таки решил переделать программу, чтобы INT0 вообще не использовался
кстати в таком случае с какой частотой стоит проверять кнопку?
.. в тело прерывания по таймеру вставляете программный счетчик. Например таймер срабатывает каждые 2 мсек (500 Гц), тогда если счетчик = 25, то прошла 1/20 секунды (факт нажатия), дальше "мертвое время" и автоповтор если нужно...
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб апр 09, 2011 20:01:23
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19733 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Skyer писал(а):
Процедура delayus осуществляет задержку на wiretemp десятков микросекунд. Где закралась ошибка? Процедуры задержки перепроверял, там все верно.
Время на команды перехода и т.п. тоже учли?
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт апр 14, 2011 15:47:27
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19733 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Как с помощью МК определить направление вращения энкодера, покрасивее и покомпактнее? Энкодер двухбитный в коде Грея, т.е. последовательность 00-10-11-01 в одну сторону и 00-01-11-10 в другую. Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
А если принимать значение в буферный регистр (как последовательный код) и сравнивать с его предыдущим значением, сдвинутым в право/влево с переносом (в закольцованном регистре)? В каком случае совпадёт, туда и движение.
Как с помощью МК определить направление вращения энкодера, покрасивее и покомпактнее? Энкодер двухбитный в коде Грея, т.е. последовательность 00-10-11-01 в одну сторону и 00-01-11-10 в другую. Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
1. Предыдущую и текущую комбинацию объединяем в одно слово. 2. Для полученных кодов делаем табличку. То есть, полученный код - адрес в таблице. Данные в таблице по тем адресам, которые соответствуют приращению константы, которую крутим энкодером - 01, которые соответствуют уменьшению - $ff, по остальным адресам нули. 3. Все. По прерыванию(или еще как-то) считываем значение с порта на котором висит энкодер. Получаем элемент таблицы. константу которую крутим суммируем (add) с элементом таблицы.
Если непонятно - пиши, поясню на примере. Все получается не очень компактно(из-за таблицы), но очень быстро и просто и без условных переходв.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт апр 15, 2011 11:26:20
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19733 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
ploop писал(а):
А если принимать значение в буферный регистр (как последовательный код) и сравнивать с его предыдущим значением, сдвинутым в право/влево с переносом (в закольцованном регистре)? В каком случае совпадёт, туда и движение.
Думал о закольцованом регистре, но т.к. он закольцован через бит С, регистр получается кагбэ девятибитным и просто так вращение со сравнением не реализовать. Если только задействовать 2 регистра и сдвигать из одного в другой.
eufs писал(а):
Если непонятно - пиши, поясню на примере. Все получается не очень компактно(из-за таблицы), но очень быстро и просто и без условных переходв.
Тогда таблицу придётся делать для всех возможных комбинаций, т.е. 2^4 = 16 байт для хранения, по сути, всего двух бит (0 или ±1). Как-то нерационально, а бешеная скорость мне не нужна: по даташиту максимальная скорость вращения энкодера 100 об/мин.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Привет всем... есть два вопроса вопрос номер раз: имеется времянка(в аттаче)... имеется стк500(атмега16)... задание таково..необходимо сделать такие временные диаграммы и показать их с помощью спец. девайса(логического анализатора), то есть атмега должна эмулировать сигналы видеокамеры(такое вот заданице)... в общем то не могу понять как мне это организовать... как быть с clk... если есть у кого время... помогите пожалуйста разобраться... это важно...
ну а второй вопрос... Необходимо разработать микропроцессорное устройство, в котором микроконтроллер непрерывно генерирует периодический сигнал с периодом T и длительностью импульса t машинных циклов. Во время выполнения этой задачи МК реагирует на прерывания двух типов. Обработчик каждого из прерываний подсчитывает количество прерываний данного типа и, когда оно достигает шести, запрещает прерывание от данного источника. На время обработки прерывания генерация сигнала приостанавливается.
Период импульса Т 1100 машинных циклов (305 мкс*) Длительность импульса t 340 машинных циклов (94 мкс*) Источники прерывания Запрос на прерывание от внешнего источника INT0 Запрос на прерывание от внутреннего источника INT1 исходник добавил... но не могу понять как он работает... и работает ли... проверить на анализаторе его временно не могу... поэтому если есть возможность ответьте плиз
Сейчас этот форум просматривают: ILYAUL и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения