Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Чт фев 04, 2021 08:21:07

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

Есть устройство на МК (не суть важно каком), которое через выводы МК управляет индикатором на 3 или 4 разряда , типа KEM-3361. Нужно, подключившись к этим же выводам индикатора, снять данные. Может кто-то уже подобное написал? Сложность, как я думаю, в определении начала опроса сегментов, ведь сигнал "стробирования" находится внутри МК, и на индикатор не выведен.

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

Чт фев 04, 2021 08:42:58

AonMaster писал(а):в определении начала опроса сегментов
AonMaster писал(а):сигнал "стробирования" находится внутри МК, и на индикатор не выведен
Ещё бы знать, что сие означает, дабы определить сложность.
Не расшифруете Ваши мысли ? :roll:

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

Чт фев 04, 2021 08:55:45

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

Добавлено after 1 minute 1 second:
Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека
Но да, "сигнал "стробирования"" смущает. Почему стробирование, когда обычной у каждого разряда свой общий вывод, которые просто переключается?

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

Чт фев 04, 2021 09:03:12

между 1 и последним разрядом часто есть пустоий ингтервал гашения его можно взят за отсчет

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

Чт фев 04, 2021 09:18:05

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

Я имел в виду условное начало перебирания разрядов в МК под этим словом.

Для вашей идеи нужно брать Atmega с тремя прерываниями минимум, а на моей 328P их только два :)
Вот и думал через регистр опрашивать, там два сигнала управления и один выход, который на вход Atmega328P можно подать.

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

Чт фев 04, 2021 09:26:27

бери тини2313 там внешних прерываний много... (INT0, INT1, PCINT0-PCINT7, ICP) итого 11 штук...

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

Чт фев 04, 2021 09:39:31

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

Добавлено after 4 minutes 4 seconds:
Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека
Ivanoff-iv, да и в 328P на каждом GPIO пине есть PCINT в общем-то, их там аж до 24-1 штук в зависимости от корпуса.

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

Чт фев 04, 2021 09:42:29

а на моей 328P их только два

В смысле два? Там почти на каждой ноге прерывание.

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

Чт фев 04, 2021 09:59:56

Так это не настоящие аппаратные прерывания, т.е. по ним нельзя сразу переходить на подпрограмму выполнения прерывания (в моём случае анализа входов). Вы, наверное, предлагаете просто ходить по кругу и при обнаружении изменения уровня на ноге запускать измерение. Так тоже можно, но если до этого места программа дойдёт в конце импульса зажигания сегментов, то пока будет анализировать 7 входов - с них уже могут уйти уровни, которые были весь импульс зажигания сегментов. Поэтому и думаю привязаться к аппаратному прерыванию, которых всего 2.

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

Чт фев 04, 2021 10:17:22

Так это не настоящие аппаратные прерывания, т.е. по ним нельзя сразу переходить на подпрограмму выполнения прерывания
Сх@яли? :shock: какраз так оно и работает, просто подпрограмма обработчик одна на всех, но кто тебе мешает в этом обработчике перед чтением сегментов определить разряд?

Добавлено after 5 minutes 1 second:
Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека
Блин... теряюсь в догадках, как и для чего нужны "ненастоящие прерывания" если они существуют...? :dont_know: :))) :))) :)))
Последний раз редактировалось Ivanoff-iv Чт фев 04, 2021 10:17:55, всего редактировалось 1 раз.

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

Чт фев 04, 2021 10:17:52

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

Сводной таблицы по AVR именно по INT - не нашёл.

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

Чт фев 04, 2021 10:21:06

цепляй на PCINT провода от разрядов, как только разряд сменится - вызовется прерывание, а в прерывании первым делом опросишь эти-же самые лапки (благо функции порта у них никто при этом не отнимает) и определишь какой из разрядов горит в данный момент.

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

Чт фев 04, 2021 10:21:45

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

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

Чт фев 04, 2021 10:25:48

"дешифровка сегментного кода в тетраду двоично-десятичного", "свертка в бинарник"
BOB51, сейчас AonMaster, твой пост прочитает и свалит на кортексы.... :))) :))) :))) :)))

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

Чт фев 04, 2021 10:28:20

Там ничего сложного - обычные табличные преобразования...
:dont_know:
РУТИНА...
:sleep:

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

Чт фев 04, 2021 10:37:46

Так это не настоящие аппаратные прерывания

Впонорошку? Как в детском садике?
Есть регистр флагов. По нему определяется сработавшая нога на раз.

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

Чт фев 04, 2021 11:15:43

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

Сводной таблицы по AVR именно по INT - не нашёл.

Прочитайте про прерывания 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
Там хоть и применительно к ардуино, всё-равно обычные вставки обработчиков прерываний используются.

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

Чт фев 04, 2021 12:05:11

NStorm, Спасибо за ссылку, почитаю. Надо брать ардуину и пробовать :)
Только ведь прерывание будет вызываться всякий раз - и при переходе в 0, и в 1. То есть первым делом нужно будет завершать прерывание, если сработало при 0, и считывать ноги, если сработало при 1. Я так понял.

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

Чт фев 04, 2021 12:27:30

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

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

Чт фев 04, 2021 12:38:40

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 оставляю за вами, как писал выше это обратная отображению из числа функция просто.
Ответить