Обсуждаем контроллеры компании Atmel.
Ответить

Re: AVR и светодиодный индикатор

Ср мар 13, 2019 10:41:21

при проблемах в коде дин. индикации сегмент светится не по всему экрану, а только на следующем (по ходу "развертки") разряде...

Re: AVR и светодиодный индикатор

Ср мар 13, 2019 10:50:32

Вот это и проверим.... А дальше - вольтметр в руки и смотреть, чего там творится...

Re: AVR и светодиодный индикатор

Ср мар 13, 2019 15:15:31

goldenandy алгоритм понял, спасибо. По результатам отпишусь. Разъяснили доходчиво :)

Re: AVR и светодиодный индикатор

Ср мар 27, 2019 21:37:07

Добрый вечер, уважаемые форумчане! Наконец получилась добраться до схемы. По Вашему совету, goldenandy, написал код вывода на индикатор
Код:
#include <avr/io.h>


int main(void)
{
   DDRC |= (1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3);
   DDRD |= (1 << PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3)|(1 << PD4)|(1 << PD5)|(1 << PD6)|(1 << PD7);
   
   PORTC |= (1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3);
   PORTD &= ~((1 << PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3)|(1 << PD4)|(1 << PD5)|(1 << PD6)|(1 << PD7));
   
    while (1)
    {
      
    }
}

Сначала отключил все разряды и сегменты, фото ниже
Изображение
А потом поочередно зажигал по одному разряду
Изображение Изображение Изображение Изображение
Понимаю, что проблема в плате. Но не могу врубиться, как ее отследить. Почему при выводе 4 и 3 разрядов, паразитной засветки 2 и 1 нет. А при выводе 1 и 2, паразитная засветка 3 и 4 есть
На последнем фото припаял резисторы обратно, и вывожу в первый разряд
Изображение
Вот запустил таймер, паразитной засветки нет, правда сегменты светятся слабее, чем одиночный разряд
Изображение

Re: AVR и светодиодный индикатор

Ср мар 27, 2019 21:54:00

Так.
На первой фотке слабо светятся все сегменты.
Проверяйте напряжения на эммитерах транзисторов, на базах и на выходах порта Ц.
Где-то есть напряжение, которое приоткрывает транзисторы.

Поочередное зажигание как ? динамической индикацией или кодом выше, только в порте Ц только один бит в 1 ?

Re: AVR и светодиодный индикатор

Ср мар 27, 2019 22:29:56

Поочередное зажигание делал статикой, как в коде выше, только убирал поочереди вывод 1 на каждом разряде.
Вопрос такой, мне нужно отключить плату индикации и измерить напряжение на выводах сегментов и разрядов? Потому что при подключении платы индикации к другому контроллеру все работает нормально. Згачит проблема в основной плате. Какую программу следует записать в контроллер, которая тушит все разряды?

Re: AVR и светодиодный индикатор

Ср мар 27, 2019 22:48:05

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

Re: AVR и светодиодный индикатор

Чт мар 28, 2019 00:17:07

На выходах порта С - 3,27В, на базах транзисторов - 4,31В, на эмиттерах - 4,99В, на коллекторах - 4,79В. Программа запущена таймера, выводится время.

Re: AVR и светодиодный индикатор

Чт мар 28, 2019 08:39:29

Если при выводе "по одному на весь дисплей" свечение индикатора отличается от работы в режиме "несколько цифр одновременно", то проблема явно в алгоритме программы.
Яркость свечения не зависит от того, сколько позиций активно.
Все сегменты должны иметь одинаковую яркость, независимо от того,сколько сегментов светятся одновременно.
В то же время суммарная яркость ессно зависит от количества одновременно светящихся сегментов.
Чем сегментов одинаковой яркости больше - тем суммарная яркость выше.
8)

Re: AVR и светодиодный индикатор

Чт мар 28, 2019 09:09:57

Мерять нужно в статике, когда у вас работает вот этот код
Код:
PORTC |= (1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3);
   PORTD &= ~((1 << PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3)|(1 << PD4)|(1 << PD5)|(1 << PD6)|(1 << PD7));
   while (1)  { }


У вас же даже при этом коде наблюдается свечение индикаторов, хотя они не должны гореть. И ищите, соответственно, почему у вас на базах транзисторов напряжение ниже питания. Хотя должно быть почти равно.
И да, проверьте, что у вас на питании контроллера. Точно ли +5 вольт приходят на Vcc и AVcc. Порт Ц питается от AVcc, проверьте, может там непропай и порт не может "вытянуть" положенные 5 вольт...

Re: AVR и светодиодный индикатор

