реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Внешние прерывания, STM32F103VB
Jenya7
сообщение Jul 28 2014, 05:50
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Проблема закралась с неожиданной стороны. На плате были опциональные перемычки, которые старательная паяльщица тоже запаяла. В результате образовалась обратная связь которая осцилировала с бешенной частотой забивая контроллер. Интерапт молотил безостановочно.
Но все не напрасно, благодаря этому я узнал как правильно чистить интерапт. Так что спасибо вам друзья. sm.gif

Сообщение отредактировал Jenya7 - Jul 28 2014, 05:54
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 28 2014, 09:36
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(adnega @ Jul 28 2014, 02:18) *
Если использовать EXTI не самоцель, то для получения положения энкодера в STM32 очень хорошо подходит таймер.
Без прерываний по каждому изменению положения - полностью аппаратно.

Ноги на которых сидят таймера заняты. Кроме того 2 таймера у меня ушли на PWM.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jul 28 2014, 10:07
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Jenya7, посмотрите, может ремап Вам поможет.
Мне на F105 помогло пару раз.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 28 2014, 10:16
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(hd44780 @ Jul 28 2014, 16:07) *
Jenya7, посмотрите, может ремап Вам поможет.
Мне на F105 помогло пару раз.

Я смотрел ремап, таймера сидят вместе с другими важными модулями.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 28 2014, 13:13
Сообщение #20


Гуру
******

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



Цитата(Jenya7 @ Jul 28 2014, 14:16) *
Я смотрел ремап, таймера сидят вместе с другими важными модулями.

Жаль. Значит энкодеру не повезло - будет самым "глючным", т.к. все ушло важным модулям.
С одной стороны можно не обращать внимание - вряд ли энкодер будут крутить часто.
С другой стороны - это средство взаимодействия с пользователем и если энкодер будет работать неустойчиво - многим это не понравится.
Например, купил я оциллогаф SDS7102, и со старой прошивкой его энкодеры просто сносили башню: крутишь в одну сторону, а реагирует не так как ожидалось.
В новой проше поправили. Сейчас отлично все работает, плюс ускорение приделали - очень удобно))
Давным-давно делал энкодер на atmega8 опросом (t=10ms) - до сих пор все работает без замечаний (а это турникеты KABA на оживленной проходной).
Если скорось большая не нужна, то лучше делать опросом, чтобы не повторилась ситуация с мегагерцами (мало ли что там может появиться).
Удачи.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jul 28 2014, 13:54
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Jenya7 @ Jul 28 2014, 07:50) *
Но все не напрасно, благодаря этому я узнал как правильно чистить интерапт. Так что спасибо вам друзья. sm.gif

Кстати, о чистке. У STM есть определенный "разброс и шатание" в части, как сбрасывать биты в регистрах флагов прерываний и статуса: в некоторых случаях для сброса битов регистра надо записать в другой, связаный, регистр единицы для сброса, а в некоторых случаях - нули в сам регистр, биты которого надо сбросить. То есть, для первого случая это конструкция REG = BIT; как это для EXT, а во втором случае REG = ~BIT; Поэтому надо постоянно обращать внимание на особенности регистра. Например, в доке на какой-нибудь SR (регистр статуса) при описании бита может стоять rc1_w0, что означает, что бит сбрасывается записью в него нуля. Вроде логично, но применять надо не SR &= ~BIT, а именно SR = ~BIT. Из этого следует, что удобно применить SR = ~SR, если надо одним махом сбросить все установленные биты в SR, не заморачиваясь на константы в правой части выражения wink.gif .
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 28 2014, 14:12
Сообщение #22


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 28 2014, 15:52
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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 тактовую операцию...






Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 28 2014, 16:27
Сообщение #24


Гуру
******

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



Цитата(Jenya7 @ Jul 28 2014, 18:12) *
Кстати я не вижу большого криминала обрабатывать энкодер на прерываниях.

Вы же сами жаловались, что ничего не работает! Когда CPU постоянно сидит в обработчиках прерываний mainloop не крутится и не работают менее приоритетные (и этого же уровня) прерывания - что есть зло. С учетом того, что в энкодере будет дребезг - в это время ничего работать не будет.
А начнет пользователь крутить быстро - так вообще много чудес можно словить в устройстве, с таким количеством "важной" периферии, что не остается
свободных ног таймера.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 29 2014, 06:15
Сообщение #25


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Golikov A.
Спасибо за подробное объяснение.

Цитата(adnega @ Jul 28 2014, 22:27) *
Вы же сами жаловались, что ничего не работает! Когда CPU постоянно сидит в обработчиках прерываний mainloop не крутится и не работают менее приоритетные (и этого же уровня) прерывания - что есть зло. С учетом того, что в энкодере будет дребезг - в это время ничего работать не будет.
А начнет пользователь крутить быстро - так вообще много чудес можно словить в устройстве, с таким количеством "важной" периферии, что не остается
свободных ног таймера.


Тут конечно все дело в частоте прерываний. У иеня максимальная 200 Герц значит 5 ms. Дьюти 50% - 2.5 ms между перепадами. Это достаточно большое время как мне кажется.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 29 2014, 08:30
Сообщение #26


Гуру
******

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



Цитата(Jenya7 @ Jul 29 2014, 10:15) *
Тут конечно все дело в частоте прерываний. У иеня максимальная 200 Герц значит 5 ms. Дьюти 50% - 2.5 ms между перепадами. Это достаточно большое время как мне кажется.

Да уж - ни туда, ни сюда.
Возможно, в этом случае опрос может проиграть EXTI.
Я бы все равно постарался подключить к таймеру.
Может, МК другой посмотреть: в F100 таймеров обычно больше (правда частота CPU до 24МГц).
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 29 2014, 10:29
Сообщение #27


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(adnega @ Jul 29 2014, 14:30) *
Может, МК другой посмотреть: в F100 таймеров обычно больше (правда частота CPU до 24МГц).

Даже на этом, я думаю, умудрюсь заремапить три пина на свободный таймер.

Но я не могу посчитать три канала на одном таймере.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 29 2014, 12:46
Сообщение #28


Гуру
******

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



Цитата(Jenya7 @ Jul 29 2014, 14:29) *
Но я не могу посчитать три канала на одном таймере.

А двух разве не достаточно?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 29 2014, 13:13
Сообщение #29


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(adnega @ Jul 29 2014, 18:46) *
А двух разве не достаточно?

есть системы с тремя моторами. кстати я и два посчитать не могу - каунтер регистр ведь один.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 29 2014, 13:41
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ПЛИС надо ставить...
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016