Я эффектами не занимался. Просто давно уже искал способ вывода на произвольные порты и пины. А точнее, как-то подзабросил эту тему. Я могу попробовать проектом-примером с эффектами, без ШИМ-а. Когда будет, не знаю. Просто, это ммм... скучно. Я знаю как это сделать, практической стороны для меня нет. Кстати, один из моих первых проектов был как раз автомат световых эффектов.
Написал пример. Эффект только один, как у тебя по кольцу, когда эффекты заканчиваются, девайс переходит в рабочий режим.
Алгоритм следующий. Таблица с кадрами. По таймеру закидываем в буфер кадры. Вот и все.
Прерывание только одно. Системного таймера. Все работает в основном цикле. По программным таймерам.
Перепакуй в zip. Rar у тебя какой то, мой архиватор на компе, и на смартфоне даже, не берут.
Я не знаю, какой ты хотел сделать эффект. Сначала проверь мой проект, как есть, в протеусе. Отпишись. После этого начинай делать эффекты. Тебе в моем проекте это нужно сделать всего лишь в одном месте. В файле proc_device.c.
Обрати внимание. Нумерация общих выводов и сегментов у меня разделены. Это по порядку для программы, к нумерации пинов никакого отношения не имеет.
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?
У меня все порты и пины прописаны в seven_segm_led_ind.h и комментарием особо прописано, что это пины мк.
Программа написана в IAR. Протеусом не пользуюсь. Отлаживаю проекты в симуляторе авр студио 4.19.
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 выкинул.
Засветка действительно есть. Разбираюсь с этим. Пробовал различные способы. Свои и по примеру ARV. Везде засветка. Открыл старый проект. В этом проекте общие выводы (ОА) на одном порту, сегменты (катоды) на другом. При этом управление катодами методом открытого стока, то есть управление только DDRx. В этом случае засветки нет.
Я как-то видел на форумах сообщения, что есть проблемы с управлением отдельными пинами, если правильно помню, установка пина происходит не сразу, а через определенное количество тактов. Есть но, эта проблема есть на относительно новых МК. Я же экспериментирую на ATMEGA8535.
[uquote="Demiurg",url="/forum/viewtopic.php?p=3883865#p3883865"]Я как-то видел на форумах сообщения, что есть проблемы с управлением отдельными пинами, если правильно помню, установка пина происходит не сразу, а через определенное количество тактов.[/uquote]
Причем тут это? Допустим на последний разряд выводится '0', затем его отключаем и выводим на первый разряд '1', но отключение происходит побитно в медленном цикле одновременно с включением, во время первой итерации подключается первый разряд и на него тоже выводится '0', а после последней итерации отключается последний разряд и '0' выводится только на первый. Затем выполняется такое-же медленное переключение сегментов, конечно будет паразитная засветка.
Управление пинами по индексу превращается невесть во что... Боюсь, придется отказаться от него... Хотя есть предположение. У меня в данный макет сделан с прямым подключением индикаторов к портам. Возможно, через транзисторы изменит картину.
Добавлено after 3 minutes 10 seconds: ARV не торопитесь никогда утверждать так, как будто вы истина в последней инстанции. Научитесь не торопиться и проверять информацию. Я же это делаю. И мне не стыдно потом признавать, если я где-то ошибся или исходил из неверной информации.
То о чем я говорил, существует на тиньках, если не путаю. Надо найти эти топики на форумах.
итерация динамической индикации должна состоять из трех этапов:
1. гасим все разряды путем выключения активных уровней на общих катодах/анодах
2. устанавливаем новое значение сегментов
3. устанавливаем активный уровень на очередном общем катоде/аноде
и никакой засветки никогда не будет. на первом этапе можно гасить только текущий катод/анод, для "разбросанных" линий это будет оптимальнее. если все общие на одном порту, проще гасить сразу все.
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. Без эмоций и перехода на личности. Вы живете в каком-то своем мирке. Но весь остальной мир гораздо разнообразнее. Информация шла от человека, который в свое время был инженером ATMEL в России.
Добавлено after 2 minutes 9 seconds:
Убрал засветку. Осциллографа под руками не было, ставил задержки, не помогало. Тогда я сделал следующее. Сначала отключаем все общие выводы, затем все сегменты. Потом установка нового такта работы.
Спойлер
Добавлено after 33 minutes 3 seconds: Dimon456 Эксперимент закончен, я поразмялся, наигрался. Здесь последняя версия. В proba.c всякие заготовки. Пробуй.