Перейти к содержанию

Динамическая Индикация


Vitaliy129

Рекомендуемые сообщения

Всем добрый вечер. Проблема следующая. Есть плата STM32VL Discovery. К ней цепляется з-х разрядный семисегментный индикатор. Цифры предполагается выводить динамически. Но при выводе первого разряда вместе с ним подсвечивается и второй, при выводе 2-го подсвечивается 3-й и соответственно при выводе 3-го подсвечивается 1-й. Пробовал различные частоты вывода и применять задержки между выключением предыдущего индикатора и включением последующего. В чём может быть дело??? На Си только начинаю программировать, поэтому код скорее всего не эффективный, но всё же.

Жду ваших ответов.


#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#define IND_PORT GPIOA// This port is responsible for the display of "IND_PORT"
#define D1 GPIO_Pin_0//This conclusion is responsible for 1st indicator
#define D2 GPIO_Pin_1//This conclusion is responsible for 2nd indicator
#define D3 GPIO_Pin_2//This conclusion is responsible for 3rd indicator
// A segment of the indicator - the output of the microcontroller
#define SEG_A GPIO_Pin_0// seg "A"
#define SEG_B GPIO_Pin_1// seg "B"
#define SEG_C GPIO_Pin_2// seg "C"
#define SEG_D GPIO_Pin_3// seg "D"
#define SEG_E GPIO_Pin_4// seg "E"
#define SEG_F GPIO_Pin_5// seg "F"
#define SEG_G GPIO_Pin_6// seg "G"
#define DP GPIO_Pin_7   //Decimal point
// Create the numbers of segments
#define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F )
#define DIG1 ( SEG_B | SEG_C )
#define DIG2 ( SEG_A | SEG_B | SEG_G | SEG_E | SEG_D )
#define DIG3 ( SEG_A | SEG_B | SEG_G | SEG_C | SEG_D )
#define DIG4 ( SEG_F | SEG_G | SEG_B | SEG_C)
#define DIG5 ( SEG_A | SEG_F | SEG_G | SEG_C | SEG_D )
#define DIG6 ( SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G )
#define DIG7 ( SEG_A | SEG_B | SEG_C )
#define DIG8 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define DIG9 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
#define ALL_PINS (DIG8 | D1 | D2 | D3 )

// Delay
void Delay (void);
void Delay (void)
{
 unsigned long i;
 for (i=0; i<20000; i++);
}
//


#define TIMER_PRESCALER 720
uint8_t previousState;
uint8_t IND_State;
GPIO_InitTypeDef port;//???
TIM_TimeBaseInitTypeDef timer;
uint8_t counter1;
uint8_t counter2;
uint8_t counter3;
uint8_t rez;
uint8_t digit;

void digit_to_port (uint8_t digit){
uint8_t digitsp[]={DIG0,DIG1,DIG2,DIG3,DIG4,DIG5,DIG6,DIG7,DIG8,DIG9};
IND_PORT->ODR &= ~DIG8;
IND_PORT->ODR |= digitsp[digit];
}
//

void initAll()
{
 GPIO_InitTypeDef port;//???
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //On port "A"
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //On port "B"
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //On timer "Tim 4"

 GPIO_StructInit(&port);
//Port "A" input
   port.GPIO_Mode = GPIO_Mode_Out_PP;  
   port.GPIO_Pin = DIG8 | DP; 
   port.GPIO_Speed = GPIO_Speed_2MHz;  
   GPIO_Init(GPIOA, &port);

//Port "B" output
 port.GPIO_Mode = GPIO_Mode_Out_PP;
 port.GPIO_Pin =D1 | D2 | D3;
 port.GPIO_Speed = GPIO_Speed_2MHz; 
 GPIO_Init(GPIOB, &port); 
// Timer
 TIM_TimeBaseStructInit(&timer);
   timer.TIM_Prescaler = TIMER_PRESCALER;
   timer.TIM_Period = 5000;
   TIM_TimeBaseInit(TIM4, &timer);
}

//
int main()
{
   __enable_irq();
   initAll();
   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
   TIM_Cmd(TIM4, ENABLE);
   NVIC_EnableIRQ(TIM4_IRQn);
 IND_State=1;
 counter1=1;
 counter2=2;
 counter3=7;
   while(1)
   {
__NOP();
   } 
}
//


