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

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

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

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

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

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

1 час назад, _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).

Подробнее>>

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

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

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

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

Link to comment
Share on other sites

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

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

Подробнее>>

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.
  • Сообщения

    • Мои халявные аккумы формата ААА от комплектов раций. Первое - визуальная отбраковка, типа "мятые и кислые" (с механическими повреждениями и со следами окислов/протечек).  Далее заряжал через штатную зарядку с последующей проверкой на нагрузочную способность, но быстро понял, что это как воду решетом носить, типа в час по чайной ложке... У знакомого взял умную зарядку (зашита функция тренировки - разряд/заряд, и по результатам выставляет типа "годность" в % ... ), с этой зарядкой удалось реанимировать (с нагрузочной способностью 50% и выше) несколько аккумов, остальные 90-95% ушли в утилизацию (заморозка для таки аккумов что смертельный приговор). С уважением, Сергей.  
    • И задержки выключения не будет. Эта схема вообще никак не влияет на срабатывание ЭМ привода.  А вот если включить в разрыв указанной цепи, допустим, резистор, то будет задержка включения. Номинал балласта придётся подобрать экспериментально или рассчитать, измерив минимальный ток срабатывания расцепителя. На рассеиваемой мощности балласта можно сэкономить, т.к. работает он кратковременно.
    • PS к тестеру для проверки ОУ. Оказалось, TL072 (или его подделка) таки живой. Но, с ним всё равно не работает Пират. Существенное отличие NE5532 от TL072 при тестировании в том, что когда у NE два светодиода в одном плече тухнут одновременно то в другом плече загораются тоже оба одновременно. Т.е. напряжение смещения на входах ОУ практически 0 V. У TL072 - сначала тухнет/загорается светодиод в одном плече, а потом (при дальнейшем вращении резистора R8) - в другом плече. Т.е. смещения на входах ОУ есть. Не знаю на сколько это важно, но, на всякий случай, делюсь этим наблюдением.
    • странный вопрос , что мешает скачать даташиты с тырнета и проверить согласно описания? HC237 - обычный демультиплексор 3 на 8 I7662 - ICL7662 DC/DC преобразователь , формирует отрицательное напряжения для ОУ IL410 это вообще обычная смисторная оптопара с зеро-кроссом.   можно, проверить условия запуска осликом, и наличие смены напряжения на выходах, можно засунуть в програматор и проверить возможность чтения  бита конфига, а вообще убить ОТРку от мелкотельных это надо очень постараться.
    • Не зная, как должен работать прибор, не зная назначение и параметры выходных сигналов, не зная, что должно быть подключено к имеющимся на этой плате разъёмам, "ремонт" не имеет абсолютно никакого смысла. Да вы и сами это понимаете. И даже если вы, перебрав все элементы, наткнётесь на какой-то неисправный и замените, то никакого вклада в ваше "общее развитие" это всё равно не принесёт. Ну разве что приобретёте навык долго, бессмысленно и бесполезно трудиться. Прошивка в контроллере конечно есть (по крайней мере была), считать вы её не сможете.
    • Стрелочный индикатор.lay6 Плата исправленная. Лучше поздно как говорится  Понадобится скоро такой вероятно-вспомнил
    • Доброго времени суток! Прибор принесли после энного количества ремонтов.Последний кто смотрел сказал что один из транзисторов "снял шляпу",были проверены ещё несколько но неисправных не было,но он поменял несколько показавшихся подозрительными,-ничего не изменилось.Поменянные транзисторы не сгорели.При проверке было обнаружено что прибор формирует некий сигнал на выходе с напряжением в 50v,а вот сила тока в районе 2 микро ампер.На приборе присутствует регулировка мощности,но сила тока на выходе не меняется.При регулировке мощности на LM358 формируется сигнал с напряжением до минус 4,5 вольта.Прошивки (если она есть в контроллерах) в наличии нет и возможности узнать тоже нет.Можно ли определить это "мозги" или нет?ЛМ358,УЛН2003а  и x9c102s проверены,в порядке.Мелочёвка вроде тоже вся в номинале.Не совсем понимаю как проверить HC237 , I7662 и IL410. Прибор вряд ли будет использоваться,так как это какой-то СПА,используется в косметологии для кожи,а так как нет никаких гарантий,что сигнал тот,что необходим,то использование чревато последствиями...Ищу неисправность для общего развития.Если необходимо могу выложить осциллограммы и замеры(напряжение,ток,частота) с интересующих мест на плате. P.S. Коллекторные выводы на гнезде JP2 объединены из четырёх в один,выводов после "мамы" соответственно 2.
×
×
  • Create New...