Семисегментный LED-индикатор. Эффекты анимации

Обсуждаем контроллеры компании Atmel.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

Demiurg, а в протеусе можно посмотреть , что получилось или видео выложить.
эффект (какой автор в начале рисовал) и циферки
я не очень понял как эффект рисовать?
это каждый эффект, как Вы все цифры надо от рисовать, а потом ими пользоваться?
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Я эффектами не занимался. Просто давно уже искал способ вывода на произвольные порты и пины. А точнее, как-то подзабросил эту тему. Я могу попробовать проектом-примером с эффектами, без ШИМ-а. Когда будет, не знаю. Просто, это ммм... скучно. Я знаю как это сделать, практической стороны для меня нет. Кстати, один из моих первых проектов был как раз автомат световых эффектов.
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

ясно. я подумал, что тема
Хотелось бы поэкспериментировать с этим индикатором в плане эффектов
и вопрос мой остался
это каждый эффект, как Вы все цифры надо от рисовать, а потом ими пользоваться?
:dont_know:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Написал пример. Эффект только один, как у тебя по кольцу, когда эффекты заканчиваются, девайс переходит в рабочий режим.
Алгоритм следующий. Таблица с кадрами. По таймеру закидываем в буфер кадры. Вот и все.
Прерывание только одно. Системного таймера. Все работает в основном цикле. По программным таймерам.
SEVEN_SEGM_PROJECT.rar
(461.12 КБ) 192 скачивания
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »



так должно быть? или я че напутал? (синий общий анод, красный катод) во вкладку положил протеус
Вложения
SEVEN_SEGM_PROJECT.rar
(494.37 КБ) 177 скачиваний
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Перепакуй в zip. Rar у тебя какой то, мой архиватор на компе, и на смартфоне даже, не берут.
Я не знаю, какой ты хотел сделать эффект. Сначала проверь мой проект, как есть, в протеусе. Отпишись. После этого начинай делать эффекты. Тебе в моем проекте это нужно сделать всего лишь в одном месте. В файле proc_device.c.
Обрати внимание. Нумерация общих выводов и сегментов у меня разделены. Это по порядку для программы, к нумерации пинов никакого отношения не имеет.
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

а так попробуйте
Вложения
SEVEN_SEGM_PROJECT.zip
(604.79 КБ) 153 скачивания
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Я уже переконвертировал. Где что меняли в программе, что не работает?
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

Сначала проверь мой проект, как есть, в протеусе
я ваш проект в протеусе и пробую
Обрати внимание. Нумерация общих выводов и сегментов у меня разделены
прошу прощения не обратил внимания на это в первом видео
Тебе в моем проекте это нужно сделать всего лишь в одном месте.
Спойлер//==================
#include "proc_device.h"
//==================

//==================
void proc_device (void)
{
static u08 _proc_device;

switch (_proc_device)
{
case 0: // Секция инициализации.
io_init ();

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Set_Commons_Level (HI);
Set_Segments_Level (LOW);

set_status (STATUS_EFFECTS);

// dsp_buf [0] = BV_S_A;
// dsp_buf [1] = BV_S_A;
// dsp_buf [2] = BV_S_A;
// dsp_buf [3] = BV_S_A;
// dsp_buf [4] = BV_S_A;
// dsp_buf [5] = BV_S_A;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

set_proc_7_segm_ind_on ();
set_proc_effects_on ();

_proc_device = 1;
break;

case 1:
if (Get_Event (EV_ID_EFFECTS_END))
{
set_status (STATUS_WORK);
set_proc_effects_off ();
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
dsp_buf [0] = 1;
dsp_buf [1] = 2;
dsp_buf [2] = 3;
dsp_buf [3] = 4;
dsp_buf [4] = 5;
dsp_buf [5] = 6;
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
_proc_device = 2;
return;
}

proc_effects ();
break;

case 2:
break;

case 3:
break;

default:
break;
}
}
//==================

//==================
void io_init (void)
{

}
//==================