void TIM4_IRQHandler()
{

   if (IND_State == 1)
   {
  GPIO_ResetBits(GPIOB, D1|D2|D3);
  GPIO_ResetBits(GPIOA,  DIG8);
  Delay();
  IND_State=2;

  GPIO_SetBits(GPIOB, D1);

  digit_to_port(counter1);
  timer.TIM_Period = 50000;
  TIM_TimeBaseInit(TIM4, &timer);
  TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
 }
 else
 {
  if (IND_State == 2)
  {
  GPIO_ResetBits(GPIOB,  D1|D2|D3);
  GPIO_ResetBits(GPIOA,  DIG8);
  Delay();
  IND_State=3;
  GPIO_SetBits(GPIOB, D2);

  digit_to_port(counter2);
  timer.TIM_Period = 50000;
  TIM_TimeBaseInit(TIM4, &timer);
  TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
  }
  else
  {
  GPIO_ResetBits(GPIOB,  D1|D2|D3);
  GPIO_ResetBits(GPIOA,  DIG8);
  Delay();
  IND_State=1;
  GPIO_SetBits(GPIOB, D3);

  digit_to_port(counter3);
  timer.TIM_Period = 50000;
  TIM_TimeBaseInit(TIM4, &timer);
  TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
  }
 }
}  

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

В код не вникал, но подобная проблема у меня была с СД матрицей 8х8. Попробуй так:

1. Гасим все разряды

2. Устанавливаем значение порта А (сегменты)

3. Включаем нужный пин порта В (разряд индикатора)

4. Пауза

5. Переход в п.1

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Так попробуй:

GPIO_ResetBits(GPIOB, D1|D2|D3);
GPIO_ResetBits(GPIOA, DIG8);
GPIO_SetBits(GPIOB, D2);
Delay();
IND_State=3;

ПС Зачем куча "ифов", используй switch или что там в вашей среде типа select case?

ПСПС Дин.индикацию обычно организуют, используя прерывания по таймеру.

Изменено пользователем КЭС
Ссылка на комментарий
Поделиться на другие сайты

"Дин.индикацию обычно организуют, используя прерывания по таймеру." Она и организована по прерыванию от таймера. Функция Delay() введена для попытки сделать небольшое "мёртвое" время между переключениями., По поводу "if" я только начинаю программировать и не сильно знаком с СИ и этим МК.

Изменено пользователем Vitaliy129
Ссылка на комментарий
Поделиться на другие сайты

GPIO_ResetBits(GPIOB, D1|D2|D3); достаточно поставить один раз, в начале прерывания, до проверки такта.

GPIO_ResetBits(GPIOA, DIG8); вообще необязательно, достаточно сменить значение на новое (без предварительного обнуления)

А уже после проверки такта выставить GPIO_SetBits(GPIOB, D3);

Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...

Я вот сегодня , 5 минут назад запустил 3 разрядный индикатор от СТМки : )) Счастья то сколько! А функция писалась еще для ПИКа.

Прикрепляю работающий проект под STM32F051R8

Также куски кода:

void led_out (){

clear_leds; // digit off

switch (y) // select digit
{

case 0:

IND_PORT->ODR = led_buff[0];
digit_1;
break;
case 1:

IND_PORT->ODR = led_buff[1];
digit_2;
break;

case 2:

IND_PORT->ODR = led_buff[2];
digit_3;
break;

}
if (++y>2)y=0;
}

Функция для вывода в порт данных из массива

void indication_func()
{


temp1 = temp;

temp_lcd1=temp_lcd2=temp_lcd3=0;
while (temp1>99)
{
temp1-=100;
temp_lcd3++;
}

while (temp1>9)
{
temp1-=10;
temp_lcd2++;
}

while (temp1<10 && temp1!=0)
{
temp1--;
temp_lcd1++;
}

if(temp<10)
{
led_buff[2]=led_table[temp_lcd1];
led_buff[1]=led_table[10];
led_buff[0]=led_table[10];
}
else if(temp>9 && temp<100)
{
led_buff[1]=led_table[temp_lcd1];
led_buff[2]=led_table[temp_lcd2];
led_buff[0]=led_table[10];
}
else if(temp>99)
{
led_buff[0]=led_table[temp_lcd1];
led_buff[1]=led_table[temp_lcd2];
led_buff[2]=led_table[temp_lcd3];
}

led_out();
}

