Основная задача - сделать сканирование самостоятельным процессом. micros - это также часть основной программы. Рабочая версия, но несколько более простая. Второе - счетчик не бесконечен - надо переполнение учитывать при длительной работе. Посмотрю, где там у меня в преобразователе ошибка - но то уже больше вопрос теста, чем самой индикации. Ну вот и ошибку отловил - причина НЕВНИМАТЕЛЬНОСТЬ - вместо цифирьки запихнул сразу сегментный код! (перекодировка там ниже отдельно выполняется, а инверсия в обработчике прерывания). Надо было так: Спойлер
Это уже "вопросы основной программы" - что заложим, то и покажет. Главное основной сканер динамической индикации работает, а что он будет выводить на индикацию это циферки (или чего другого) из массива TrmDat[5]. Причем ячейки 0-3 там под цифирь, а старшая тетрада 4й ячейки - управление внешними светиками и служебными линиями (младшая тетрада - то позиционные ключи). Заодно и знакогенератор "кракозябр" семисегментных прилагается. Запятую или произвольные символы надо вводить после фрагмента перекодировки в сегментный код, перед установкой флага запроса на перенос данных в массив vram.
Нее... То уже вопрос основной программы - что напишем, то и выведет на индикацию. Если напрямую загружать "кракозябрами" массив предподготовки (без преобразования через знакогенератор) то выводить будет все, что загружено. Минимальный интервал между выводом в одну строку развертки со стороны контроллера динамической индикации (раз в 0,016 секунды), а со стороны основной программы - от момента установки флага запроса до точки переноса примерно такой же (или меньше - в зависимости от того, в какой момент относительно работы сканера был установлен флаг запроса). Собственно это защита от "случайного сбоя" - индикация меняется только по окончании вывода предыдущей строки (нету "разрыва" индикации). Но... гашения между выводом позиций также нету - это дополнительное время. Понадеемся на эффект быстродействия по переносу из сдвигового регистра в защелку у 595ых. У кого "живьем" - проверьте на "мерцание/паразитную засветку" как ощущение от индикаторов будет (не устают ли глаза при наблюдении). Хоша... теоретически можно поставить "гасящий вывод" - один из слотов интервала задержки еще свободен... Но то уже если очень припечет... Вобщем... похоже таки можно применять этот алгоритм...
Фото - не то же, что глазом ощущать... Второй нюанс - какова будет реакция устройства при совместном применении критичных по времени (и разрыву протокола обмена) этого варианта динамической индикации и библиотек Adafruit_NeoPixel и OneWire?... То проверять надо... У меня есть подобное применение прерывания по OCR0A совместно с термометром-показометром на DS18B20(проект К145М что на котуинке лежит), но там не столь плотно интервал занят - прерывание только флажок ставит. А тут один из слотов почти полностью заполнен. Для некритичных ко времени и приостановке протоколов обмена и тех, что основаны на аппаратных модулях МК (UART, SPI, I2C) динамическая индикация на основе прерывания не повлияет.
Теперь с нулями бегает , но незначащие нули спереди пишет.
нужно делать разветвленный анализ цифр: если первый ноль, то выводим пробел (или пустое место), или не выводим ничего. иначе переходим к выводу всех цифр. если первый ноль, анализируем вторую цифру на ноль, и так далее.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
твой код будет писать незначащие нули спереди. я тут сделал в протеусе проект с 74hc595, никаких "паразиток" не наблюдаю. еще "до кучи" сделал в протеусе проект с MAX7219, тоже никаких "паразиток" не наблюдаю. оба проекта без гашения перед следующим выводом символа.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
"засветки" и "паразитки" могут быть из-за того, что выход LATCH_PIN оставался в высоком уровне. при этом из сдвигового регистра входящие данные сразу предавались в выходной регистр. а импульс на "защелки" нужно подавать после всех принятых бит. тогда не будет "засветок" и "паразиток" .
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
По вопросам причин "паразиток" остался еще один момент - смена данных в ОЗУ "видеопамяти" должна производиться после окончания текущей строки развертки (или перед началом развертки новой строки). Это актуально для 595ых (и аппаратного варианта динамической развертки на выводах самого МК), но не для спецконтроллеров типа MAX7219 - в них все "особенности" уже предусмотрены изготовителем.
я мог выше быть не прав, и не важно, когда произошла подача нуля на вход защелок. в моем проекте для протеуса вывод в буфер индикации не синхронизирован с окончанием вывода всех 8 символов. тем не менее, я в протеусе не вижу "паразиток". а вообще, логика в твоих словах о синхронизации правильная. у меня таймер работает по 2 мс, то есть, частота вывода 500 Гц. таким образом, полный вывод всей строки из 8 символов происходит с частотой 62,5 Гц. в принципе, и у меня может быть сбой (паразитка), если вывод в буфер новой информации произойдет в середине вывода строки. но с такой скоростью динамического вывода я сбой не вижу.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
"Проблеск" при произвольной точке обновления зависит от многих причин - тут и время между запросами обновления, зависящее от длины исполняемых фрагментов основной программы между запросами на обновление, количество знакомест, модуль одновременно выводимых позиций (если портов сегментных ключей более одного) и прочие "стечения обстоятельств". Иногда даже от момента взгляда на индикатор (типа "...уфф! и померещится же!..."). Давно уже все это учтено в спецконтроллерах. А к самодельной динамической индикации разве что для всяких рекламных щитов с "мультипликацией" да изредка бегущих строк (и то там уже давно спецконтроллеры подавляющее преимущество по применению получили) обращаются.
если для 74hc595 можно сделать синхронизацию вывода в буфер после окончания вывода всей строки, а как быть со спецконтроллером MAX7219, у него не узнаешь, когда закончен вывод всех 8 разрядов?
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
У MAX7219 это уже заложено в его внутренней прошивке - это же не просто регистр, а спецконтроллер динамической индикации. К примеру, кусочек из моей самодельной библиотеки с описанием его программно доступных ресурсов:
Спойлер
Код:
#define addp0 1 // значение адреса регистра данных позиции 1 дисплея #define addp1 2 // значение адреса регистра данных позиции 2 дисплея #define addp2 3 // значение адреса регистра данных позиции 3 дисплея #define addp3 4 // значение адреса регистра данных позиции 4 дисплея #define addp4 5 // значение адреса регистра данных позиции 5 дисплея #define addp5 6 // значение адреса регистра данных позиции 6 дисплея #define addp6 7 // значение адреса регистра данных позиции 7 дисплея #define addp7 8 // значение адреса регистра данных позиции 8 дисплея
#define No_Op 0 // значение адреса регистра No_Op // регистр No_Op используется исключительно при каскадировании max7219 #define Dec_Mod 9// значение адреса регистра Decode_Mode #define Intensit 0x0A // значение адреса регистра Intensity #define Sc_Lim 0x0B // значение адреса регистра Scan_Limit #define Shut_Dn 0x0C // значение адреса регистра Shut_Down #define Disp_ts 0x0F // значение адреса регистра Display_test
#define Com_DM_0 0 // Dec_Mod, все позиции только под знакосинтез DM отключен #define Com_DM_1 1 // Dec_Mod, B_fntN только для позиции 0, поз. 1-7 под знакосинтез #define Com_DM_2 2 // Dec_Mod, B_fntN для позиций 0-3, поз. 4-7 под знакосинтез #define Com_DM_3 3 // Dec_Mod, B_fntN для позиций 0-7
#define Com_int_0 0 // Intensit, уровень яркости 1/32 (минимальный) #define Com_int_1 1 // Intensit, уровень яркости 3/32 #define Com_int_2 2 // Intensit, уровень яркости 5/32 #define Com_int_3 3 // Intensit, уровень яркости 7/32 #define Com_int_4 4 // Intensit, уровень яркости 9/32 #define Com_int_5 5 // Intensit, уровень яркости 11/32 #define Com_int_6 6 // Intensit, уровень яркости 13/32 #define Com_int_7 7 // Intensit, уровень яркости 15/32 #define Com_int_8 8 // Intensit, уровень яркости 17/32 #define Com_int_9 9 // Intensit, уровень яркости 19/32 #define Com_int_A 10 // Intensit, уровень яркости 21/32 #define Com_int_B 11 // Intensit, уровень яркости 23/32 #define Com_int_C 12 // Intensit, уровень яркости 25/32 #define Com_int_D 13 // Intensit, уровень яркости 27/32 #define Com_int_E 14 // Intensit, уровень яркости 29/32 #define Com_int_F 15 // Intensit, уровень яркости 31/32 (максимальный)
#define Com_SL_0 0 // Sc_Lim, индикация только в позиции 0 (max s I 10mA!) #define Com_SL_1 1 // Sc_Lim, индикация только в позиции 0,1 (max s I 20mA!) #define Com_SL_2 2 // Sc_Lim, индикация только в позиции 0,1,2 (max s I 30mA!) #define Com_SL_3 3 // Sc_Lim, индикация только в позиции 0,1,2,3 #define Com_SL_4 4 // Sc_Lim, индикация только в позиции 0,1,2,3,4 #define Com_SL_5 5 // Sc_Lim, индикация только в позиции 0,1,2,3,4,5 #define Com_SL_6 6 // Sc_Lim, индикация только в позиции 0,1,2,3,4,5,6 #define Com_SL_7 7 // Sc_Lim, индикация только в позиции 0,1,2,3,4,5,6,7
#define Com_Shutdn_md 0 // Shut_Dn, значение данных команды Shutdown_mode #define Com_Normal_md 1 // Shut_Dn, значение данных команды Normal_mode #define Com_tst_on_md 1 // Disp_ts, значение данных команды display test on_mode #define Com_tst_of_md 0 // Disp_ts, значение данных команды display test off_mode
и сама "библиотечка" (сделана "в рамках референса" ардуино)
удивляюсь я сочинительством библиотек для самых простых дел. для MAX7219 нужна всего одна подпрограмма (функция) отправки двух байтов команды, и ради этого сочинять библиотеку. ладно, сочинил библиотеку, сделал, что хотел. а зачем ты везде сделал задержки по 60 мкс? только тормозить вывод. микросхема работает до 10 МГц, это значит, что она будет работать даже при тактовой частоте 20 МГц, и без всяких принудительных задержках. а зачем тебе понадобилось создавать функцию overZnak? а также функцию znak, которая у тебя при выводе не используется?
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения