• Bit 6 – ICES1: Input Capture Edge Select This bit selects which edge on the Input Capture pin (ICP1) that is used to trigger a capture event. When the ICES1 bit is written to zero, a falling (negative) edge is used as trigger, and when the ICES1 bit is written to one, a rising (positive) edge will trigger the capture. When a capture is triggered according to the ICES1 setting, the counter value is copied into the Input Capture Register (ICR1). The event will also set the Input Capture Flag (ICF1), and this can be used to cause an Input Capture Interrupt, if this interrupt is enabled.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
В обработчике запустили таймер или сделали отсечку уже запущенного таймера. Ждете отпускания кнопки и в обработчике сделали следующую отсечку. Разница покажет длительность нажатия на кнопку.
Да, при коротком нажатии ловим сначала нажатие, фильтруем дребезг таймером, ловим отпускание, ещё раз фильтруем. А с длинным что делать? Надо чтобы длинное без отпускания ловил.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт сен 12, 2017 11:58:45
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
radio-fan писал(а):
Надо чтобы длинное без отпускания ловил.
После отсечки дребезга запускается таймер и останавливается при отпускании кнопки. При переполнении таймера, считается что кнопка достаточно долго нажата.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Делаем замер "самого длинного" делим на N частей (желателно кратно 2 дабы с математикой не заморачиваться) и делаем минимального "условного енота" с табличкой определений хотелок в УЕ (от 1 УЕ до максимум/УЕ +2УЕ). Это часть автокалибровки измерителя. Измеренный интервал нарезаем интервалами "условного енота" с неким округлением и грузим количество тех интервалов в "счетчик УЕ, прошедших на вход". Затем содержимое счетчика используем как указатель обработчика.
Вы че тут понаписали про опрос кнопок? ТС-у требуется используя внешнее прерывание отловить короткие и длинные нажатия? Не вопрос. Пусть сработало внешнее прерывание. Как только оно сработало, отключаем внешнее прерывание и пин МК становится обычным входом. Отслеживаем его. Прошли дребезг? Засчитываем как нажатие, запускаем программный таймер длинного нажатия. Только нужно определиться, какое время считаем длинным нажатием? Секунда, пусть будет секунда. Три секунды? Пусть так. Отпустили кнопку раньше положенного? Считаем коротким нажатием. Снова настраиваем вход как внешнее прерывание. Сидим ждем следующее нажатие. Прошло заданное время? Значит длинное нажатие. А вот чтобы считать времянки, используем программные таймеры. Аппаратный таймер один. Программных можно сделать столько, насколько хватит ресурсов МК. Хоть десятки.
Я описал алгоритм замера и сортировки интервалов. А кнопка то или чего иного - никакушной разницы, если базовым измерителем таймер с внешним разрешением счета выбран.
Вполне достаточно. Таймер(ы) для того и введён(ы), чтобы считать "времянки". Программе остается только анализ дребезга, короткого или длинного нажатия.
Речь идет о том, что аппаратных таймеров мало. И они нужны для других нужд. Поэтому, отводится один аппаратный таймер для программных таймеров, которых можно наделать сколько угодно, главное, чтобы хватило ресурсов МК. Это распространенная проблема начинающих. Аппаратных таймеров мало, как отмерять времянки? Вот и ответ сразу - решение - программные таймеры.
Все зависит от терминологии... Вобщем-то все проблемы снимает правильно скомпонованный генератор системной сетки частот. Основа - 8/16 разрядный таймер с автоперезагрузкой (предпочтение 16-разрядному с вероятным предделителем), тактируемый от частоты системного генератора. А при помощи чего дальнейшая обработка этого системного "тик" выполняться будет - зависит от творчества авторов. Возможны добавочные счетчики с передаточными служебными флагами или чего другое... Установка нескольких одновременно протекающих асинхронных процессов дело достаточно сложное из-за компоновки приоритетов прерываний. Да и не всегда дает желаемый результат по оперативному быстродействию.
И снова здравствуйте. Помогите пожалуйста. Пытаюсь написать прогу переключения световых эффектов и их инверсии с помощью внешнего прерывания. Проблема в том, что хреново отслеживается длинное нажатие (происходит незапланированная инверсия и\или увеличение счётчика нажатий (младшая тетрада Flag)). Надо чтобы при коротком мы инкрементировали счётчик, а при зажатии кнопки происходила инверсия, при последующем отпускании ничего не происходило и дальше снова ловим нажатие. Код прилагаю ниже:
rjmp RESET ;переход на обработку сброса rjmp EXT_INT0 ;переход на обработку запроса IRQ0 reti;rjmp EXT_INT1 ;переход на обработку запроса IRQ1 reti;rjmp TIM2_COMP ;переход на обработку сравнения Timer2 reti;rjmp TIM2_OVF ;переход на обработку при переполнении Timer2 reti;rjmp TIM1_CAPT ;переход на обработку при захвате фронта Timer1 rjmp TIM1_COMPA ;переход на обработку при срабатывании компаратора A Timer1 reti;rjmp TIM1_COMPB ;переход на обработку при срабатывании компаратора B Timer1 reti;rjmp TIM1_OVF ;переход на обработку при переполнении Timer1 rjmp TIM0_OVF ;переход на обработку при переполнении Timer0 reti;rjmp SPI_STC ;переход на обработку при завершении передачи SPI reti;rjmp USART_RXC ;переход на обработку при завершении приёма УСАППО reti;rjmp USART_UDRE ;переход на обработку при освобождении регистра reti;rjmp USART_TXC ;переход на обработку при завершении передачи reti;rjmp ACDC ;переход на обработку при завершении приобразования АЦП reti;rjmp EE_RDY ;переход на обработку при готовности EEROM reti;rjmp ANA_COMP ;переход на обработку при срабатывании аналогового компаратора reti;rjmp TWSI ;двухпроводный последовательный интерфейс reti;rjmp SPM_RDY ;переход на обработку прерывания при готовности записи в память программ
Reset: ldi Temp, high(RAMEND) ;Инциализация стека out SPH, Temp ; ldi Temp, low(RAMEND) ; out SPL, Temp ;
ldi Temp, 0b11111111 ;Инициализация портов out DDRB, Temp ; ldi Temp, 0b00000100 ;Подтягивающий резистор на INT0 out PORTD, Temp ;
clr Flag ; clr Count ; clr TimCount ;
ldi Temp, 0b00000010 ;инициализируем INT0 по спаду out MCUCR, Temp ;
ldi Temp, 0b01000000 ;включаем прерывание int0 out GICR, Temp ;
ldi Temp, 0b00010001 ;настройка прерываний(разрешаем прерывание компаратора 1-ого таймера) out TIMSK, Temp ;вывод в TIMSK
ldi Temp, high(31250) ;Задаём число в компаратор out OCR1AH, Temp ; ldi Temp, low(31250) ; out OCR1AL, Temp ;
ldi Temp, 0b00000011 ;настройка предделителя out TCCR1B, Temp ;вывод в TCCR1B
clr Temp ;Обнуляем таймер out TCNT1H, Temp ; out TCNT1L, Temp ;
sei ;
;################################################################################################# ;ООСНОВНОЙ ЦИКЛ ;#################################################################################################
Output: sbrc Flag, 4 ;проверка на бегущую тень com Temp ; out PortB, Temp ;вывод в порты pop Temp ; out SREG, Temp ; reti ;
;############################################################################################# ;ПРЕРЫВАНИЕ ПО КНОПКЕ ;#############################################################################################
EXT_INT0: in Temp, SREG ;сохраняем флаги в стек push Temp ; clr Temp ; out GICR, Temp ;запрещаем прерывание по кнопке out TCCR1B, Temp ;останавливаем компаратор out TCCR0, Temp ;останавливаем таймер 0 out TCNT0, Temp ;очищаем регистр 0 таймера cbr Flag, 0b01000000 ;длинного нажатия нет
sbrs Flag, 5 ;если 0 то было нажатие, если 1 то отпускание rjmp PushCycl ; clr Count ; ldi Temp, 0b00000011 ;настройка предделителя out TCCR1B, Temp ;вывод в TCCR1B mov Temp, Flag ;сравниваем счётчик нажатий andi Temp, 0b00001111 ; cpi Temp, 11 ; brne GO1 ; andi Flag, 0b11110000 ; rjmp GO2 ; GO1: inc Flag ; GO2: cbr Flag, 0b00100000 ; ldi TimCount, 195 ;пауза 0,05 с ldi Temp, 0b00000001 ;запускаем таймер 0 out TCCR0, Temp ;частота 1/8 clr count ; pop Temp ;извлекаем флаги из стека out SREG, Temp ; reti
PushCycl: sbr Flag, 0b00100000 ; ldi TimCount, 146 ;пауза 0,25 с ldi Temp, 0b00000011 ;частота 1/32 out TCCR0, Temp ; pop Temp ;извлекаем флаги из стека out SREG, Temp ; sei ; rjmp Do ;конец прерывания
;############################################################################################# ;ПРЕРЫВАНИЕ ПО ПЕРЕПОЛНЕНИЮ ТАЙМЕРА 0 ;#############################################################################################
TIM0_OVF: in Temp, SREG ;сохраняем флаги в стек push Temp ; dec TimCount ; breq Timer ; pop Temp ;извлекаем флаги из стека out SREG, Temp ; reti ;
Timer: clr Temp ;останавливаем таймер 0 out TCCR0, Temp ; sbrs Flag, 5 ; rjmp GO3 ; ldi Temp, 0b00000011 ;инициализируем INT0 по фронту out MCUCR, Temp ; sbr Flag, 0b01000000 ; ldi Temp, 0b01000000 ;включаем прерывание int0 out GICR, Temp ; ldi Temp, 0b00000011 ;настройка предделителя out TCCR1B, Temp ;вывод в TCCR1B pop Temp ;извлекаем флаги из стека out SREG, Temp ; reti
GO3: ldi Temp, 0b00000010 ;инициализируем INT0 по спаду out MCUCR, Temp ; ldi Temp, 0b01000000 ;включаем прерывание int0 out GICR, Temp ; pop Temp ;извлекаем флаги из стека out SREG, Temp ; sei ; rjmp Do ;конец прерывания
P.S.Ещё один баг нашёл. Вообще не понимаю почему так происходит. Если перебирать эффекты, то он меняет местами 3,4 массивы и 9,10 массивы. Как это исправить?
Ассемблер ничем не отличается от других языков в плане абстракций. Проектирование сверху вниз. Забудьте о регистрах, байтах и тактах. Устройство, блоки устройства, блоки блоков. Алгоритмы. Берете бумажку и составляете ТЗ. Рисуйте алгоритмы. Когда это у вас будет, тогда будут и программы. По сути, программы будут писаться по нарисованным алгоритмам. Пишите программы на ассемблере так, как будто вы пишете на языке высокого уровня. Ссылки на цикл статей я вам давал. Читайте, там все разжевано и даже картинки есть. Вам осталось написать программу по этим картинкам.
Если прерывание int0 произойдёт во время отсчёта задержки, то командой reti мы вернёмся обратно в задержку, а после прерывания она нам уже будет не нужна. Только вот что, а если из прерывания выходить не через reti, то в стеке будет оставаться адрес?
если из прерывания выходить не через reti, то в стеке будет оставаться адрес?
ясен пень, куда ж ему деваться-то? не смотря на то, что ассемблер позволяет делать, что угодно, все-таки хорошей практикой следует признать выход из прерывания туда, откуда был вход. собственно, как и из любой другой подпрограммы.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
RETI всего лишь сбрасывает блокировку прерываний (восстанавливает флаг "глобального разрешения" I в регистре статуса SREG после того, как он будет АВТМАТИЧЕСКИ СБРОШЕН при входе в прерывание) По обработке стека и RET и RETI ОДНО И ТО ЖЕ.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения