Jump to content

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


_vintik
 Share

Recommended Posts

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

Спойлер

PIC16F628A_2.thumb.jpg.9a73be5a95ef7eebd0b4d09068896c92.jpg

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

Спойлер

PIC16F628A.jpg.0981d687107892d1dfced8e92bdacdc6.jpg

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

Edited by _vintik
Link to comment
Share on other sites

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

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

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

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

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

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

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

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


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

Link to comment
Share on other sites

Posted (edited)
55 минут назад, IMXO сказал:

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

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

 

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

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

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

Edited by _vintik
Link to comment
Share on other sites

ИП MEAN WELL для медицинских и промышленных устройств на складе Компэл

Компэл расширяет складскую программу по специальным ИП для применения в медицинских приборах и промышленных устройствах. Представлены ИП в диапазоне мощности от 5 до 500 Вт, по медицинскому стандарту EN60601-1 с двумя мерами защиты пациента (2хMOPP; тип BF) для устройств, контактирующих с пациентом.  

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

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

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

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

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

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

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

Link to comment
Share on other sites

Популярные модели литиевых батареек FANSO EVE Energy готовы к отправке
На складе КОМПЭЛ уже готовы к поставке одни из самых востребованных литиевых батареек типов ER и CR производства FANSO EVE Energy – одного из мировых лидеров на рынке первичных литиевых элементов питания.
Данные источники тока получили широкое применение в различных областях, будь то системы безопасности, приборы учета или мелкая бытовая техника.

Подробнее о применениях >>

Posted (edited)

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

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

 

Edited by _vintik
Link to comment
Share on other sites

LED-драйверы MEAN WELL на складе – выбор больше, стоимость ниже

Компэл расширил и существенно пополнил склад LED-драйверами компании MEAN WELL, одновременно снизив цену на них. В настоящий момент на складе представлена широкая линейка продукции для наружного (семейства HLG, ELG, XLG, LPC, LPV), и для внутреннего (APC, LCM, SLD, APV) освещения.

Имеется большой выбор моделей с различными режимами стабилизации выходных параметров. Кроме того, есть в наличии и линейка DC/DC-драйверов, как понижающих (семейство LDD), так и повышающих (семейство LDH).

Подробнее>>

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

Link to comment
Share on other sites

LIR-20 – модуль резервирования питания от MORNSUN
Компания MORNSUN расширила линейку продукции, монтируемой на DIN-рейку, выпустив модуль резервирования питания LIR-20 с максимальным током до 20 А на канал. Модуль можно использовать на шинах с напряжением 24 или 48 В (полный диапазон напряжения 22…60 В). Данный модуль применяется в системах, где даже выход из строя источника питания (ИП) не должен привести к потере напряжения. К модулю резервирования подключаются два источника питания, причем один из них может быть бесперебойным (ИБП; UPS), и нагрузка.

Читать подробнее >>

Posted (edited)
9 часов назад, IMXO сказал:

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

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

Спойлер

293268242_.thumb.JPG.561ebbab6d346dc7f8b9d1f72d6ae126.JPG

 

Edited by _vintik
Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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                  ;

 

 

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

Спойлер

led.JPG.88b7a5499c4a5eb44097e430874b80a1.JPG

 

Link to comment
Share on other sites

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

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

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

Спойлер

2009301972_.jpg.1d5b500b0603089c7b971fbd469a1421.jpg


 

 

Link to comment
Share on other sites

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

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

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

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

Edited by _vintik
Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Сообщения

    • При питании от самодельного БП, я правильно понимаю? Преобразователь-то нерабочий.
    • Там двухкаскадный резонансный УВЧ на КП307. Полевик не шунтирует контур, добротность и избирательность бешеные!
    • Схема рабочая, но не заточена изначально под такую силу тока, т.к. обычно сила потребляемого тока кулером до 0,5 Ампер (в моем случае 0,23 А). При этом схема даже работает какое-то время на максимальных оборотах, на минимальных же просто сильно греется транзистор, т.е. если висят парочка кулеров, то транзистор еле тёплый.   Путаете, 2SD882 гораздо скромнее чем КТ817: 12,5 Вт против 25 ВТ у КТ817, 90 МГц против 3 Мгц у КТ817, Hfe 160 против 25 у КТ817. Спасибо. Но всё таки есть ли возможность для большей силы тока изменить ту схему что уже имеется? Ещё нашёл что вроде мой потенциометр на 1 кОм только до 12 Вольт, но это не точно. Потенциометр на картинке
    • В исправном только тихое шипение, как я понимаю, его специально добавляют в звук. А гул добавился после аварии, по ощущениям синхронизирован с сетевым шумом от окружающих импульсников. Гудит из самого аппарата, что с подключенной телефонной линией, что без неё.
    • Эстония 008 и Эстония 010 ещё качественее. Только редкие и дорогие. Это Вы про Суперджет 100 российский ? Там электроника - голимое дерьмо китайское. https://www.google.com/search?client=opera&q=Суперджет+дерьмо&sourceid=opera&ie=UTF-8&oe=UTF-8
    • Посмотрел схему Радиотехники 101. Потрясающий аппарат! Там 3 транзистора только в УВЧ. Дальше идет К174ПС1 и К174ХА6. Не нужно сравнивать К174ХА34 с этим высококачественным тюнером!
    • Зачем их выдумывать... Достаточно вспомнить, как в самолётах стали кондовые и тяжёлые "совковые" элементы электроники стали менять на "современные" импортные... Аварийность возросла на порядки, а летальность при этом на десятки порядков.
×
×
  • Create New...