_vintik Опубликовано 24 июня, 2022 Поделиться Опубликовано 24 июня, 2022 (изменено) Столкнулся с интересной задачкой. Есть порт у которого пять бит настроены входами и три бита выходами. Нужно два бита инвертировать RA4 и RA3- это катоды двухразрядного семисегментного индикатора. И один бит RA0 сохранять, не потерять его значение при переключении разрядов индикатора. При инициализации есть предустановка PORTA b'00010000' У меня получилось четыре работающих варианта в симуляторе MPLAB. В железе работает только один, третий вариант. По началу грешил на чтение-модификацию-запись, но в описании к PIC16F628A, есть пример. Спойлер И как мне показалось, с моим вариантом не связан, но кто его знает... У меня нет изменения направления работы портов. Они настраиваются один раз при инициализации. Вот собственно моя задачка. (убрал под спойлер просто не знаю, как изменить размер картинки в теме, без потери качества) Спойлер Хочется сразу предупредить, с настройками портов, аналоговых входов, банков и т.д. - всё нормально. Один вариант ведь работает. В верху картинки добавил настройку TRISA из инициализации МК. При тестировании эти две строки комментируются. Что скажете господа, как можно обьяснить физику процесса. Изменено 24 июня, 2022 пользователем _vintik 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 24 июня, 2022 Поделиться Опубликовано 24 июня, 2022 38 минут назад, _vintik сказал: По началу грешил на чтение-модификацию-запись, но в описании к PIC16F628A, есть пример. И как мне показалось, с моим вариантом не связан, но кто его знает... это оно и есть... 38 минут назад, _vintik сказал: И один бит сохранять, не потерять его значение при переключении разрядов индикатора вариант 3 рабочий но он избыточен... просто для работы на выход создайте виртуальный порт tempPORTA и работайте с портом через него ;--------------------- movlw (1<<4)||(1<<3) xorwf tempPORTA,W movwf tempPORTA movwf PORTA PS будьте аккуратней с RA4 при работе на выход, это вывод открытый коллектор 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
_vintik Опубликовано 24 июня, 2022 Автор Поделиться Опубликовано 24 июня, 2022 (изменено) 55 минут назад, IMXO сказал: это оно и есть... Значит не показалось)) 55 минут назад, IMXO сказал: для работы на выход создайте виртуальный порт tempPORTA и работайте с портом через него Да, спасибо за подсказку. Дубликат порта у меня Razr_msk. Но вот "работать через него", пожалуй это ключик. Еще раз спасибо. Так работает нормально: movlw b'00011000' ; xorwf Razr_msk,W ; movwf Razr_msk ; movwf PORTA ; Изменено 24 июня, 2022 пользователем _vintik 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
IMXO Опубликовано 24 июня, 2022 Поделиться Опубликовано 24 июня, 2022 1 час назад, _vintik сказал: Нужно два бита инвертировать RA4 и RA3- это катоды двухразрядного семисегментного индикатора. хотя это в корне не правильный подход к работе с динамической индикацией, можете легко получить эффект постсвечения или засветки нерабочих сегментов. правильный: выключаем все индикаторы , меняем значение сегментов, включаем нужный индикатор. 1 час назад, _vintik сказал: Они настраиваются один раз при инициализации. несколько не корректная инициализация, но в принципе для динамической индикации не критично. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
_vintik Опубликовано 24 июня, 2022 Автор Поделиться Опубликовано 24 июня, 2022 (изменено) С индикацией все нормально. Сделал посегментную на двух разрядах. Весь цикл отображения занимает 7 мс. Даже на камеру не видно. ;--------------------обработчик посегментной индикации-------------- movf Count_seg,F ; Если все сегменты отработаны btfss STATUS,Z ; то переключаем разряд goto SEGM_INT ; movlw b'00000001' ; Обновляем маску сегментов(анодов) movwf Seg_msk ; movlw .7 ; Обновляем счетчик сегментов movwf Count_seg ; movlw b'00011000' ; xorwf Razr_msk,W ; movwf Razr_msk ; movwf PORTA ; movf LD0,W ; btfsc PORTA,3 ; movf LD1,W ; movwf Data_rzr ; SEGM_INT bcf STATUS,C ; rlf Seg_msk,W ; Переключаем сегмент. movwf Seg_msk ; andwf Data_rzr,W ; movwf PORTB ; decf Count_seg,F ; ;--------------------восстановление контекста------------------------------- Изменено 24 июня, 2022 пользователем _vintik 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 24 июня, 2022 Поделиться Опубликовано 24 июня, 2022 Вам видней смысл в посегментной индикации для двух разрядов несколько не понятен это имеет смысл для кол-ва разрядов больше шести. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
_vintik Опубликовано 25 июня, 2022 Автор Поделиться Опубликовано 25 июня, 2022 (изменено) 9 часов назад, IMXO сказал: смысл в посегментной индикации для двух разрядов несколько не понятен В случае ультра ярких индикаторов гасящие резисторы ставятся только в разряды (общие катоды-аноды). Два резистора, в место семи. При плотном монтаже это существенно. А можно обойтись и без оных. Все копья по этому поводу давно поломаны. На картинке скрины работы портов в измерителе температуры на MAX6675. Токи в импульсе на один "пин", не превышают 16 мА. Спойлер Изменено 25 июня, 2022 пользователем _vintik 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Изя Опубликовано 26 июня, 2022 Поделиться Опубликовано 26 июня, 2022 В 25.06.2022 в 02:25, IMXO сказал: смысл в посегментной индикации для двух разрядов несколько не понятен это имеет смысл для кол-ва разрядов больше шести. Как раз наоборот. Больше сегментов - больше скважность, меньше яркость. Хотя и тут, возможны варианты. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 26 июня, 2022 Поделиться Опубликовано 26 июня, 2022 @Изя и где таки, Ви там за скважность и яркость услышали 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Изя Опубликовано 26 июня, 2022 Поделиться Опубликовано 26 июня, 2022 Ну как же, модя. Ведь нужно успеть зажечь все сегменты за хотя бы 15 мс, иначе будет неприятно глазу. А отсюда скважность. А отсюда яркость. Не? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 26 июня, 2022 Поделиться Опубликовано 26 июня, 2022 все с вами понятно. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
_vintik Опубликовано 27 июня, 2022 Автор Поделиться Опубликовано 27 июня, 2022 На мой взгляд, преимущество посегментной против пораздядной, - однородное свечение. Независимо от количества зажженных сегментов в разряде. По яркости конечно проигрывает. Если в поразрядной на каждый разряд поставить ключи(усложнение схемы), то неравномерность свечения сегментов разных цифр исчезает. Т.к. ограничением тока являются только резисторы в сегментах, а не сопротивление открытого ключа в порту. Я стараюсь делать посегментную, от одного до трех разрядов, в четырех разрядных уже очень тускло получается. 19 часов назад, Изя сказал: зажечь все сегменты за хотя бы 15 мс Частоту обновления можно выбрать любой. В моем варианте на обработку одного сегмента тратится 16-25 циклов. 25 х 14сег = 350мкс - время полного обновления. А период выбран 512 циклов 512 х 14сег = 7 мс. Есть время и на полезную нагрузку и в глазах не рябит)) Спойлер ; П/П ПРЕРЫВАНИЯ по переполнению TMR0 = 512мкс ;--------------------------------------------------------------------------------------- movwf W_temp ; Сохранение контекста. swapf STATUS,W ; clrf STATUS ; Банк 0 movwf S_temp ; ;--------------------обработчик посегментной индикации-------------- rlf Seg_msk,W ; Переключаем сегмент. movwf Seg_msk ; andwf Data_rzr,W ; movwf PORTB ; decfsz Count_seg,F ; goto OUT_INT ; Выход bsf Seg_msk,0 ; Обновляем маску сегментов(b'00000001') bsf Count_seg,3 ; Обновляем счетчик сегментов 8 movlw b'00011000' ; Переключаем разряд xorwf Temp_PORTA,W ; movwf Temp_PORTA ; movwf PORTA ; movf LD0,W ; Загружаем данные для текущего разряда btfsc Temp_PORTA,3 ; movf LD1,W ; movwf Data_rzr ; ;--------------------восстановление контекста------------------------------- OUT_INT bcf INTCON,2 ; Сброс флага переполнения TMR0 swapf S_temp,W ; movwf STATUS ; swapf W_temp,F ; swapf W_temp,W ; retfie ; 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 27 июня, 2022 Поделиться Опубликовано 27 июня, 2022 3 часа назад, _vintik сказал: Я стараюсь делать посегментную, от одного до трех разрядов, в четырех разрядных уже очень тускло получается. КМК у нас разные понятия о работе посегментной индикации... Вообще-то яркость при посегментной индикации получается одинаковой вне зависимости от кол-ва разрядов. Будет их 2 или 16ть время обновления всегда остается постоянной. 7 системных тиков для 7ми сегментных индикаторов и 8 сис.тиков для 8ми сегментных. Если сис.тик = 1мс полное обновление пройдет за 8мс. вся задача сводится к пересчету матрицы [8;Х] в матрицу [Х;8], где Х - количество разрядов, задача тривиальная и решается вне тела прерывания. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
_vintik Опубликовано 27 июня, 2022 Автор Поделиться Опубликовано 27 июня, 2022 52 минуты назад, IMXO сказал: вся задача сводится к пересчету матрицы Это понятно, но отношение горит-негорит(скважность), останется неизменной. И зависит только от количества разрядов. У посегментной, относительно поразрядной скважность больше в семь раз. Спойлер 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 27 июня, 2022 Поделиться Опубликовано 27 июня, 2022 1 час назад, _vintik сказал: У посегментной, относительно поразрядной скважность больше в семь раз. это не так, у посегментной скважность постоянна 1/8. Спойлер 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
_vintik Опубликовано 27 июня, 2022 Автор Поделиться Опубликовано 27 июня, 2022 (изменено) 44 минуты назад, IMXO сказал: это не так, у посегментной скважность постоянна 1/8. Если с запятой, то да - 1/8. Но приведенные картинки для посегментной индикации неверные. Конечно, "разворачивать" цифру в разряде можно переключая разряды на каждый сегмент - не суть. Суть в том, что за один цикл высветить сегмент в обоих разрядах(2х разрядный), не получится. Будет одна цифра в обоих разрядах. Чтобы развернуть картинку в двух разрядах потребуется 16 "обращений". Или ошибаюсь...щас-щас подумаем)) Изменено 27 июня, 2022 пользователем _vintik 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость_Григорий_Т. Опубликовано 27 июня, 2022 Поделиться Опубликовано 27 июня, 2022 @_vintik наверно, подразумевается, что сегменты сканируются, а нужный разряд подключается, если в нём данный сегмент активен. Тогда 8. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 27 июня, 2022 Поделиться Опубликовано 27 июня, 2022 верно, именно так. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
_vintik Опубликовано 27 июня, 2022 Автор Поделиться Опубликовано 27 июня, 2022 1 час назад, IMXO сказал: верно, именно так. Хочется сказать "а шо, так можно было")) Спойлер ;--------------------------------------------------------------------------------------- ; П/П ПРЕРЫВАНИЯ по переполнению TMR0 = 512мкс ;--------------------------------------------------------------------------------------- movwf W_temp ; Сохранение контекста. swapf STATUS,W ; clrf STATUS ; Банк 0 movwf S_temp ; ;--------------------обработчик посегментной индикации-------------- bsf Temp_PORTA,3 ; Выключаем разряды (в +) bsf Temp_PORTA,4 ; movf Temp_PORTA,W ; movwf PORTA ; rlf Seg_msk,W ; Переключаем сегмент. movwf Seg_msk ; movwf PORTB ; bsf Temp_PORTA,3 ; btfsc LD0,1 ; bcf Temp_PORTA,3 ; bsf Temp_PORTA,4 ; btfsc LD1,1 ; bcf Temp_PORTA,4 ; movf Temp_PORTA,W ; movwf PORTA ; rrf LD1,W ; Пересылаем <7> через бит C в <0> rrf LD1,F ; rrf LD0,W ; rrf LD0,F ; decfsz Count_seg,F ; goto OUT_INT ; Выход bsf Seg_msk,0 ; Обновляем маску сегментов(b'00000001') bsf Count_seg,3 ; Обновляем счетчик сегментов 8 ;--------------------восстановление контекста------------------------------- OUT_INT bcf INTCON,2 ; Сброс флага переполнения TMR0 swapf S_temp,W ; movwf STATUS ; swapf W_temp,F ; swapf W_temp,W ; retfie ; Работает, и для моего 4х разрядного термометра будет в самый раз. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.