Декодер данных с индикатора 7 сегментного,есть ли библиотека

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
AonMaster
Опытный кот
Сообщения: 818
Зарегистрирован: Пн дек 29, 2014 11:48:22

Декодер данных с индикатора 7 сегментного,есть ли библиотека

Сообщение AonMaster »

Всем привет! :wink:

Есть устройство на МК (не суть важно каком), которое через выводы МК управляет индикатором на 3 или 4 разряда , типа KEM-3361. Нужно, подключившись к этим же выводам индикатора, снять данные. Может кто-то уже подобное написал? Сложность, как я думаю, в определении начала опроса сегментов, ведь сигнал "стробирования" находится внутри МК, и на индикатор не выведен.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

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

AonMaster писал(а):в определении начала опроса сегментов
AonMaster писал(а):сигнал "стробирования" находится внутри МК, и на индикатор не выведен
Ещё бы знать, что сие означает, дабы определить сложность.
Не расшифруете Ваши мысли ? :roll:
Реклама
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение NStorm »

Вряд ли есть что-то универсальное готовое.
Но вообще такое за вечерок пишется под свой индикатор. Никаких сложностей. Сигналы разрядов заводим на внешние прерывания, сигналы сегментов на какой-нибудь порт один желательно (проще читать). По прерыванию разряда знаем какой разряд у нас выводится в данный момент - считываем порт сегментов в буфер, декодируем (как формирование вывода на 7-сег, только наоборот) и т.д. пока все разряды не считаем.

Добавлено after 1 minute 1 second:
Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека
Но да, "сигнал "стробирования"" смущает. Почему стробирование, когда обычной у каждого разряда свой общий вывод, которые просто переключается?
Аватара пользователя
musor
Друг Кота
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение musor »

между 1 и последним разрядом часто есть пустоий ингтервал гашения его можно взят за отсчет
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Реклама
Эиком - электронные компоненты и радиодетали
AonMaster
Опытный кот
Сообщения: 818
Зарегистрирован: Пн дек 29, 2014 11:48:22

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение AonMaster »

[uquote="NStorm",url="/forum/viewtopic.php?p=3974035#p3974035"]Но да, "сигнал "стробирования"" смущает. Почему стробирование, когда обычной у каждого разряда свой общий вывод, которые просто переключается?[/uquote]
Я имел в виду условное начало перебирания разрядов в МК под этим словом.

Для вашей идеи нужно брать Atmega с тремя прерываниями минимум, а на моей 328P их только два :)
Вот и думал через регистр опрашивать, там два сигнала управления и один выход, который на вход Atmega328P можно подать.
Реклама
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

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

бери тини2313 там внешних прерываний много... (INT0, INT1, PCINT0-PCINT7, ICP) итого 11 штук...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение NStorm »

AonMaster, на вашей 328P полно PCINT - это тоже внешние прерывания.

Добавлено after 4 minutes 4 seconds:
Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека
Ivanoff-iv, да и в 328P на каждом GPIO пине есть PCINT в общем-то, их там аж до 24-1 штук в зависимости от корпуса.
parovoZZ
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение parovoZZ »

а на моей 328P их только два
В смысле два? Там почти на каждой ноге прерывание.
AonMaster
Опытный кот
Сообщения: 818
Зарегистрирован: Пн дек 29, 2014 11:48:22

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение AonMaster »

Так это не настоящие аппаратные прерывания, т.е. по ним нельзя сразу переходить на подпрограмму выполнения прерывания (в моём случае анализа входов). Вы, наверное, предлагаете просто ходить по кругу и при обнаружении изменения уровня на ноге запускать измерение. Так тоже можно, но если до этого места программа дойдёт в конце импульса зажигания сегментов, то пока будет анализировать 7 входов - с них уже могут уйти уровни, которые были весь импульс зажигания сегментов. Поэтому и думаю привязаться к аппаратному прерыванию, которых всего 2.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

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

[uquote="AonMaster",url="/forum/viewtopic.php?p=3974063#p3974063"]Так это не настоящие аппаратные прерывания, т.е. по ним нельзя сразу переходить на подпрограмму выполнения прерывания[/uquote]Сх@яли? :shock: какраз так оно и работает, просто подпрограмма обработчик одна на всех, но кто тебе мешает в этом обработчике перед чтением сегментов определить разряд?

Добавлено after 5 minutes 1 second:
Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека
Блин... теряюсь в догадках, как и для чего нужны "ненастоящие прерывания" если они существуют...? :dont_know: :))) :))) :)))
Последний раз редактировалось Ivanoff-iv Чт фев 04, 2021 10:17:55, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
AonMaster
Опытный кот
Сообщения: 818
Зарегистрирован: Пн дек 29, 2014 11:48:22

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение AonMaster »

В каких-нибудь мегах есть 4 внешних прерывания INT0 - INT4? желательно в 44-ногом корпусе максимум. Для понимания мне так проще, т.к. одно прерывание для всего порта означает, что любое изменение любой ножки этого порта вызовет его. А другие ножки того же порта у меня могут использоваться на вывод, и это, наверное, будет конфликт и мне сложно для понимания(

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

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

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

цепляй на PCINT провода от разрядов, как только разряд сменится - вызовется прерывание, а в прерывании первым делом опросишь эти-же самые лапки (благо функции порта у них никто при этом не отнимает) и определишь какой из разрядов горит в данный момент.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение BOB51 »

При условии, что динамическая индикация поразрядная, а не посегментная, используем сигнал с анодных ключей как строб записи текущей комбинации сегментов в позиции и приращения счетчика буфера данных.
Затем дешифровка сегментного кода в тетраду двоично-десятичного и свертка результата в бинарник.
:roll:
Любая из позиций знакомест вызывает прерывание с записью в буфер текущего значения всех позиционных ключей - это будет код позиции сегментного кода данных.
Итогом - по прерыванию от позиционных ключей (по ИЛИ) защелкиваем тетраду текущего значения позиционных ключей и байт сегментного кода - таких операций 4 (или 3 - сколько разрядов), а далее обработка N байт данных.
8)
Последний раз редактировалось BOB51 Чт фев 04, 2021 10:27:19, всего редактировалось 1 раз.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

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

"дешифровка сегментного кода в тетраду двоично-десятичного", "свертка в бинарник"
BOB51, сейчас AonMaster, твой пост прочитает и свалит на кортексы.... :))) :))) :))) :)))
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение BOB51 »

Там ничего сложного - обычные табличные преобразования...
:dont_know:
РУТИНА...
:sleep:
parovoZZ
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение parovoZZ »

Так это не настоящие аппаратные прерывания
Впонорошку? Как в детском садике?
Есть регистр флагов. По нему определяется сработавшая нога на раз.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение NStorm »

[uquote="AonMaster",url="/forum/viewtopic.php?p=3974083#p3974083"]В каких-нибудь мегах есть 4 внешних прерывания INT0 - INT4? желательно в 44-ногом корпусе максимум. Для понимания мне так проще, т.к. одно прерывание для всего порта означает, что любое изменение любой ножки этого порта вызовет его. А другие ножки того же порта у меня могут использоваться на вывод, и это, наверное, будет конфликт и мне сложно для понимания(

Сводной таблицы по AVR именно по INT - не нашёл.[/uquote]
Прочитайте про прерывания PCINT. Вы полностью их неправильно понимаете. Они полностью "настоящие" и по ним происходит переход в обработчик прерываний. Более того, в atmega328p таких обработчиков 3, по группам PCINT. С 0 по 7 обрабываются в PCINT0, с 8 по 14 (15го нет) в PCINT1, с 16 по 24 в PCINT2. Более того, есть регистры PCMSK0..2, которые задают какие из ног PCINTx вызывают прерывание. Т.е. вовсе необязательно весь порт будет вызывать прерывание. Вы можете даже разнести сегменты по разным группам PCINTx, включить только по одной ноге в PCMSKx и получить в общем-то тот же эффект, что и INTx дает - одна нога, одно прерывание. Хотя это и вовсем необязательно. Можно и в одной группе PCINTx повесить 3 ноги битами из PCMSKx и просто в обработчике прерывания сразу же проверять PINxy на премет того, какая из ног изменилась. Это же элементарно.

Добавлено after 1 minute 51 second:
Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека
parovoZZ, регистр флагов на прерывания, на ноги его нет в AVRках. Надо проверять сам порт.

Добавлено after 9 minutes 7 seconds:
Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека
AonMaster, вот прочитайте тут, например: https://tsibrov.blogspot.com/2019/06/ar ... Interrupts
Там хоть и применительно к ардуино, всё-равно обычные вставки обработчиков прерываний используются.
AonMaster
Опытный кот
Сообщения: 818
Зарегистрирован: Пн дек 29, 2014 11:48:22

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение AonMaster »

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

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение BOB51 »

Если в подопытном изделии таки динамика на 3-4 позиции то там и одного прерывания хватит.
Правда придется внешнюю обвязку дополнительно сделать - зависит от конкретной схемы управляющих каскадов индикатора.
8)
Адуринки - Нанки должно хватить - там 4 позиционки, 8 сегментных и одно прерывание (INT0 или INT1)...
А возврат значений в терминалку ПК посылаем...
:roll:
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Декодер данных с индикатора 7 сегментного,есть ли библио

Сообщение NStorm »

AonMaster, просто всегда считываете нужные вам ноги и там где 1 - тот разряд и читаем. Берем скажем 328р в корпусе PDIP: https://camo.githubusercontent.com/c55b ... 542e6a7067

Скажем на порт D повесим сегменты. На PC0..3 - разряды, что соотв. PCINT8..11. Это у нас в "группе" прерываний 1, т.е. PCINT1. Врубаем прерывания:

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

PCICR = 1 << PCIE1;
PCMSK1 = (1 << PCINT11) | (1 << PCINT10) | (1 << PCINT9) | (1 << PCINT8);
sei();
Ну и соб-но в самом прерывании:

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

uint8_t portbuf, dig, flag, fullflag;
uint16_t result;

ISR (PCINT1_vect) {
  if (!flag) {
    dig = PINC & ((1 << PC3) | (1 << PC2) | (1 << PC1) | (1 << PC0)); // Читаем в буфер порт C и только с маской нужных нам ног. Т.е. это будет текущий разряд
    if(dig && !(dig & (dig-1))) { // чуть хитрости - это провирят что в dig установлен только один бит, т.е. у нас активен только 1 разряд
       portbuf = PIND; // читаем сегменты
       flag = 1; // поднимает флаг, что очередной разряд считан
    }
  }
}


void main() {
...
  if (flag && !fullflag) {
    switch (dig) {
      case 1 << PC0:
        result = 7seg_to_int(portbuf); // считали младшую цифру
        flag = 0; // очищаем флаг цифры
        break;
    }
      case 1 << PC1:
        result += 7seg_to_int(portbuf)*10; // считали 2ую цифру (десятки)
        flag = 0; // очищаем флаг цифры
        break;
    }
      case 1 << PC2:
        result += 7seg_to_int(portbuf)*100; // считали 3ую цифру
        flag = 0; // очищаем флаг цифры
        break;
    }
      case 1 << PC3:
        result += 7seg_to_int(portbuf)*1000; // считали 4ую цифру
        flag = 0; // очищаем флаг цифры
        fullflag = 1; // возвозим флаг что последняя цифра считана
        break;
    }
  }

  if (fullflag) {
    // у нас тут значит целиком число считано, можно его куда-нибудь передавать или что-то делать на его основе, потом fullflag сбрасываем после обработки, чтобы продолжить читать следующее значение
  }
}
Как-то так. Алгоритм я почти полностью вам набросал прям тут уже )
Это не готовый код, писал прям тут без проверки на валидность. Функцию перевода из значений порта 7сегментника в число 7seg_to_int оставляю за вами, как писал выше это обратная отображению из числа функция просто.
Ответить

Вернуться в «Разные вопросы по МК»