//==================
u08 __flash tab_effects [126] =
{
BV_S_A, 0, 0, 0, 0, 0,
BV_S_A, BV_S_A, 0, 0, 0, 0,
BV_S_A, BV_S_A, BV_S_A, 0, 0, 0,
BV_S_A, BV_S_A, BV_S_A, BV_S_A, 0, 0,
0, BV_S_A, BV_S_A, BV_S_A, BV_S_A, 0,
0, 0, BV_S_A, BV_S_A, BV_S_A, BV_S_A,
0, 0, 0, BV_S_A, BV_S_A, BV_S_A | BV_S_B,
0, 0, 0, 0, BV_S_A, BV_S_A | BV_S_B | BV_S_C,
0, 0, 0, 0, 0, BV_S_A | BV_S_B | BV_S_C | BV_S_D,
0, 0, 0, 0, BV_S_D, BV_S_B | BV_S_C | BV_S_D,
0, 0, 0, BV_S_D, BV_S_D, BV_S_C | BV_S_D,
0, 0, BV_S_D, BV_S_D, BV_S_D, BV_S_D,
0, BV_S_D, BV_S_D, BV_S_D, BV_S_D, 0,
BV_S_D, BV_S_D, BV_S_D, BV_S_D, 0, 0,
BV_S_E | BV_S_D, BV_S_D, BV_S_D, 0, 0, 0,
BV_S_F | BV_S_E | BV_S_D, BV_S_D, 0, 0, 0, 0,
BV_S_F | BV_S_E | BV_S_D, 0, 0, 0, 0, 0,
BV_S_F | BV_S_E, 0, 0, 0, 0, 0,
BV_S_F, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};
//==================

//==================
static u08 _proc_effects;

void set_proc_effects_on (void)
{
_proc_effects = 1;
}

void set_proc_effects_off (void)
{
_proc_effects = 0;
}

void proc_effects (void)
{
static soft_timer ST_PROC_EFFECTS;

static u08 __flash *ptr = tab_effects;

switch (_proc_effects)
{
case 0: // Idle
break;

case 1:
set_soft_timer (ST_PROC_EFFECTS, STEP_EFFECTS, STEP_EFFECTS);
_proc_effects = 2;
break;

case 2:
if (handle_soft_timer (ST_PROC_EFFECTS))
{
if (*ptr == 0xFF)
{
Set_Event (EV_ID_EFFECTS_END, USER_EVENT);
_proc_effects = 0;
return;
}

for (u08 i = 0; i < MAX_LED_INDS; i++)
{
dsp_buf = *ptr++;
}
}
break;

default:
break;
}
}
//==================

попробую разобраться, а шестой разряд не светится. я опять чето не так подключил?
в какой программе Вы пишите, avr studio?
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

У меня все порты и пины прописаны в seven_segm_led_ind.h и комментарием особо прописано, что это пины мк.
Программа написана в IAR. Протеусом не пользуюсь. Отлаживаю проекты в симуляторе авр студио 4.19.
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Demiurg, про первоначальный вариант.
Мне так кажется или у вас на фото присутствует паразитная засветка?
Что бы заработало в протеусе пришлось поменять так
Спойлер

Код: Выделить всё

void handle_commons (void)
{
   u08 a = tab_bv [cnt_commons]; // Битовая позиция commons.

   //set_soft_timer (ST_PROC_7_SEGM_IND, 50, 0);
   set_soft_timer (ST_PROC_7_SEGM_IND, 3, 0);

   for (u08 i = 0; i < MAX_LED_INDS; i++)
   {
      if (commons_level == HI)
      {
         //if (a & (1<<0)) tab_commons_hi [i] ();
         //else            tab_commons_low [i] ();
         if (a & (1<<0)) tab_commons_low [i] ();
         else            tab_commons_hi [i] ();
      }
      else
      {
         //if (a & (1<<0)) tab_commons_low [i] ();
         //else            tab_commons_hi [i] ();
         if (a & (1<<0)) tab_commons_hi [i] ();
         else            tab_commons_low [i] ();
      }

      a >>= 1;
   }
}
У вас размер кода какой получается?
У меня получилось 902 байта,
а последний вариант работает в протеусе без проблем и размер кода 806 байт.
Правда из обоих код wdt выкинул.
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Засветка действительно есть. Разбираюсь с этим. Пробовал различные способы. Свои и по примеру ARV. Везде засветка. Открыл старый проект. В этом проекте общие выводы (ОА) на одном порту, сегменты (катоды) на другом. При этом управление катодами методом открытого стока, то есть управление только DDRx. В этом случае засветки нет.

