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

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


_vintik

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

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

Спойлер

PIC16F628A_2.thumb.jpg.9a73be5a95ef7eebd0b4d09068896c92.jpg

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

Спойлер

PIC16F628A.jpg.0981d687107892d1dfced8e92bdacdc6.jpg

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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

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

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

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

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

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

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


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

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

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

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

 

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

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

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

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

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

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

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

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

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

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

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

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

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 пользователей онлайн

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