Найти тему
DGO шпаргалка

Семисегментный индикатор на китайском CH32V003. Часть3.Работа над ошибками. Приближаемся к библиотеке.

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

Но тогда возникает ещё одна проблема - автоперезагрузка.

if(TIM_GetCounter(TIM1)==0){} //тут мы отслеживали начало каждого периода, а настройка производилась в установке периода перезагрузки.

При условии >=0 результат всегда будет - истина.

При условии >="интервал перезагрузки" мы всегда будем отслеживать только одно граничное значение и опять же не попадать

При условии >="интервал перезагрузки -несколько значений для гарантии попадания" мы будем гарантированно сокращать интервал и будем вынуждены вводить дополнительные условия для срабатывания функции только 1 раз за интервал.

Всё это говорит о том, что автоперезагрузка нам только мешает(или нет, но об этом позже). Выходом будет "ручная" перезагрузка по условию >="интервал перезагрузки" . Делается это при помощи функции TIM_SetCounter(TIM1, 0); - тут мы указываем таймер, к которому обращаемся и новое значение счетчика. Так просто можно заменить автоперезагрузку.

закомментированная автоперезагрузка
закомментированная автоперезагрузка

Обновленная функция main()
Обновленная функция main()

Было.
Было.

Стало.
Стало.

Работа стала значительно более стабильной.

Но автоперезагрузка нам дана не просто так. Это довольно удобный инструмент, который позволяет быстро настроить таймер и не мудрить с условиями, а просто отслеживать флаг статуса функцией TIM_GetFlagStatus( TIM1, TIM_FLAG_Update ). Может возвращать значения SET и RESET в зависимости от состояния таймера и эту функцию в дальнейшем можно использовать в прерываниях.

Инициализация таймера
Инициализация таймера

Обновленная функция main()
Обновленная функция main()

Теперь напишем небольшую функцию, которая будет выводить нужную нам цифру на индикатор:

Функция DGO_LED_Ind
Функция DGO_LED_Ind
Обновленная функция main()
Обновленная функция main()

Для того, чтобы символы выглядели как нужно сделал световод на 3д принтере и рассеиватель из бумажки для принтера, промазанной маслом. Снимать пришлось в темноте, слишком уж тускло светят диоды с резисторами 1 килоОм, а перепаивать смысла на прототипе нет.

Световод.
Световод.
Работа индикатора.
Работа индикатора.

На этом на сегодня всё. Следующим шагом будет динамическая индикация для двух таких индикаторов, оформление функции в полноценную библиотеку, и размещение исходников библиотеки на GIT. Буду рад комментариям.

Спасибо за внимание!

Первая часть

Вторая часть