Функция разложения числа на разряды

Delay(1);
indication_func();
if(timer>5){temp++; timer=0;}
timer++;

Просто крутим по кругу переменную

Код крутится в вечном цикле (просто тестировал, учился, игрался) но его очень легко закинуть в прерывания системного таймера, или любого другого.

Теперь точно буду перелазить на STM32!!!

обучение STM32F051R8.rar

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Вероятно, в разделе "Работа" вам помогут. При условии предоставления чёткого и недвусмысленного технического задания.
    • Привет кто это еще читает. Знакомый купил в Москве по адекватной цене пару  B615D, дал на диагностику перед уверенной эксплуатацией. Одна сразу в защите, большой динамик спален, усилители на высокоомную нагрузку поют, буду позже разбираться. А вот вроде бы вполне работоспособная не сдюжила и 10 минут на хорошей мощности на плотном прогрессиве. Вылетели ключи в БП и драйвера на MMBTA56. Видно что был в ремонте, возможно ключи оказались палёнкой. Есть мысль впаять вместо FQPF13N50  чуток помощней по току 18N50-e. По параметру Qg аналогичные, а по  Сg будут потяжелей, 2350пф против 1800 у 13н50-х. 
    • Ну так теперь фигня вопрос. Проверить, что кнопки невозможно замкнуть одновременно, да определить, на какой ток транзисторы нужны. По характеристикам мотора или по максимально-допустимому току диодов D1-D4. Навскидку, моторчик низковольтный, диоды тоже. Транзисторы тогда на PBSS4350 можно заменить. Они на Али почти задаром продаются.
    • Сами же понимаете, что так не может быть. Или нет "сквозняка", или схема неправильно собрана, элементы не те, битые и пр., и схема защиты не работает. Проверьте сначала работу защёлки защиты при питании от 15 В, отпаяв R19 и подавая туда медленно увеличивающееся напряжение до 1,5 - 2 В (можно с потенциометра ом на 100-500). Добейтесь, чтобы работала. Порог срабатывания измерьте. Пересчитайте в ток через резистор 0,1 Ом. Соответствует ли "правильному"? Проверьте, что у этого резистора сопротивление действительно 0,1 Ом. Запаяйте 0,1 Ом обратно. Напишите, какая лампочка. А то мало ли какая, может она не от "сквозняка", а от броска тока заряда С18 С16 мигает. Транзисторы ключей проверьте. Впаяйте вместо первичной трансформатора резистор ом 150 - 300, чтобы ток с ключей в этот "эквивалент трансформатора" не больше 50-100 мА был. Посмотрите форму напряжения на выходе ключей, в точке соединения С16 и С18, на питании после лампочки. Ищите, где ляп. Умозрительно подсказать можно только по каким-то измеренным данным. Кроме вас никто их не добудет. В общем, как в анекдоте: - Молодой человек, ну делайте же уже хоть что-нибудь!
    • Ну так можно увеличить глубину ООС, тем самым понизив чувствительность и повысив линейность
    • Судя по этой картинке   в трухе передней панели под выступающие болты и шишки паек ЗК динамиков выковыряныфрезерованы выемки, иначе бы динамики так плотно не прилегали бы к ДВП.    А оно тебе надо? "Работает - не мешай"(с)/это уже аксиома, не требующая доказательств/ , пытаясь сделать лучше, чем сделано на заводе. Сanton-ят, т.е. поют, и лучше, чем есть, тебе не сделать. Ну перенесёшь ты динамики наружу, а что тебе это даст? Кроме того, что при попытке их продать(а продавать их когда-нибудь придётся, т.к. эта акустика бюджетного сегмента без потуг на высший класс Hi-Fi) , тебе придётся объяснять потенциальному покупателю причину, по которой какой-то умник заколхозил такую переделку с акустикой, ты ничего хорошего не получишь. Задуманная тобой переделка - это по сути возня ради возни. 
×
×
  • Создать...