Фантомная засветка на семисегментнике.
- Войдите на сайт для отправки комментариев
Вс, 30/01/2022 - 19:26
Доброго дня всем!
Экспериментирую с 7-семнетным индикатором. Для начала просто решил вывести цифры (1234). В итоге получаю "фантомную" засветку сегментов от предыдущей цифры "по кругу" - У 2 от 1 , у 3 от 2, у 4 от 3 и у 1 от 4. Да и цифры выводятся задом наперед (4321), но это пока мелочь.
Контроллер Atmega8A (тактовая от внутреннего генератора 1МГц, фьюз-биты "по умолчанию").
Код прилагаю:
// список выводов для подключения к разрядам A, B, C, D, E, F, G, H uint8_t pinSegments[8] = {PIN_PB1, PIN_PB2, PIN_PB3, PIN_PB5, PIN_PB0, PIN_PB7, PIN_PB6, PIN_PB4}; // выводы на МК = { 15, 16, 17, 19, 14, 10, 9, 18} // значения для вывода цифр 0-9 byte numbers[12] = { B11111100, // | '0' // Байт: ABCDEFGH B01100000, // | '1' // A B11011010, // | '2' // ----- B11110010, // | '3' // | | B01100110, // | '4' // F| G |B B10110110, // | '5' // |-----| B10111110, // | '6' // E| |C B11100000, // | '7' // | D | B11111110, // | '8' // ----- * H B11110110, // | '9' }; // аноды/катоды семисегментного индикатора uint8_t pinAnode[4] = {PIN_PC2, PIN_PC0, PIN_PC3, PIN_PC1}; // выводы МК = { 25, 23, 26, 24 } void setup() { // Сконфигурировать контакты как выходы for (uint8_t i = 0; i < 8; i++) { pinMode(pinSegments[i], OUTPUT); } for (uint8_t i = 0; i < 4; i++) { pinMode(pinAnode[i], OUTPUT); digitalWrite(pinAnode[i], HIGH); // Выключаю } } void printNum (uint32_t num) { uint8_t bitNum; for (uint8_t i = 0; i < 4; i++) { if (num > 0) { bitNum = (uint8_t)(num % 10); for (int j = 0; j < 8; j++) { digitalWrite(pinSegments[j], bitRead(numbers[bitNum], 7 - j)); } num = num / 10; } else { num = 0; for (int j = 0; j < 8; j++) { digitalWrite(pinSegments[j], bitRead(numbers[num], 7 - j)); } } for (uint8_t j = 0; j < 4; j++) { // | "Гашу" весь "дисплей": digitalWrite(pinAnode[j], HIGH); // | } digitalWrite(pinAnode[i], LOW); // | Зажигаю цифру позиции i delay (2); } } void loop() { uint32_t number = 1234; printNum (number); delay(1); }
Наведите на правильное решение. Весь день бьюсь, уже и мыслей нет никаких. ((
Используй ТМ1637, Люк.
У меня тоже странные засветы были когда пробовал на делеях, затактовал на прерываниях от сети, исчезли. Эт не помощь, эт так, пожаловаться.))))
Используй ТМ1637, Люк.
Деда, мне нужно напрямую. Без ТМ1637. Да и у других то работает, даже на схожем коде... ((
Попробуй поменять местами строки 53 и 54
Деда, мне нужно напрямую. Без ТМ1637.
Значить, ты в джутовом мешке, с золотыми ногтями, хочешь странного. Я - пас.
Попробуй поменять местами строки 53 и 54
Эффект нулевой (ничего не изменилось).
Деда, мне нужно напрямую. Без ТМ1637.
Значить, ты в джутовом мешке, с золотыми ногтями, хочешь странного. Я - пас.
ТМ1637 тоже ведь индикаторы не волшебной палочкой зажигает.
Вы не слишком часто её дергаете? Поставьте в строке №54 5 вместо 2. Есть изменения?
Катоды "дрыгаю" тем что было под рукой - 2N3906. Мошт у них быстродействие низкое и поэтому такая ситуёвина возникает? Или это бред?
Вы не слишком часто её дергаете? Поставьте в строке №54 5 вместо 2. Есть изменения?
Есть небольшие улучшения, но появилось заметное глазу мерцание.
Ради эксперимента - догнал значение до 20. Мерцание капец просто, но фантомы остались на уровне delay(5);
Чтобы понять в аппаратной части проблемы или в программной - полез в интернет за примерами. Нашел вот такой громадный код (еле-еле в мегу8 влез):
С этим кодом отображение просто идеальное! Ничего не моргает и нет фантомов.
Всем спасибо. Буду помаленьку изучать эту "простыню" ))
Ну а эти PIN_PB, PC чего означают?
Ну а эти PIN_PB, PC чего означают?
Номера выводов (пинов) микроконтроллера. Можно использовать чисто цифровые значения (как в ардуино), но я использую «голый» мк и мне проще так (не нужно в голове держать сопоставление вывода мк и цифрового значения ардуино). Это стандартные макросы ядра (ядро MiniCore).
Только если индикатор с ОА, что видно по наименованию массивов, то аноды активизируются HIGH, а сегменты LOW.
У меня ОК и все работает (с портянкой из #12).
Схема-то подключения индикатора какая?
50-52 в топку
После 54 ой надо добавить digitalWrite(pinAnode[i], HIGH);
Анод подключил от одной цифры, а рисуешь уже другую ... что делаешь, то и видишь !
Овцелографом потыкать? Не? Или логанализатором? Может аппаратная проблема. Не люблю динамическую индикацию. Старовер.
bizzon Проблемы никакой нет ! Что ТС сам организовал, то и увидел !
Так на осцилографе видно сразу. Может вместо прямоугольников у него на анодах синус или пила.
Командир! согласен.
50-52 в топку
После 54 ой надо добавить digitalWrite(pinAnode[i], HIGH);
Анод подключил от одной цифры, а рисуешь уже другую ... что делаешь, то и видишь !
Собственно говоря, к такому же выводу пришел и я после осмотра кода "портянки" из #11. Вечером попробую.
Перемудрил я, похоже))) Посыпаю голову пеплом )
Мужики! Благодарю!
Однако ж другая проблема пришла. Изначально была не верная последовательность цифр (то есть вместо 1234 было 4321).
Если в функции printNum(num) код выглядит вот так:
То выводится только "пусто" и далее "123" (вот так: " 123"). Не пойму в чем дело. Если я меняю код в 3 строке вот так:
То просто вспыхивают нули. Третий бит - как будто бы два раза (визуально), остальные по одному. Что за нафиг? 0_о
Если вот так:
То на "дисплее" - "0123".
4321 - Может надо было просто привязку анодов поменять ?
А программно разве это нельзя сделать в этом месте:
Я сомневаюсь, что в этом дело. Какая разница слева направо или справа налево?
ЗЫ: К тому же "простыня" из #11 показывала все верно!
А почему i = 5 ?
Пока приходит на ум только "перевернуть" логику. Попробую...
А почему i = 5 ?
Это сталось от экспериментов. Читай выше, там я все расписал.
Ну что же, Деда на меня обиделся, помогать не хочет ((
Я таки поменял логику работы кода и все стало так, как нужно но память откушалась немного, в принципе пока не страшно, если будет в упор - тогда задумаюсь по новому:
Ну даже не знаю.... По ныть что ли как новички иногда делают, а может послать по разным адресам всех ранее участвовавших в данной теме? ...
Не, результат есть - чего ныть то?! А уж всем, кто принял участие, - тем огромное СПАСИБО!
Учусь дальше... )))
Впереди энкодер на ATmega8A...
Если учитесь, то старались бы писать изначально по нормальному. Вы пользуетесь Ардуино функциями, а не завязками на какое то ядро. Кому нужны ваши PIN_PB и ваши выводы МК! Нужно что бы человек взял ЛЮБУЮ Ардуино у него всё это работало... Или же пишите без Ардуино функций, но указывайте конкретный МК.
numbers[] - почему размер 12? pinAnode, когда реально это катоды? Подбирайте правильные имена. Пишите комментарий в начале для какого железа предназначена. А лучше делать что бы программа была универсальной - ОА/ОК, кол-во знакомест, инверсия общих и т.п. Ну и без delay конечно же.) Хоть и 1 мс, но завтра вам понадобиться отслеживать процессы менее 1 мс и что? Ну и по мелочи - то byte, то uint8_t, то int... 39 - лишнее приведение. Это что попалось.
Кто то говорил из наших - "старайся делать хорошо, плохо само получится".)
Если учитесь, то старались бы писать изначально по нормальному. Вы пользуетесь Ардуино функциями, а не завязками на какое то ядро. Кому нужны ваши PIN_PB и ваши выводы МК! Нужно что бы человек взял ЛЮБУЮ Ардуино у него всё это работало... Или же пишите без Ардуино функций, но указывайте конкретный МК.
numbers[] - почему размер 12? pinAnode, когда реально это катоды? Подбирайте правильные имена. Пишите комментарий в начале для какого железа предназначена. А лучше делать что бы программа была универсальной - ОА/ОК, кол-во знакомест, инверсия общих и т.п. Ну и без delay конечно же.) Хоть и 1 мс, но завтра вам понадобиться отслеживать процессы менее 1 мс и что? Ну и по мелочи - то byte, то uint8_t, то int... 39 - лишнее приведение. Это что попалось.
Кто то говорил из наших - "старайся делать хорошо, плохо само получится".)
Согласен от части. Поэтому и учусь ещё...
12 у массива потому, что так нужно (на полёт не влияет), и я об этом знаю, это как раз «на будещее».
PIN_PB и так далее потому, что я пишу код глядя на схему. Зачем мне заморочки с ардуино выводами - чтобы что? Постоянно сопоставлять их? Не критично. Код и так скомпилируется (если ядро стоит, да и кто такую схему собирать будет на голом мк? Это же не шилд в бребоард воткнуть). Ядро вроде бы тоже указывал? Забыл. Ну если нет - MiniCore.
МК указал в начале темы, этого мало (даже фьюзы указал)?
По поводу имени pinAnode - схема «универсальная», то есть рассчитана и на общий анод и на общий катод. Только перемычку изменить на плате при иных компонентах и всё. Ну и поменять в коде одно значение с 0 на 1. Как назвать и катоды и аноды одновременно? Поделитесь - переименую (хотя мне не критично).
По типам (что разные мелькают , приведение и тп) - ты же понимаешь, что я не заморачиваюсь сейчас с типами пока идёт отладка. Когда заработает всё как нужно - можно будет и «причесать».
Ну и дэлеи тоже для отладки, если будут мешать - я их уберу. Блинк без дэлей знаю )))
ЗЫ: Без обид, как есть - так и рассказал.
Если 7и сегметные индикаторы подключена к МК напрямую без ключей, то при динамической индикации "поциферно" яркость будет зависить от количества включенных сегментов. Если разряд один, то это особо не видно. Но при наличии нескольких - выглядит это все несколько неряшливо когда выводится что-нибудь вроде "1879. Что бы яркость была одинакова надо включать только по одному сегменту за раз. код, правда, получается чуть посложнее.
12 у массива потому, что так нужно (на полёт не влияет), и я об этом знаю, это как раз «на будещее».
На будущее - это выглядит неряшливо. Пишите без размера - вот оно любое будущее.
МК указал в начале темы, этого мало (даже фьюзы указал)?
Причём здесь ваш голый МК? Чем он программно отличается от других плат Ардуино?
Указывать нужно в тексте программы, что бы не пересматривать весь топик.
pinCommon[]. А вот пионеры то и не знают где какие перемычки и что менять в коде. Да и сам забудешь через неделю.
Ну и дэлеи тоже для отладки, если будут мешать - я их уберу. Блинк без дэлей знаю )))
Потом, причешу, уберу... Уже ж, вроде как, с индикацией закончил? Сразу нужно писать правильно. Да и людям на обозрение выкладываешь...
Если 7и сегметные индикаторы подключена к МК напрямую без ключей, то при динамической индикации "поциферно" яркость будет зависить от количества включенных сегментов. Если разряд один, то это особо не видно. Но при наличии нескольких - выглядит это все несколько неряшливо когда выводится что-нибудь вроде "1879. Что бы яркость была одинакова надо включать только по одному сегменту за раз. код, правда, получается чуть посложнее.
Разная яркость будет если без токоограничивающих резисторов в цепях сегментов.
С посегментной индикацией другая беда - скважность больше, соответственно, частота вывода выше, яркость ниже. Для суперярких LED это не заметно. Ну и от условий эксплуатации зависит.
Даже интересно почему код из #11 "еле влез в atmega8".
Писал перед НГ вот такое:
Три регистра, все сегменты подключены в различных вариациях к 6 выводам. Работает эта херь посредством чарлиплексинга.
Занимает код чуть больше 2кб.
Даже интересно почему код из #11 "еле влез в atmega8".
В скомпилированном виде та "простыня" заняла 7кб из 8кб доступных. Я так думаю, что это из-за использования типа String в коде. Но точно не знаю.
12 у массива потому, что так нужно (на полёт не влияет), и я об этом знаю, это как раз «на будещее».
На будущее - это выглядит неряшливо. Пишите без размера - вот оно любое будущее.
Согласен, исправлюсь. )
Да и людям на обозрение выкладываешь...
Я не на обозрение, я просто спросить )))
Причесал, работает. Меня устраивает.
Да, уж... Вообще, не так это делается. Пишется отдельная функция под индикатор, которая периодически вызывается из loop-а или по прерыванию. В ней буфер сегментов, которые отображаются. И функции, которые записываю в буфер что нужно отобразить. И всё это оформляется в библиотеку и напрочь забывается.
BOOM Если для сегментов выбран один порт целиком - зачем общаться с сегментами по одному ???
BOOM Если для сегментов выбран один порт целиком - зачем общаться с сегментами по одному ???
Я не умею "общаться сразу со всеми", поэтому сделал так как умею.
То же самое относится и к:
Да, уж... Вообще, не так это делается.
учусь ещё...
Собственно, только поэтому и ответил.
По типам (что разные мелькают , приведение и тп) - ты же понимаешь, что я не заморачиваюсь сейчас с типами пока идёт отладка. Когда заработает всё как нужно - можно будет и «причесать».
"Заморачиваться" нужно когда пишешь программу и когда она не работает. А когда она заработала, "заморачиваться" уже поздно. Да и какой смысл?
Идея "сначала напишу как-нибудь, а когда заработает - исправлю" изначально порочна. В частности потому, что создает ненужные препятствия отладке. Правильно написанный код отлаживать намного проще. Собственно, если Вы когда либо читали рекомендации по оформлению кода, то должны были задаться вопросом - а зачем это нужно? Так вот, нужно это для единственной цели - упрощения отладки и сопровождения. Никакого другого смысла в рекомендациях по оформлению кода нет.
26-28 меняем на DDRB=0B11111111
39-41 меняем на PORTB=numbers[bitNum]
39-41 меняем на PORTB=numbers[bitNum]
Вот с этим засада. Кракозябры. Пробовал отрицание ( ! ) - вообще не светятся индикаторы. Ну а я, уже говорил, не понимаю еще в этом всем...
Данный код выдает все нули и все точки горят. Но это просто пальцем в небо. Стоит ли продолжать?
поменял на
При этом яркость примерно одинаковая. Если уменьшить до 300, то яркость существенно понижается.
Данный код выдает все нули и все точки горят. Но это просто пальцем в небо. Стоит ли продолжать?
Стоит однозначно :)
Вот откопал древний пример
http://arduino.ru/forum/proekty/prosto-termometr-na-dvukh-7-segmentnykh-...
До сих пор полноценно использую железку.