Обсуждаем контроллеры компании Atmel.
Ср мар 13, 2019 10:41:21
при проблемах в коде дин. индикации сегмент светится не по всему экрану, а только на следующем (по ходу "развертки") разряде...
Ср мар 13, 2019 10:50:32
Вот это и проверим.... А дальше - вольтметр в руки и смотреть, чего там творится...
Ср мар 13, 2019 15:15:31
goldenandy алгоритм понял, спасибо. По результатам отпишусь. Разъяснили доходчиво
Ср мар 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 есть
На последнем фото припаял резисторы обратно, и вывожу в первый разряд
Вот запустил таймер, паразитной засветки нет, правда сегменты светятся слабее, чем одиночный разряд
Ср мар 27, 2019 21:54:00
Так.
На первой фотке слабо светятся все сегменты.
Проверяйте напряжения на эммитерах транзисторов, на базах и на выходах порта Ц.
Где-то есть напряжение, которое приоткрывает транзисторы.
Поочередное зажигание как ? динамической индикацией или кодом выше, только в порте Ц только один бит в 1 ?
Ср мар 27, 2019 22:29:56
Поочередное зажигание делал статикой, как в коде выше, только убирал поочереди вывод 1 на каждом разряде.
Вопрос такой, мне нужно отключить плату индикации и измерить напряжение на выводах сегментов и разрядов? Потому что при подключении платы индикации к другому контроллеру все работает нормально. Згачит проблема в основной плате. Какую программу следует записать в контроллер, которая тушит все разряды?
Ср мар 27, 2019 22:48:05
нет. нужно измерять при подключенной плате и искать, откуда появляется напряжение, открывающее транзисторы.
Чт мар 28, 2019 00:17:07
На выходах порта С - 3,27В, на базах транзисторов - 4,31В, на эмиттерах - 4,99В, на коллекторах - 4,79В. Программа запущена таймера, выводится время.
Чт мар 28, 2019 08:39:29
Если при выводе "по одному на весь дисплей" свечение индикатора отличается от работы в режиме "несколько цифр одновременно", то проблема явно в алгоритме программы.
Яркость свечения не зависит от того, сколько позиций активно.
Все сегменты должны иметь одинаковую яркость, независимо от того,сколько сегментов светятся одновременно.
В то же время суммарная яркость ессно зависит от количества одновременно светящихся сегментов.
Чем сегментов одинаковой яркости больше - тем суммарная яркость выше.
Чт мар 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 вольт...
Чт мар 28, 2019 09:26:35
Спасибо, вечером проверю и отпишусь.
Чт мар 28, 2019 09:59:26
господа все проше идавно извесно проблема начала вылезать еше в калках НА ВЛИ потом ва часах на них-она чисто авпаратная отсутствие запирания по сеткам и подтяжки анодоф на минус питания ВЛИ кроме неприятности в темноте оно жрет ресурс индюка
в грамоттных КБ проблему сразу поняли и пофиксили установкой подтяжек хотя они и жрут часть энерги зря
а тупые поделки навроде старта таковое не имели да и не парился никто для самосборщикоф... с переходом на диоды проблема сначала не стояла изз низкой чуйки диодоф тех лет но сейчас когда индюк притоке 0,5ма светит весма заметно ве просто и заметно
начну с того что ключ ОЭ не идеален кроме утечек стть паразитные емкостя БЭ Кби эфект милера! поэтому ключик не пешит закрытся если подтяжка есть оно ослаабляет эфект
кроме того плохой тон не делать подтяжку бэ в транз. особеноключевых !gj [jhjotve управлять ключом нало через rcr цепь но я такое встречал толко парк раз
но вот подтяжку в промсхемах принято было делать всегда для этого даже разработали 4 и 8 ризисторные сборки и их широко применяют в пром устройствах
тоесть проблема медленых ключей чисто апаратная имет место быть ее частично можно
решить програмно как колега писал введением дедтайма между разрядами ну или поставит легкие мосфты вместо биполяра
но не то не другое не убирет апаратные утечки транзистороф и емкостя монтажа толко подтяжка апаратная их решает -внутреняя подтяжка кристала бесполезна!
номинал подтяжки дне должен превышать 4,7к!!! иначе она не эфективна
те бэ -обязателны если их нет это конструктивный косяк кстати к емкости транзюлей добавляется емкостя монтажа без подтядек еей не успеть разрядится за мертвое время
Чт мар 28, 2019 20:16:58
musor скорее всего так и есть, правда смущал момент, что на другом контроллере, паразитной засветки не было.
Но я попробовал проверить напряжения при выключенных индикаторах. Но так как они засвечиваются равномерно, то перекоса по напряжениям не было.
Пт мар 29, 2019 10:50:12
Разница между МК разве что в режиме включения подтягивающих резисторов на выводах портов возможна.
И то ... лишь в случае, когда имеется отдельный бит конфигурации, который одновременно ВСЕ подтяжки вырубает
да к тому же тот бит прораммно недоступен - ставится программатором (тогда от пересадки одной и той же прожки независимо будет).
Пт мар 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
Пт мар 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);
}
Может кто-то подскажет, как бы его было написать более правильно. Так как используются разные пункты меню, то соответственно пришлось по каждому параметру настройки таймера делать отдельный код. Хотя фактически он повторяется
Пн апр 01, 2019 10:41:06
Добрый день, что-то все молчат. Может кто-то посоветует, как лучше все таки сохранять настройки таймеров. А то при изменение минут и часов каждого таймера приходится писать слишком много разного кода, как бы это все дело оптимизировать?
Пн апр 01, 2019 10:52:32
Описали структуру с параметрами таймера.
Создали массив таких структур.
Создали функцию, которая получает на входе указатель на структуру таймера (или номер этой структуры в массиве), и изменяет эту структуру.
Вызываете эту функцию из пунктов меню с нужным указателем (или номером).
В чем проблема?
Пн апр 01, 2019 10:53:35
Сколько условий, кошмар ...
Сделайте лучше через switch-case, быстрее код будет выполняться.
По поводу таймеров и оптимизации кода - не понятно. Что Вы хотите соптимизировать ?
Хоть и код в условиях примерно одинаковый, условия то разные. Единственное, что напрашивается, - таблица с перебором в цикле. Но, время выполнение такого кода будет даже больше текущего варианта.
Пн апр 01, 2019 11:03:44
да, кстати... проверку eeprom_is_ready() перед вызовом функций работы с EEPROM делать не надо - она там уже встроена. эта проверка требуется только в случаях работы с EEPROM в обработчиках прерываний и/или перед тем, как перевести МК в режим SLEEP_POWER_DOWN.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.