Например TDA7294

Форум РадиоКот • Просмотр темы - F042, таймер и странное поведение мигалок
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 17:14:33

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


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: F042, таймер и странное поведение мигалок
СообщениеДобавлено: Пт янв 15, 2021 23:07:38 
Открыл глаза
Аватар пользователя

Зарегистрирован: Вт июл 07, 2015 21:00:35
Сообщений: 67
Рейтинг сообщения: 0
Добрый вечер.

Пытаюсь написать таймер для конечных автоматов и вот какая странность.
Настроил таймер на 1мс.
Прерывание от таймера простейшее:
Код:
extern uint32_t blinkMS;
void TIM14_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&htim14);

  if( blinkMS > 0 )
     blinkMS--;
}


Первый вариант мигалки, он работает:
Родил такое от безысходности, в приступе вдохновения :oops:
Спойлер
Код:
  uint8_t on = 0;
  while (1)
  {
     if( blinkMS <= 20 && blinkMS > 10 && !on )
     {
        HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
        on = 1;
     }

     if( blinkMS <= 10 && on)
     {
        HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
        on = 0;
     }

     if( blinkMS == 0 )
        blinkMS = 20;

  }


А вот второй, по смыслу такой же, не пашет. TogglePin вызывается только один раз и все, больше туда не заходит.
Спойлер
Код:
  while (1)
  {
     if( blinkMS == 0 )
     {
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
        blinkMS = 1000;
     }
  }


Зато, если его немного переиначить и сделать так:
Спойлер
Код:
  while (1)
  {
     if( blinkMS == 0 )
     {
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
     }

     if( blinkMS == 0 )
     {
        blinkMS = 1000;
     }
  }

То он начинает мигать, но очень хаотично, импульсы нестабильны и отличаются по длине в 1.5-2 раза.

Вопрос: что за фигня творится и как это победить?!

Фото первой и третьей мигалок прилагаю:
Изображение Изображение

P.S. Вариант с запретом/разрешением прерывания ничего не менят.
СпойлерХаотичные импульсы:
Код:
if( blinkMS == 0 )
     {
        NVIC_DisableIRQ(TIM14_IRQn);
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
     }

     if( blinkMS == 0 )
     {
        blinkMS = 10;
        NVIC_EnableIRQ(TIM14_IRQn);
     }


Так, не работает вообще. Как вариант №2.
Код:
if( blinkMS == 0 )
     {
        NVIC_DisableIRQ(TIM14_IRQn);
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
        blinkMS = 10;
        NVIC_EnableIRQ(TIM14_IRQn);
     }


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: F042, таймер и странное поведение мигалок
СообщениеДобавлено: Пт янв 15, 2021 23:24:57 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 1
Volatile для blinkMS добавь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: F042, таймер и странное поведение мигалок
СообщениеДобавлено: Сб янв 16, 2021 15:35:10 
Сверлит текстолит когтями

Карма: -10
Рейтинг сообщений: 93
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1150
Рейтинг сообщения: 0
Спойлер
Код:
  uint8_t on = 0;
  while (1)
  {
     if( blinkMS <= 20 && blinkMS > 10 && !on )
     {
        HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
        on = 1;
     }

     if( blinkMS <= 10 && on)
     {
        HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
        on = 0;
     }

     if( blinkMS == 0 )
        blinkMS = 20;

  }
Если добавите volatile для blinkMS, то blinkMS нужно копировать в локальную переменную в начале цикла один раз. И потом работать только с её копией.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

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


Кто сейчас на форуме

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


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

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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y