isx писал(а):Я так и сделал, просто думал может там есть что-то типа флага, который фиксирует от какого фронта произошло оно...
Фронт только один. front переводится как перед, передний. А то, что многие называют "задний фронт" - это является спадом или срезом.
Прерывание по фронту, прерывание по спаду, а "задний фронт" вызывает усмешку у грамотных людей. Бомбануло. Ну реально, бесит.
Абсолютно согласен насчет фронта и спада. Но не меньше бесит то, что очень многие не знают что глагол "пользовать" означает ЛЕЧИТЬ. А не использовать или пользоватьСЯ.
Chip115 писал(а):а "задний фронт" вызывает усмешку у грамотных людей.
Не знал . Просто как начал изучать по статьям программирование МК, так и засело в голове. В даташатах и мануалах обычно используются "rise" и "fall".
Как всё таки сделать прервание по изменению счётчика энкодера? Мне начинает казаться, что это невозможно.
И вообще, сижу я тут и размышляю: можно ведь просто, взять два канала внешних прерываний и подцепить туда энкодер, сделать прерывание по изменению лог состояния каждого из выводов и обработать направление вращения с помощью операций сравнения и двух исключающих "или". Неужели этот код будет заметно уступать по быстродействию аппаратному энкодеру? Стоило ли из-за этого создавать отдельный интерфейс?
И ещё вопрос .
Как всегда, теоретические рассуждения встретились с практикой.
Появилась задача записать в нулевой бит переменной значение GPIOA->IDR & GPIO_IDR_0, а в первый бит значение GPIOA->IDR & GPIO_IDR_1. В АВР было просто: обратился к PINA.0, он тебе выдал текущее значение этого пина (лог0 или лог1), а тут возвращается либо лог0, либо номер пина. Можно конечно замутить структуры из IF или SWITCH для преобразования в единицу значения, отличного от нуля, но может есть более изящный и менее затратный по ресурсам способ?
Блин, я с этим энкодером весь вымотался...
Решил сделать прерывание по переполнению. Поставил ARR в 1 (при нуле совсем прерывания не работают), в итоге прерывание срабатывает в одну сторону за 1/4 щелчка, а в другую за 1/2. Если изначально переполнить таймер, то прерывание возникнет только при совпадении значений CNT и ARR.
Похоже надо завязывать с этим....
У меня вопрос по аппаратному интерфейсу был...
Так и не найдя решения этой проблемы подключил энкодер через внешние прерывания. Теперь прерывание генерится каждые 1/4 щелчка .
Обработчик прерывания (может кому пригодится):
а пример энкодера из снипетсов для F0 (папка \10_EncoderInterface) не работает?
- This example configures the TIM1 in order to manage an external encoder
connected directly to the MCU without external interface logic.
Both inputs TI1 and TI2 are active on both rising and falling edges.
The GPIO PA8 and PA9, corresponding respectively to TIM1_CH1 and TIM1_CH2,
are configured as alternate function and the AFR2 is selected.
Meтодов много. Главное не забывать, что у механических контактов есть дребезг. И даже нормируется его время. Скажем 10 мсек. Если щелчки идут не чаще скажем 10 раз в секунду, можно по таймеру читать состояние двух ножек раз а 20 мсек (50 Гц). Тогда между двумя выборками дребезг успокоится.
Но мне больше нравится использование того факта, что пока один дребезжит, второй контакт стоит мертво. Пусть, например, оба в нуле. Включим прерывание по фронту А. Когда оно случится, читаем B. Например B=1. Включаем прерывание ТОЛЬКО по спаду B. Читаем А и включаем прерывание по переходу А в противоположное состояние. Одновременно на каждом прерывании +/- 1 в счетчик. В этом случае мы не зависим ни от времени дребезга, ни от скорости вращения.
alexf58 писал(а):Главное не забывать, что у механических контактов есть дребезг
Я щас над оптическим экспериментирую ..
alexf58 писал(а):Если щелчки идут не чаще скажем 10 раз в секунду
Я потому к прерываниям и прицепился, что у меня около 1000 щелчков в секунду, и каждый щелчок имеет 4 состояния, и обрабатывать надо абсолютно каждое значение (система позиционирования как-никак ).
alexf58 писал(а):Включим прерывание по фронту А. Когда оно случится, читаем B. Например B=1. Включаем прерывание ТОЛЬКО по спаду B. Читаем А и включаем прерывание по переходу А в противоположное состояние.
А это нормально, менять настройки события прерывания в каждом прерывании?
Вчера приобрел для обучения и отработки навыков платку Discovery4 и уже появляются элементарные вопросы. Поставил программу STM32 ST-LINK Utility. После первого включения она считала содержимое памяти, а потом перестала это делать и окно device memory остается пустым, хотя устройство подключается успешно. Обновление программы проблему не решило.
И так и не понял, как запустить демо пример с MEMS мышью
День добрый)
Вообщем маркетаню я энкодер на STM. Напечатал диск с рисками и поставил два щелевых оптодатчика, на выходе каждого, при вращении диска с одинаковой скоростью, появляется нормальный синус с размахом от 0.3В до 2.8В (питается это дело вместе с STM32 от 3В). Сдвинул я эти два синуса друг от друга на 90 градусов (как и положено в инкрементальном энкодере) и подал на внешнее прерывание в STM32 (интерфейс энкодера не подходит), но МК регистрирует то неверный отсчёт, то неверное направление (особенно если крутануть рукой по сильнее).
В чём может быть причина?
И ещё вопрос, связанный с первым. Этот график применяется в случае, если пин настроен на внешнее прерывание? И что значит "Undefined"? В этот момент на пине сохраняется значение предыдущего состояния неизменным, либо там может быть что угодно?