Easyelectronics.ru

Электроника для всех
Текущее время: 12 ноя 2018, 23:41

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Столкновения таймеров?
СообщениеДобавлено: 20 окт 2018, 14:03 
Здравствуйте!

Зарегистрирован: 20 окт 2018, 13:51
Сообщения: 3
Всем привет!

Использую 2 таймера - TIM4 и TIM2, проц stm8L. TIM4 считает миллисы, TIM2 генерит PPM сигнал. Cosmic+STM Develop+SPL. Все хорошо если в массив значений каналов подавать константу, но если довольно активно в бесконечном цикле в основном теле программы менять эти значения, то генерация останавливается спустя какое-то время, вывод данных в порт идет нормально. Или если менять delay_ms(1000); на delay_ms(10); то PPM тоже прекращается намного быстрее. В чем может быть дело? Прерывания сталкиваются?
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Столкновения таймеров?
СообщениеДобавлено: 20 окт 2018, 15:25 
Старожил

Зарегистрирован: 28 янв 2012, 21:27
Сообщения: 298
Откуда: Питер
Обращения к данным, которые используются и в основном коде, и в прерываниях, нужно синхронизировать! Иначе возможно т.н. "состояние гонки".
В вашем случае, в основном цикле, записывается значение переменной ppm. Записывается оно не одним махом, а НЕСКОЛЬКИМИ командами. И где-нибудь в этот момент возникает 19-е прерывание, которое считывает эту переменную. А в переменной каша, может даже 0.
Короче, либо запрещайте 19-е прерывание, пока меняете значение переменной ppm, либо делайте отложенное прерывание в основном цикле.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Столкновения таймеров?
СообщениеДобавлено: 20 окт 2018, 18:22 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2931
Откуда: КЧР, поселок Нижний Архыз
Как-то через одно место это все сделано! Можно ведь связать таймеры. Или на крайняк в прерывании, считающем миллисекунды, в нужный момент запускать четвертый таймер в режиме OPM, тогда будет импульс нужной длины без косяков.
И комбинация SPL и STM8 — полный же бред!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Столкновения таймеров?
СообщениеДобавлено: 20 окт 2018, 19:17 
Здравствуйте!

Зарегистрирован: 20 окт 2018, 13:51
Сообщения: 3
BBS, спасибо за совет.

Сделал блокировку чтения из массива на момент записи в него. Теперь если занято, то читает старые данные из другого массива.
Код:
INTERRUPT_HANDLER(IRQ_Handler_TIM2, 19)
{
   static bool state = 1;
   static uint8_t _channel;
   static uint16_t _calc_rest;

      
   //TIM2_SetCounter(0);
         
         
   if (state)
      {  //start pulse
         setPWMPin(onState);
         TIM2_SetAutoreload(PULSE_LENGTH*2);
         state = 0;
      }
   else
      {  //end pulse and calculate when to start the next pulse
 
         setPWMPin(!onState);
         state = 1;
   
         if(_channel >= CHANNEL_NUMBER)
         {
            _channel = 0;
            _calc_rest = _calc_rest + PULSE_LENGTH;
            TIM2_SetAutoreload((FRAME_LENGTH - _calc_rest)*2);
            _calc_rest = 0;
         }
         else
         {
            if (ppm_ready)
               {
                  TIM2_SetAutoreload((PPM[_channel] - PULSE_LENGTH)*2);
                  _calc_rest = _calc_rest + PPM[_channel];
                                                oldPPM[_channel] = PPM[_channel];
               }
            else
               {
                  TIM2_SetAutoreload((oldPPM[_channel] - PULSE_LENGTH)*2);
                  _calc_rest = _calc_rest + oldPPM[_channel];
               }
         
            _channel++;
         }     
         
      
      }
            
      TIM2_ClearITPendingBit(TIM2_IT_Update);
}


Но проблема не ушла. Насколько я понимаю это прерывание имеет приоритет выше основной программы и выше прерывания таймера 4. Значит должно исполняться всегда. А у меня происходит наоборот - генерация прекращается, а printf из главной программы работает.

@Eddy_Em, интересная идея с запуском таймера в режиме OPM. Подумаю, может осилю =)


Последний раз редактировалось MonZon 21 окт 2018, 23:37, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Столкновения таймеров?
СообщениеДобавлено: 21 окт 2018, 16:10 
Старожил

Зарегистрирован: 28 янв 2012, 21:27
Сообщения: 298
Откуда: Питер
Довольно странная блокировка, смущает строка oldPPM[_channel] = PPM[_channel];, не зависящая от ppm_ready.
Чтобы не играть в угадайку, гляньте в отладке, как меняются регистры таймера после остановки генерации?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Столкновения таймеров?
СообщениеДобавлено: 21 окт 2018, 23:39 
Здравствуйте!

Зарегистрирован: 20 окт 2018, 13:51
Сообщения: 3
Вы правы, поправил в предыдущем листинге.

UPDATE: Нашел ошибку - с прерываниями все в порядке. Дело было в алгоритме вычисления длины импульсов. Спасибо за помощь и терпение к новичкам!


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

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


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

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


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

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

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