Есть устройство на МК (не суть важно каком), которое через выводы МК управляет индикатором на 3 или 4 разряда , типа KEM-3361. Нужно, подключившись к этим же выводам индикатора, снять данные. Может кто-то уже подобное написал? Сложность, как я думаю, в определении начала опроса сегментов, ведь сигнал "стробирования" находится внутри МК, и на индикатор не выведен.
Вряд ли есть что-то универсальное готовое. Но вообще такое за вечерок пишется под свой индикатор. Никаких сложностей. Сигналы разрядов заводим на внешние прерывания, сигналы сегментов на какой-нибудь порт один желательно (проще читать). По прерыванию разряда знаем какой разряд у нас выводится в данный момент - считываем порт сегментов в буфер, декодируем (как формирование вывода на 7-сег, только наоборот) и т.д. пока все разряды не считаем.
Добавлено after 1 minute 1 second: Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека Но да, "сигнал "стробирования"" смущает. Почему стробирование, когда обычной у каждого разряда свой общий вывод, которые просто переключается?
между 1 и последним разрядом часто есть пустоий ингтервал гашения его можно взят за отсчет
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Но да, "сигнал "стробирования"" смущает. Почему стробирование, когда обычной у каждого разряда свой общий вывод, которые просто переключается?
Я имел в виду условное начало перебирания разрядов в МК под этим словом.
Для вашей идеи нужно брать Atmega с тремя прерываниями минимум, а на моей 328P их только два Вот и думал через регистр опрашивать, там два сигнала управления и один выход, который на вход Atmega328P можно подать.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
бери тини2313 там внешних прерываний много... (INT0, INT1, PCINT0-PCINT7, ICP) итого 11 штук...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
AonMaster, на вашей 328P полно PCINT - это тоже внешние прерывания.
Добавлено after 4 minutes 4 seconds: Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека Ivanoff-iv, да и в 328P на каждом GPIO пине есть PCINT в общем-то, их там аж до 24-1 штук в зависимости от корпуса.
Так это не настоящие аппаратные прерывания, т.е. по ним нельзя сразу переходить на подпрограмму выполнения прерывания (в моём случае анализа входов). Вы, наверное, предлагаете просто ходить по кругу и при обнаружении изменения уровня на ноге запускать измерение. Так тоже можно, но если до этого места программа дойдёт в конце импульса зажигания сегментов, то пока будет анализировать 7 входов - с них уже могут уйти уровни, которые были весь импульс зажигания сегментов. Поэтому и думаю привязаться к аппаратному прерыванию, которых всего 2.
Так это не настоящие аппаратные прерывания, т.е. по ним нельзя сразу переходить на подпрограмму выполнения прерывания
Сх@яли? какраз так оно и работает, просто подпрограмма обработчик одна на всех, но кто тебе мешает в этом обработчике перед чтением сегментов определить разряд?
Добавлено after 5 minutes 1 second: Re: Декодер данных с индикатора 7 сегментного,есть ли библиотека Блин... теряюсь в догадках, как и для чего нужны "ненастоящие прерывания" если они существуют...?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Последний раз редактировалось Ivanoff-iv Чт фев 04, 2021 10:17:55, всего редактировалось 1 раз.
В каких-нибудь мегах есть 4 внешних прерывания INT0 - INT4? желательно в 44-ногом корпусе максимум. Для понимания мне так проще, т.к. одно прерывание для всего порта означает, что любое изменение любой ножки этого порта вызовет его. А другие ножки того же порта у меня могут использоваться на вывод, и это, наверное, будет конфликт и мне сложно для понимания(
цепляй на PCINT провода от разрядов, как только разряд сменится - вызовется прерывание, а в прерывании первым делом опросишь эти-же самые лапки (благо функции порта у них никто при этом не отнимает) и определишь какой из разрядов горит в данный момент.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
При условии, что динамическая индикация поразрядная, а не посегментная, используем сигнал с анодных ключей как строб записи текущей комбинации сегментов в позиции и приращения счетчика буфера данных. Затем дешифровка сегментного кода в тетраду двоично-десятичного и свертка результата в бинарник.
Любая из позиций знакомест вызывает прерывание с записью в буфер текущего значения всех позиционных ключей - это будет код позиции сегментного кода данных. Итогом - по прерыванию от позиционных ключей (по ИЛИ) защелкиваем тетраду текущего значения позиционных ключей и байт сегментного кода - таких операций 4 (или 3 - сколько разрядов), а далее обработка N байт данных.
Последний раз редактировалось BOB51 Чт фев 04, 2021 10:27:19, всего редактировалось 1 раз.
"дешифровка сегментного кода в тетраду двоично-десятичного", "свертка в бинарник" BOB51, сейчас AonMaster, твой пост прочитает и свалит на кортексы....
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
В каких-нибудь мегах есть 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 Там хоть и применительно к ардуино, всё-равно обычные вставки обработчиков прерываний используются.
NStorm, Спасибо за ссылку, почитаю. Надо брать ардуину и пробовать Только ведь прерывание будет вызываться всякий раз - и при переходе в 0, и в 1. То есть первым делом нужно будет завершать прерывание, если сработало при 0, и считывать ноги, если сработало при 1. Я так понял.
Если в подопытном изделии таки динамика на 3-4 позиции то там и одного прерывания хватит. Правда придется внешнюю обвязку дополнительно сделать - зависит от конкретной схемы управляющих каскадов индикатора.
Адуринки - Нанки должно хватить - там 4 позиционки, 8 сегментных и одно прерывание (INT0 или INT1)... А возврат значений в терминалку ПК посылаем...
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 оставляю за вами, как писал выше это обратная отображению из числа функция просто.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения