|
|
  |
Внешние прерывания, STM32F103VB |
|
|
|
Jul 28 2014, 13:13
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Jul 28 2014, 14:16)  Я смотрел ремап, таймера сидят вместе с другими важными модулями. Жаль. Значит энкодеру не повезло - будет самым "глючным", т.к. все ушло важным модулям. С одной стороны можно не обращать внимание - вряд ли энкодер будут крутить часто. С другой стороны - это средство взаимодействия с пользователем и если энкодер будет работать неустойчиво - многим это не понравится. Например, купил я оциллогаф SDS7102, и со старой прошивкой его энкодеры просто сносили башню: крутишь в одну сторону, а реагирует не так как ожидалось. В новой проше поправили. Сейчас отлично все работает, плюс ускорение приделали - очень удобно)) Давным-давно делал энкодер на atmega8 опросом (t=10ms) - до сих пор все работает без замечаний (а это турникеты KABA на оживленной проходной). Если скорось большая не нужна, то лучше делать опросом, чтобы не повторилась ситуация с мегагерцами (мало ли что там может появиться). Удачи.
|
|
|
|
|
Jul 28 2014, 13:54
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Jenya7 @ Jul 28 2014, 07:50)  Но все не напрасно, благодаря этому я узнал как правильно чистить интерапт. Так что спасибо вам друзья.  Кстати, о чистке. У STM есть определенный "разброс и шатание" в части, как сбрасывать биты в регистрах флагов прерываний и статуса: в некоторых случаях для сброса битов регистра надо записать в другой, связаный, регистр единицы для сброса, а в некоторых случаях - нули в сам регистр, биты которого надо сбросить. То есть, для первого случая это конструкция REG = BIT; как это для EXT, а во втором случае REG = ~BIT; Поэтому надо постоянно обращать внимание на особенности регистра. Например, в доке на какой-нибудь SR (регистр статуса) при описании бита может стоять rc1_w0, что означает, что бит сбрасывается записью в него нуля. Вроде логично, но применять надо не SR &= ~BIT, а именно SR = ~BIT. Из этого следует, что удобно применить SR = ~SR, если надо одним махом сбросить все установленные биты в SR, не заморачиваясь на константы в правой части выражения  .
|
|
|
|
|
Jul 28 2014, 14:12
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Я тут посмотрел...возможно я таки найду свободные пины для таймера. А насчет чистки битов, может как в AVR? Код #define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT)) #define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT)) Кстати я не вижу большого криминала обрабатывать энкодер на прерываниях. На AVR прекрасно работало, а STM32 все таки в 5 раз быстрее.
Сообщение отредактировал Jenya7 - Jul 28 2014, 14:08
|
|
|
|
|
Jul 28 2014, 15:52
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Опять нужна лекция... попробуем укороченный вариант
возникает прерывание 1 и 2, ставиться флаг 1 и 2 биты. FLAG_REG = 0x03; вы входите в обработчик первого прерывания в нем пишите FLAG_REG |= 0x01; для сброса этого флага, получаете FLAG_REG = FLAG_REG | 0x01 = 0x03 | 0x01 = 0x03 то есть сбрасываете оба флага, теряете второе прерывание
теперь для сброса нулем возникает прерывание 1 и 2, ставиться флаг 1 и 2 биты. FLAG_REG = 0x03; вы входите в обработчик первого прерывания в нем пишите FLAG_REG &= ~0x01; это на самом деле выглядит так 1. TEMP = FLAG_REG; 2. TEMP = TEMP & 0xFE = 0x03 & 0xFE = 0x02; 3. FLAG_REG = TEMP = 0x02;
казалось бы вот оно счастье все вышло,
но что если между 1 и 2, или 2 и 3 возникло еще прерывания и FLAG_REG стал 0x07, что в нем останется после 3? правильно, потеря третьего прерывания...
именно по этому флаги прерываний в подавляющем большинстве делают чувствительными только к одному уровню сигнала, и сбрасывают их через =, то есть через 1 тактовую операцию...
|
|
|
|
|
Jul 29 2014, 06:15
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Golikov A. Спасибо за подробное объяснение. Цитата(adnega @ Jul 28 2014, 22:27)  Вы же сами жаловались, что ничего не работает! Когда CPU постоянно сидит в обработчиках прерываний mainloop не крутится и не работают менее приоритетные (и этого же уровня) прерывания - что есть зло. С учетом того, что в энкодере будет дребезг - в это время ничего работать не будет. А начнет пользователь крутить быстро - так вообще много чудес можно словить в устройстве, с таким количеством "важной" периферии, что не остается свободных ног таймера. Тут конечно все дело в частоте прерываний. У иеня максимальная 200 Герц значит 5 ms. Дьюти 50% - 2.5 ms между перепадами. Это достаточно большое время как мне кажется.
|
|
|
|
|
Jul 29 2014, 08:30
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Jul 29 2014, 10:15)  Тут конечно все дело в частоте прерываний. У иеня максимальная 200 Герц значит 5 ms. Дьюти 50% - 2.5 ms между перепадами. Это достаточно большое время как мне кажется. Да уж - ни туда, ни сюда. Возможно, в этом случае опрос может проиграть EXTI. Я бы все равно постарался подключить к таймеру. Может, МК другой посмотреть: в F100 таймеров обычно больше (правда частота CPU до 24МГц).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|