Перейти к содержанию

Чтение-модификация -запись


_vintik

Рекомендуемые сообщения

Столкнулся с интересной задачкой.
Есть порт у которого пять бит настроены входами и три бита выходами. Нужно два бита инвертировать RA4 и RA3- это катоды двухразрядного семисегментного индикатора. И один бит RA0 сохранять, не потерять его значение при переключении разрядов индикатора. При инициализации есть предустановка PORTA  b'00010000'
У меня получилось четыре работающих варианта в симуляторе MPLAB. В железе работает только один, третий вариант. По началу грешил на чтение-модификацию-запись, но в описании к PIC16F628A, есть пример. 

Спойлер

PIC16F628A_2.thumb.jpg.9a73be5a95ef7eebd0b4d09068896c92.jpg

И как мне показалось, с моим вариантом не связан, но кто его знает... У меня нет изменения направления работы портов. Они настраиваются один раз при инициализации.
Вот собственно моя задачка. (убрал под спойлер просто не знаю, как изменить размер картинки в теме, без потери качества)

Спойлер

PIC16F628A.jpg.0981d687107892d1dfced8e92bdacdc6.jpg

Хочется сразу предупредить, с настройками портов, аналоговых входов, банков и т.д. - всё нормально. Один вариант ведь работает. В верху картинки добавил настройку TRISA из инициализации МК. При тестировании эти две строки комментируются.
Что скажете господа, как можно обьяснить физику процесса.

Изменено пользователем _vintik
Ссылка на комментарий
Поделиться на другие сайты

38 минут назад, _vintik сказал:

По началу грешил на чтение-модификацию-запись, но в описании к PIC16F628A, есть пример. 

И как мне показалось, с моим вариантом не связан, но кто его знает...

это оно и есть...

38 минут назад, _vintik сказал:

И один бит сохранять, не потерять его значение при переключении разрядов индикатора

вариант 3 рабочий но он избыточен...
просто для работы на выход создайте виртуальный порт tempPORTA и работайте с портом через него

;---------------------
    movlw (1<<4)||(1<<3)
    xorwf tempPORTA,W
    movwf tempPORTA
    movwf PORTA   


PS будьте аккуратней с RA4 при работе на выход,  это вывод открытый коллектор

Ссылка на комментарий
Поделиться на другие сайты

55 минут назад, IMXO сказал:

это оно и есть...

Значит не показалось))
 

 

55 минут назад, IMXO сказал:

для работы на выход создайте виртуальный порт tempPORTA и работайте с портом через него

Да, спасибо за подсказку. Дубликат порта у меня Razr_msk. Но вот "работать через него", пожалуй это ключик. Еще раз спасибо.
Так работает нормально:
    movlw    b'00011000'    ;
    xorwf    Razr_msk,W    ;
    movwf    Razr_msk    ;
    movwf    PORTA        ;

Изменено пользователем _vintik
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, _vintik сказал:

Нужно два бита инвертировать RA4 и RA3- это катоды двухразрядного семисегментного индикатора.

хотя это в корне не правильный подход к работе с динамической индикацией,
можете легко получить эффект постсвечения или засветки нерабочих сегментов.
правильный:
выключаем все индикаторы , меняем значение сегментов, включаем нужный индикатор.
 

1 час назад, _vintik сказал:

Они настраиваются один раз при инициализации.

несколько не корректная инициализация, но в принципе для динамической индикации не критично.

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

С индикацией все нормально. Сделал посегментную на двух разрядах. Весь цикл отображения  занимает 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	; 

;--------------------восстановление контекста-------------------------------

 

Изменено пользователем _vintik
Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

9 часов назад, IMXO сказал:

смысл в посегментной индикации для двух разрядов несколько не понятен

В случае ультра ярких индикаторов гасящие резисторы ставятся только в разряды (общие катоды-аноды). Два резистора, в место семи. При плотном монтаже это существенно. 
А можно обойтись и без оных. Все копья по этому поводу давно поломаны. На картинке скрины работы портов в измерителе температуры на MAX6675. Токи в импульсе на один "пин", не превышают 16 мА.

Спойлер

293268242_.thumb.JPG.561ebbab6d346dc7f8b9d1f72d6ae126.JPG

 

Изменено пользователем _vintik
Ссылка на комментарий
Поделиться на другие сайты

В 25.06.2022 в 02:25, IMXO сказал:

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

Как раз наоборот. Больше сегментов - больше скважность, меньше яркость. Хотя и тут, возможны варианты.

Ссылка на комментарий
Поделиться на другие сайты

Ну как же, модя. Ведь нужно успеть зажечь все сегменты за хотя бы 15 мс, иначе будет неприятно глазу. А отсюда скважность. А отсюда яркость. Не?

Ссылка на комментарий
Поделиться на другие сайты

На мой взгляд, преимущество посегментной против пораздядной, - однородное свечение. Независимо от количества зажженных сегментов в разряде. По яркости конечно проигрывает. Если в поразрядной на каждый разряд поставить ключи(усложнение схемы), то неравномерность свечения сегментов разных цифр исчезает. Т.к. ограничением тока являются только резисторы в сегментах, а не сопротивление открытого ключа в порту.
Я стараюсь делать посегментную, от одного до трех разрядов, в четырех разрядных уже очень тускло получается.

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                  ;

 

 

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, _vintik сказал:

Я стараюсь делать посегментную, от одного до трех разрядов, в четырех разрядных уже очень тускло получается.

КМК у нас разные понятия о работе посегментной индикации...
Вообще-то яркость при посегментной индикации получается одинаковой вне зависимости от кол-ва разрядов. Будет их 2 или 16ть время обновления всегда остается постоянной.  7 системных тиков для 7ми сегментных индикаторов и 8 сис.тиков для 8ми сегментных.
Если сис.тик = 1мс полное обновление пройдет за 8мс.
вся задача сводится к пересчету матрицы [8;Х] в матрицу [Х;8], где Х - количество разрядов, задача тривиальная и решается вне тела прерывания.

Ссылка на комментарий
Поделиться на другие сайты

52 минуты назад, IMXO сказал:

вся задача сводится к пересчету матрицы

Это понятно, но отношение горит-негорит(скважность), останется неизменной. И зависит только от количества разрядов. У посегментной, относительно поразрядной скважность больше в семь раз. 

Спойлер

led.JPG.88b7a5499c4a5eb44097e430874b80a1.JPG

 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, _vintik сказал:

У посегментной, относительно поразрядной скважность больше в семь раз. 

это не так, у посегментной скважность постоянна 1/8.

Спойлер

2009301972_.jpg.1d5b500b0603089c7b971fbd469a1421.jpg


 

 

Ссылка на комментарий
Поделиться на другие сайты

44 минуты назад, IMXO сказал:

это не так, у посегментной скважность постоянна 1/8.

Если с запятой, то да - 1/8.
Но приведенные картинки для посегментной индикации неверные. Конечно, "разворачивать" цифру в разряде можно переключая разряды на каждый сегмент - не суть. Суть в том, что за один цикл высветить сегмент в обоих разрядах(2х разрядный), не получится. Будет одна цифра в обоих разрядах. Чтобы развернуть картинку в двух разрядах потребуется 16 "обращений".

Или ошибаюсь...щас-щас подумаем))

Изменено пользователем _vintik
Ссылка на комментарий
Поделиться на другие сайты

@_vintik наверно, подразумевается, что сегменты сканируются, а нужный разряд подключается, если в нём данный сегмент активен. Тогда 8.

Ссылка на комментарий
Поделиться на другие сайты

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х разрядного термометра будет в самый раз.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...