Код: Выделить всё

         {
            ANODS_PORT = 0;
            KATODS_PORT = 0;
            KATODS_DDR = 0;

            volatile u08 anods;
            volatile u08 katods;

            anods = tab_commons_pins [cnt_commons];

            if (status == STATUS_EFFECTS)
               katods = dsp_buf [cnt_commons];
            else
               katods = tab_segments_pins [dsp_buf [cnt_commons]];

            ANODS_PORT = anods;
            KATODS_DDR = katods;

//            handle_commons ();
//            handle_segments ();

            if (++cnt_commons >= MAX_LED_INDS) cnt_commons = 0;
         }
Я как-то видел на форумах сообщения, что есть проблемы с управлением отдельными пинами, если правильно помню, установка пина происходит не сразу, а через определенное количество тактов. Есть но, эта проблема есть на относительно новых МК. Я же экспериментирую на ATMEGA8535.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3883865#p3883865"]Я как-то видел на форумах сообщения, что есть проблемы с управлением отдельными пинами, если правильно помню, установка пина происходит не сразу, а через определенное количество тактов.[/uquote]
Причем тут это? Допустим на последний разряд выводится '0', затем его отключаем и выводим на первый разряд '1', но отключение происходит побитно в медленном цикле одновременно с включением, во время первой итерации подключается первый разряд и на него тоже выводится '0', а после последней итерации отключается последний разряд и '0' выводится только на первый. Затем выполняется такое-же медленное переключение сегментов, конечно будет паразитная засветка.
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Засветку убрало только такое решение.
Спойлер

Код: Выделить всё

//--------------------------- Commons ------------------------------------
            clr_bit (COMM_1_DDR, C_1_OUT);
            clr_bit (COMM_2_DDR, C_2_OUT);
            clr_bit (COMM_3_DDR, C_3_OUT);
            clr_bit (COMM_4_DDR, C_4_OUT);
            clr_bit (COMM_5_DDR, C_5_OUT);
            clr_bit (COMM_6_DDR, C_6_OUT);
//--------------------------- Segments -----------------------------------
            clr_bit (SEGM_A_DDR, S_A_OUT);
            clr_bit (SEGM_B_DDR, S_B_OUT);
            clr_bit (SEGM_C_DDR, S_C_OUT);
            clr_bit (SEGM_D_DDR, S_D_OUT);
            clr_bit (SEGM_E_DDR, S_E_OUT);
            clr_bit (SEGM_F_DDR, S_F_OUT);
            clr_bit (SEGM_G_DDR, S_G_OUT);
            clr_bit (SEGM_H_DDR, S_H_OUT);
//------------------------------------------------------------------------

            handle_commons_temp ();
            handle_segments_temp ();

//--------------------------- Commons ------------------------------------
            set_bit (COMM_1_DDR, C_1_OUT);
            set_bit (COMM_2_DDR, C_2_OUT);
            set_bit (COMM_3_DDR, C_3_OUT);
            set_bit (COMM_4_DDR, C_4_OUT);
            set_bit (COMM_5_DDR, C_5_OUT);
            set_bit (COMM_6_DDR, C_6_OUT);
//--------------------------- Segments -----------------------------------
            set_bit (SEGM_A_DDR, S_A_OUT);
            set_bit (SEGM_B_DDR, S_B_OUT);
            set_bit (SEGM_C_DDR, S_C_OUT);
            set_bit (SEGM_D_DDR, S_D_OUT);
            set_bit (SEGM_E_DDR, S_E_OUT);
            set_bit (SEGM_F_DDR, S_F_OUT);
            set_bit (SEGM_G_DDR, S_G_OUT);
            set_bit (SEGM_H_DDR, S_H_OUT);
//------------------------------------------------------------------------
Управление пинами по индексу превращается невесть во что... Боюсь, придется отказаться от него... Хотя есть предположение. У меня в данный макет сделан с прямым подключением индикаторов к портам. Возможно, через транзисторы изменит картину.

Добавлено after 3 minutes 10 seconds:
ARV не торопитесь никогда утверждать так, как будто вы истина в последней инстанции. Научитесь не торопиться и проверять информацию. Я же это делаю. И мне не стыдно потом признавать, если я где-то ошибся или исходил из неверной информации.
То о чем я говорил, существует на тиньках, если не путаю. Надо найти эти топики на форумах.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

