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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

при проблемах в коде дин. индикации сегмент светится не по всему экрану, а только на следующем (по ходу "развертки") разряде...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Аватара пользователя
GoldenAndy
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA
Контактная информация:

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

Сообщение GoldenAndy »

Вот это и проверим.... А дальше - вольтметр в руки и смотреть, чего там творится...
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Реклама
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

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

Сообщение melandr »

goldenandy алгоритм понял, спасибо. По результатам отпишусь. Разъяснили доходчиво :)
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

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

Сообщение melandr »

Добрый вечер, уважаемые форумчане! Наконец получилась добраться до схемы. По Вашему совету, 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 есть
На последнем фото припаял резисторы обратно, и вывожу в первый разряд
Изображение
Вот запустил таймер, паразитной засветки нет, правда сегменты светятся слабее, чем одиночный разряд
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
GoldenAndy
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA
Контактная информация:

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

Сообщение GoldenAndy »

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

Поочередное зажигание как ? динамической индикацией или кодом выше, только в порте Ц только один бит в 1 ?
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Реклама
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

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

Сообщение melandr »

Поочередное зажигание делал статикой, как в коде выше, только убирал поочереди вывод 1 на каждом разряде.
Вопрос такой, мне нужно отключить плату индикации и измерить напряжение на выводах сегментов и разрядов? Потому что при подключении платы индикации к другому контроллеру все работает нормально. Згачит проблема в основной плате. Какую программу следует записать в контроллер, которая тушит все разряды?
Реклама
Аватара пользователя
GoldenAndy
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA
Контактная информация:

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

Сообщение GoldenAndy »

нет. нужно измерять при подключенной плате и искать, откуда появляется напряжение, открывающее транзисторы.
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

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

Сообщение melandr »

На выходах порта С - 3,27В, на базах транзисторов - 4,31В, на эмиттерах - 4,99В, на коллекторах - 4,79В. Программа запущена таймера, выводится время.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Если при выводе "по одному на весь дисплей" свечение индикатора отличается от работы в режиме "несколько цифр одновременно", то проблема явно в алгоритме программы.
Яркость свечения не зависит от того, сколько позиций активно.
Все сегменты должны иметь одинаковую яркость, независимо от того,сколько сегментов светятся одновременно.
В то же время суммарная яркость ессно зависит от количества одновременно светящихся сегментов.
Чем сегментов одинаковой яркости больше - тем суммарная яркость выше.
8)
Аватара пользователя
GoldenAndy
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA
Контактная информация:

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

Сообщение GoldenAndy »

Мерять нужно в статике, когда у вас работает вот этот код

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

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 вольт...
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

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

Сообщение melandr »

Спасибо, вечером проверю и отпишусь.
Аватара пользователя
musor
Друг Кота
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

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

Сообщение musor »

господа все проше идавно извесно проблема начала вылезать еше в калках НА ВЛИ потом ва часах на них-она чисто авпаратная отсутствие запирания по сеткам и подтяжки анодоф на минус питания ВЛИ кроме неприятности в темноте оно жрет ресурс индюка
в грамоттных КБ проблему сразу поняли и пофиксили установкой подтяжек хотя они и жрут часть энерги зря
а тупые поделки навроде старта таковое не имели да и не парился никто для самосборщикоф... с переходом на диоды проблема сначала не стояла изз низкой чуйки диодоф тех лет но сейчас когда индюк притоке 0,5ма светит весма заметно ве просто и заметно
начну с того что ключ ОЭ не идеален кроме утечек стть паразитные емкостя БЭ Кби эфект милера! поэтому ключик не пешит закрытся если подтяжка есть оно ослаабляет эфект
кроме того плохой тон не делать подтяжку бэ в транз. особеноключевых !gj [jhjotve управлять ключом нало через rcr цепь но я такое встречал толко парк раз
но вот подтяжку в промсхемах принято было делать всегда для этого даже разработали 4 и 8 ризисторные сборки и их широко применяют в пром устройствах
тоесть проблема медленых ключей чисто апаратная имет место быть ее частично можно
решить програмно как колега писал введением дедтайма между разрядами ну или поставит легкие мосфты вместо биполяра
но не то не другое не убирет апаратные утечки транзистороф и емкостя монтажа толко подтяжка апаратная их решает -внутреняя подтяжка кристала бесполезна!
номинал подтяжки дне должен превышать 4,7к!!! иначе она не эфективна
те бэ -обязателны если их нет это конструктивный косяк кстати к емкости транзюлей добавляется емкостя монтажа без подтядек еей не успеть разрядится за мертвое время
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

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

Сообщение melandr »

musor скорее всего так и есть, правда смущал момент, что на другом контроллере, паразитной засветки не было.
Но я попробовал проверить напряжения при выключенных индикаторах. Но так как они засвечиваются равномерно, то перекоса по напряжениям не было.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение Dimon456 »

Если изменить схемку, то усе нормально будет и даже в протеусе
СпойлерИзображение
с общим анодом

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

/*активный уровень сегмента 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
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

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

Сообщение melandr »

Добрый вечер, уважаемые коты! Хотел задать вопрос по организации кода в проекте. Я для хранения значений таймеров и состояния таймеров использую массив структур. И меня смущает момент обращения к полям структуры для сохранения измененных значений. Так как у меня используется 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);
}
Может кто-то подскажет, как бы его было написать более правильно. Так как используются разные пункты меню, то соответственно пришлось по каждому параметру настройки таймера делать отдельный код. Хотя фактически он повторяется
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

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

Сообщение melandr »

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

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

По поводу таймеров и оптимизации кода - не понятно. Что Вы хотите соптимизировать ?
Хоть и код в условиях примерно одинаковый, условия то разные. Единственное, что напрашивается, - таблица с перебором в цикле. Но, время выполнение такого кода будет даже больше текущего варианта.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ответить

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