Чт мар 28, 2019 09:26:35

Спасибо, вечером проверю и отпишусь.

Re: AVR и светодиодный индикатор

Чт мар 28, 2019 09:59:26

господа все проше идавно извесно проблема начала вылезать еше в калках НА ВЛИ потом ва часах на них-она чисто авпаратная отсутствие запирания по сеткам и подтяжки анодоф на минус питания ВЛИ кроме неприятности в темноте оно жрет ресурс индюка
в грамоттных КБ проблему сразу поняли и пофиксили установкой подтяжек хотя они и жрут часть энерги зря
а тупые поделки навроде старта таковое не имели да и не парился никто для самосборщикоф... с переходом на диоды проблема сначала не стояла изз низкой чуйки диодоф тех лет но сейчас когда индюк притоке 0,5ма светит весма заметно ве просто и заметно
начну с того что ключ ОЭ не идеален кроме утечек стть паразитные емкостя БЭ Кби эфект милера! поэтому ключик не пешит закрытся если подтяжка есть оно ослаабляет эфект
кроме того плохой тон не делать подтяжку бэ в транз. особеноключевых !gj [jhjotve управлять ключом нало через rcr цепь но я такое встречал толко парк раз
но вот подтяжку в промсхемах принято было делать всегда для этого даже разработали 4 и 8 ризисторные сборки и их широко применяют в пром устройствах
тоесть проблема медленых ключей чисто апаратная имет место быть ее частично можно
решить програмно как колега писал введением дедтайма между разрядами ну или поставит легкие мосфты вместо биполяра
но не то не другое не убирет апаратные утечки транзистороф и емкостя монтажа толко подтяжка апаратная их решает -внутреняя подтяжка кристала бесполезна!
номинал подтяжки дне должен превышать 4,7к!!! иначе она не эфективна
те бэ -обязателны если их нет это конструктивный косяк кстати к емкости транзюлей добавляется емкостя монтажа без подтядек еей не успеть разрядится за мертвое время

Re: AVR и светодиодный индикатор

Чт мар 28, 2019 20:16:58

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

Re: AVR и светодиодный индикатор

Пт мар 29, 2019 10:50:12

Разница между МК разве что в режиме включения подтягивающих резисторов на выводах портов возможна.
И то ... лишь в случае, когда имеется отдельный бит конфигурации, который одновременно ВСЕ подтяжки вырубает
да к тому же тот бит прораммно недоступен - ставится программатором (тогда от пересадки одной и той же прожки независимо будет).
:roll:

Re: AVR и светодиодный индикатор

Пт мар 29, 2019 18:29:53

Если изменить схемку, то усе нормально будет и даже в протеусе
СпойлерИзображение
с общим анодом
Код:
/*активный уровень сегмента 0 или 1*/
#define IND_ACTIVE_LEVEL_SEG   0

/*активный уровень разряда 0 или 1*/
#define IND_ACTIVE_LEVEL_DIG   1
с общим катодом
Код:
/*активный уровень сегмента 0 или 1*/
#define IND_ACTIVE_LEVEL_SEG   1

/*активный уровень разряда 0 или 1*/
#define IND_ACTIVE_LEVEL_DIG   0

Re: AVR и светодиодный индикатор

Пт мар 29, 2019 19:02:36

Добрый вечер, уважаемые коты! Хотел задать вопрос по организации кода в проекте. Я для хранения значений таймеров и состояния таймеров использую массив структур. И меня смущает момент обращения к полям структуры для сохранения измененных значений. Так как у меня используется 4 таймера, соответственно используются разные пункты меню для изменения значений настройки таймеров. И этот фрагмент кода написан неправильно.
Спойлерif (fConf) {
//Настройка таймера t1
if (menu == 11000) {
time[0].on_hour = EditHour(time[0].on_hour, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[0].on_hour, time[0].on_hour);
}
if (menu == 11001) {
time[0].on_min = EditMinute(time[0].on_min, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[0].on_min, time[0].on_min);
}
if (menu == 11010) {
time[0].off_hour = EditHour(time[0].off_hour, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[0].off_hour, time[0].off_hour);
}
if (menu == 11011) {
time[0].off_min = EditMinute(time[0].off_min, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[0].off_min, time[0].off_min);
}
if (menu == 1102) {
if (button == BTN_SHRT_RIGHT) {
if (time[0].work == 0) time[0].work = 1;
}

if (button == BTN_SHRT_LEFT) {
if (time[0].work == 1) time[0].work = 0;
}
if (eeprom_is_ready())
eeprom_update_byte(&t[0].work, time[0].work);
}
//Настройка таймера t2
if (menu == 11100) {
time[1].on_hour = EditHour(time[1].on_hour, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[1].on_hour, time[1].on_hour);
}
if (menu == 11101) {
time[1].on_min = EditMinute(time[1].on_min, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[1].on_min, time[1].on_min);
}
if (menu == 11110) {
time[1].off_hour = EditHour(time[1].off_hour, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[1].off_hour, time[1].off_hour);
}
if (menu == 11111) {
time[1].off_min = EditMinute(time[1].off_min, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[1].off_min, time[1].off_min);
}
if (menu == 1112) {
if (button == BTN_SHRT_RIGHT) {
if (time[1].work == 0) time[1].work = 1;
}

if (button == BTN_SHRT_LEFT) {
if (time[1].work == 1) time[1].work = 0;
}
if (eeprom_is_ready())
eeprom_update_byte(&t[1].work, time[1].work);
}
//Настройка таймера t3
if (menu == 11200) {
time[2].on_hour = EditHour(time[2].on_hour, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[2].on_hour, time[2].on_hour);
}
if (menu == 11201) {
time[2].on_min = EditMinute(time[2].on_min, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[2].on_min, time[2].on_min);
}
if (menu == 11210) {
time[2].off_hour = EditHour(time[2].off_hour, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[2].off_hour, time[2].off_hour);
}
if (menu == 11211) {
time[2].off_min = EditMinute(time[2].off_min, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[2].off_min, time[2].off_min);
}
if (menu == 1122) {
if (button == BTN_SHRT_RIGHT) {
if (time[2].work == 0) time[2].work = 1;
}

if (button == BTN_SHRT_LEFT) {
if (time[2].work == 1) time[2].work = 0;
}
if (eeprom_is_ready())
eeprom_update_byte(&t[2].work, time[2].work);
}
//Настройка таймера t4
if (menu == 11300) {
time[3].on_hour = EditHour(time[3].on_hour, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[3].on_hour, time[3].on_hour);
}
if (menu == 11301) {
time[3].on_min = EditMinute(time[3].on_min, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[3].on_min, time[3].on_min);
}
if (menu == 11310) {
time[3].off_hour = EditHour(time[3].off_hour, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[3].off_hour, time[3].off_hour);
}
if (menu == 11311) {
time[3].off_min = EditMinute(time[3].off_min, button);
if (eeprom_is_ready())
eeprom_update_byte(&t[3].off_min, time[3].off_min);
}
if (menu == 1132) {
if (button == BTN_SHRT_RIGHT) {
if (time[3].work == 0) time[3].work = 1;
}

if (button == BTN_SHRT_LEFT) {
if (time[3].work == 1) time[3].work = 0;
}
if (eeprom_is_ready())
eeprom_update_byte(&t[3].work, time[3].work);
}

Может кто-то подскажет, как бы его было написать более правильно. Так как используются разные пункты меню, то соответственно пришлось по каждому параметру настройки таймера делать отдельный код. Хотя фактически он повторяется

Re: AVR и светодиодный индикатор

Пн апр 01, 2019 10:41:06

Добрый день, что-то все молчат. Может кто-то посоветует, как лучше все таки сохранять настройки таймеров. А то при изменение минут и часов каждого таймера приходится писать слишком много разного кода, как бы это все дело оптимизировать?

Re: AVR и светодиодный индикатор

Пн апр 01, 2019 10:52:32

Описали структуру с параметрами таймера.
Создали массив таких структур.
Создали функцию, которая получает на входе указатель на структуру таймера (или номер этой структуры в массиве), и изменяет эту структуру.
Вызываете эту функцию из пунктов меню с нужным указателем (или номером).
В чем проблема?

Re: AVR и светодиодный индикатор

Пн апр 01, 2019 10:53:35

Сколько условий, кошмар ... :facepalm:
Сделайте лучше через switch-case, быстрее код будет выполняться.

По поводу таймеров и оптимизации кода - не понятно. Что Вы хотите соптимизировать ?
Хоть и код в условиях примерно одинаковый, условия то разные. Единственное, что напрашивается, - таблица с перебором в цикле. Но, время выполнение такого кода будет даже больше текущего варианта.

Re: AVR и светодиодный индикатор

Пн апр 01, 2019 11:03:44

да, кстати... проверку eeprom_is_ready() перед вызовом функций работы с EEPROM делать не надо - она там уже встроена. эта проверка требуется только в случаях работы с EEPROM в обработчиках прерываний и/или перед тем, как перевести МК в режим SLEEP_POWER_DOWN.
Ответить