итерация динамической индикации должна состоять из трех этапов:
1. гасим все разряды путем выключения активных уровней на общих катодах/анодах
2. устанавливаем новое значение сегментов
3. устанавливаем активный уровень на очередном общем катоде/аноде

и никакой засветки никогда не будет. на первом этапе можно гасить только текущий катод/анод, для "разбросанных" линий это будет оптимальнее. если все общие на одном порту, проще гасить сразу все.
Demiurg писал(а):Научитесь не торопиться и проверять информацию
я черпаю информацию не с форумов, а из даташитов. а проверять форумы я не собираюсь. и вам не советую.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

[uquote="ARV",url="/forum/viewtopic.php?p=3883887#p3883887"]итерация динамической индикации должна состоять из трех этапов:
1. гасим все разряды путем выключения активных уровней на общих катодах/анодах
2. устанавливаем новое значение сегментов
3. устанавливаем активный уровень на очередном общем катоде/аноде

и никакой засветки никогда не будет. на первом этапе можно гасить только текущий катод/анод, для "разбросанных" линий это будет оптимальнее. если все общие на одном порту, проще гасить сразу все.[/uquote]
Разбираюсь. Пока программно, осциллограф после ремонта в квартире далеко закопан...
[uquote="ARV",url="/forum/viewtopic.php?p=3883887#p3883887"]я черпаю информацию не с форумов, а из даташитов. а проверять форумы я не собираюсь. и вам не советую.[/uquote]
Мы с вами оба взрослые люди, чтобы понимать от какой информации отталкиваться. То, про что я говорил, да, я узнал из форумов. Весь прикол в том, что эта информация была либо скрыта, либо еще что-то. Тогда шла активная переписка с инженерами ATMEL. На тот момент этой информации не было ни в даташитах ни в ERRATA.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ARV. Без эмоций и перехода на личности. Вы живете в каком-то своем мирке. Но весь остальной мир гораздо разнообразнее. Информация шла от человека, который в свое время был инженером ATMEL в России.

Добавлено after 2 minutes 9 seconds:
Убрал засветку. Осциллографа под руками не было, ставил задержки, не помогало. Тогда я сделал следующее. Сначала отключаем все общие выводы, затем все сегменты. Потом установка нового такта работы.
Спойлер

Код: Выделить всё

            volatile u08 *p;

            for (u08 i = 0; i < MAX_LED_INDS; i++)
            {
               p = commons_pins [i] .port;

               if (commons_level == HI)
                     *p &= (~commons_pins [i] .mask);
               else
                     *p |= commons_pins [i] .mask;
            }

            for (u08 i = 0; i < 8; i++)
            {
               p = segments_pins [i] .port;

               if (segments_level == HI)
                     *p &= (~segments_pins [i] .mask);
               else
                     *p |= segments_pins [i] .mask;
            }

            handle_commons_2 ();
            handle_segments_2 ();
Вот обсуждение, в топике ссылки. Ссылка 1, Ссылка 2.

Добавлено after 33 minutes 3 seconds:
Dimon456 Эксперимент закончен, я поразмялся, наигрался. Здесь последняя версия. В proba.c всякие заготовки. Пробуй.
Вложения
SEVEN_SEGM_PROJECT.rar
(495.19 КБ) 131 скачивание
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Demiurg писал(а):Засветку убрало только такое решение.
Ерунду несете, такое впечатление что это не вы.
Спойлер

Код: Выделить всё

void handle_commons_clr (void) {
	   for (u08 i = 0; i < MAX_LED_INDS; i++)
	   {
		   tab_commons_low [i] ();
	   }
}


      case 2:
         if (handle_soft_timer (ST_PROC_7_SEGM_IND))
         {
//            handle_commons_temp ();
//            handle_segments_temp ();

        	handle_commons_clr();	// выключаем все разряды
        	handle_segments ();		// меняем сегмент для следующего разряда
        	handle_commons ();		// включаем следующий разряд

            if (++cnt_commons >= MAX_LED_INDS) cnt_commons = 0;
         }
         break;
Ответить

Вернуться в «AVR»