Easyelectronics.ru

Электроника для всех
Текущее время: 24 окт 2020, 20:15

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Задержки на SysTick внутри обработчика прерывания, дребезг
СообщениеДобавлено: 01 окт 2012, 22:26 
Только пришел

Зарегистрирован: 01 окт 2012, 22:11
Сообщения: 8
Доброго времени суток.
1. Пытаюсь прикрутить delay на SysTick. При вызове из main все работает корректно, но стот же вызвать из обработчика прерывания происходит зацикливание.
Код:
Код:
SysTick_Config(SystemCoreClock /1000);

Код:
void Delay( unsigned int Val) {   
   SysTickDelay = Val;   
   while (SysTickDelay != 0) {
   };   
}

Код:
void SysTick_Handler(void) {   
    if (SysTickDelay != 0) {   
         SysTickDelay--;   
    }   
}



2. Т.к. использовать задержки в обработчиках прерываний не есть хорошо, подскажите пожалуйста как лучше обработать дребезг контактов с использованием задержки и внешнего прерывания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержки на SysTick внутри обработчика прерывания, дребезг
СообщениеДобавлено: 01 окт 2012, 22:47 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
_NemO_ писал(а):
Доброго времени суток.
1. Пытаюсь прикрутить delay на SysTick. При вызове из main все работает корректно, но стот же вызвать из обработчика прерывания происходит зацикливание.


Ясное дело, у систика приоритет скорее всего меньше, поэтому прерывание просто не обрабатывается, пока не выскочишь из текущего. Можно было бы понастраивать приоритеты, но рано, вложенные прерывания для такого случая - некошерно

_NemO_ писал(а):
2. Т.к. использовать задержки в обработчиках прерываний не есть хорошо, подскажите пожалуйста как лучше обработать дребезг контактов с использованием задержки и внешнего прерывания.

Либо отключать прерывание на ножке на некоторое время, либо выставлять флаг, по которому просто завершать обработчик прерывания без последствий.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержки на SysTick внутри обработчика прерывания, дребезг
СообщениеДобавлено: 02 окт 2012, 15:22 
Только пришел

Зарегистрирован: 01 окт 2012, 22:11
Сообщения: 8
Steel.ne писал(а):
Ясное дело, у систика приоритет скорее всего меньше, поэтому прерывание просто не обрабатывается, пока не выскочишь из текущего. Можно было бы понастраивать приоритеты, но рано, вложенные прерывания для такого случая - некошерно

Приоритеты прерываний оставил по умолчанию (читай не настраивал). Буду разбираться сегодня с этим.
Сразу вопрос: можно ли настроить приоритеты так, что-бы EXTI_9_5 и EXTI_15_10 имели одинаковый приоритет, не перебивали друг друга и и одно выполнялось после завершения второго и наоборот.

Коротко опишу задачу:
- 10 входных линий разбиты на 2 группы по 5.
- одновременно может поступать 2 сигнала: по одному на одну группу
- сигнал представляет собой пачку импульсов (меандр) с частотой до 100 Гц
- нужно посчитать кол-во пришедших импульсов, знать на какую ногу они пришли
- по истечении таймаута отправить данные в модем по USART
- получение времени по NTP и занесение во внутренние RTC

Из того что написано: инициализированы порты, счетчики, прерывания; ипульсы считаются внешними прерываниями по уровню ( в обработчике проверяем кто сгенерировал прерывания, увеличиваем значение счетчика), по последнему импульсу в пачке включаем таймер, по прерыванию которого что-то делаем (шлем в USART, но еще не написал).

Меня смущает то, что во время передачи наддых по USART после того как отработал один счетчик (для одной группы) пожет начаться генерация импульсов во второй группе, которые нельзя пропускать и придется прерываться в передаче по USART.
Есть ли подводные камни?

Steel.ne писал(а):
Либо отключать прерывание на ножке на некоторое время, либо выставлять флаг, по которому просто завершать обработчик прерывания без последствий.

Я имею ввиду как реализовать задержку в main, но испоьзовать EXTI.
В обработчике прерывания сбрасываем флаг прерывания (отработали),выставляем флаг(свой), запрещаем прерывание по этому входу, выходим из прерывания, в main проверяем флаг и если true то инкриментируем переменную счетчика, делаем задержку, разрешаем внешнее прерывание, которое заблокировали?

PS: изучаю Cortex M3, STM32 в частности и C недели 2-3.
Спасибо, что помогаете!

код (выкладываю как есть, кое что не дописано (EXTI для всех линий), кое что написано для промежуточной отладки: в данный момент мигаем светоиодом вместо отправки по USART):
Show код


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB