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

16F628 И 74Hc595


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

Доброго времени всем!

В программировании я новичок..Тема для меня интересная-решил занятся.Собрал вот такую отладочную плату http://www.labkit.ru...rs_shm?id=444. ну и конечно программатор.В виде эксперемента написал вот такую программку,которая последовательно включает и затем гасит сегменты индикатора..Но вот одного никак не могу понять..как реализовать вывод цифр, в разряды индикатора..Как через порт RA7 загрузить7 бит(код цифр) Если не использовать сдвиговый регистр,то все понятно..просто использовать таблицу соответствия числа и семисегментного кода...Первое что приходит в голову,пока что с минимальным уровнем моих познаний,это для каждой цифры написать 9 подпрограмм и обращатся к ним, в зависимости от того какую цифру нужно вывести..но получается очень громоздко..наверняка это можно сделать как то проще..Если не трудно напишите пример. Или подскажите хотя бы алгоритм..

new.7z

111.7z

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

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

это сам алгоритм

' Точка = 16 Данные для 7-сегм.индикатора с общим анодом

' 1=221, 2=, 4=92, 7=217, 8=127 Для включения сегмента подать "0"

Byte0 = 76 '92 - 16 = 76 == "4" и Точка ' Что будем загружать в сдвиговый регистр

For Temp = 0 To 7

If Byte0.temp = 1 Then

Hc_595_data = 1

Else

Hc_595_data = 0

End If

Hc_595_clock = 1 : Waitms 1 : Hc_595_clock = 0 : Waitms 1

Next

Hc_595_load = 1 : Waitms 1 : Hc_595_load = 0 : Waitms 1

Segm7_1 = 1 : Waitms 500 : Segm7_1 = 0 ' Пауза 0.5 секунды

Byte1 = 221 ' Что будем загружать в сдвиговый регистр

For Temp = 0 To 7

If Byte1.temp = 1 Then

Hc_595_data = 1

Else

Hc_595_data = 0

End If

Hc_595_clock = 1 : Waitms 1 : Hc_595_clock = 0 : Waitms 1

Next

Hc_595_load = 1 : Waitms 1 : Hc_595_load = 0 : Waitms 1

Segm7_2 = 1 : Wait 1 : Segm7_2 = 0

Waitms 500 ' Пауза 0.5 секунды

Gosub Demo_7_segm ' В подпрограмму

Demo_7_segm:

Restore Dta1 ' Откуда будем читать данные

For Byte1 = 0 To 13 ' 13 раз

Read Byte0 ' Что будем загружать в сдвиговый регистр

For Temp = 0 To 7 ' 8 раз

If Byte0.temp = 1 Then ' Если указанный бит = 1, то

Hc_595_data = 1

Else ' Иначе

Hc_595_data = 0

End If

Hc_595_clock = 1 : Waitms 1 ' Тактовые импульсы =1

Hc_595_clock = 0 : Waitms 1 ' Тактовые импульсы =0

Next

Hc_595_load = 1 : Waitms 1 ' Импульс на вход "загрузка"

Hc_595_load = 0 : Waitms 1

Segm7_1 = 1 : Segm7_2 = 1 : Waitms 100 : Segm7_1 = 0 : Segm7_2 = 0

Waitms 10

Next

Return

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

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

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

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

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

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

Спасибо,конечно..но единственное что понял из сего,что проверяем биты в загружаемом коде числа..если 0,то сбрасываем дату-если 1 то поднимаем ..буду разбиратся...вот если бы еще пример программы на асм...был бы очень признателен..

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

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

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

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

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

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

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

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

Пусть в R1 загружена информация о сегментах которые нужно засветить, т.е. готовая для выдачи на индикатор. Регистр R0 используется для счёта битов

//Счётчик битов - будем считать 8
movlw 8
movfw R0

//Цикл перебора битов
cyc:

movfw R1 //Загружаем в W значение
andlw 0x80 //Обнуляем все биты кроме того, который окажется на месте RA7 - старший бит.
movwf PORTA //На ножке RA7 окажется соответствующий бит, остальные по нулям - регистр не реагирует

//Командами BSF PORTA и BСF PORTA формируем сигналы на нужных управляющих выходах (RA0 и RA1 которые), чтобы регистр "обработал" бит
//(Я просто не вникал в форму управляющих сигналов этого регистра)

rlf R1 //Сдвигаем исходные данные влево, чтобы на месте старшего бита оказался следующий по счёту битик

decfsz R0 //Вычитаем единичку из счётного регистра и заодно это проверка на флаг (люблю эту команду - удобная)
goto cyc //Регистр R0 - не ноль - продолжаем цикл

//Регистр R0 оказался нулём - все 8 бит "продвинуты" во внешний рег.

Регистры R0 и R1 - любые из РОН контроллера, как подать команду сдвигающему регу, наверно сами разберётесь, и не забудьте в отладчике проверить этот кусок, я не проверял его.

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

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

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

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

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

спасибо! использовал команду бит проверки регистра с загруженным кодом цифры и команду сдвига.. все получилось!

					  
									  LIST		P=PIC16F628
		 #include	P16F628.INC
		 __CONFIG	3F58h
PC			EQU		 02h
PortA		equ		 05h	  
PortB		equ		 06h	  
Reg_1	   EQU		 20h
Reg_2	   EQU		 21h
Reg_3	   EQU		 22h
temp		  EQU		 23h
Indicator	EQU		 25h

			  org		0	  
			  bsf		 STATUS,RP0  
			  clrf		TRISB
			  movlw	   B'00000000'
			  movwf	   TRISB
			  clrf		TRISA
			  movlw	   B'00000000'
			  movwf	   TRISA
			  bcf		 STATUS,RP0  
			  bcf		 STATUS,RP1
			  clrf		PORTA
			  clrf		PORTB
			  bsf		 PORTB,3


			   movlw	   .8
			   movwf	   temp
Serial		  movlw	   B'11111011'
			   movwf	   Indicator
			   bsf   PORTA,0
			   bcf   PORTA,0
m1			  bcf   PORTA,1		 ; Сбрасываем линию CLK
			   bsf   PORTA,7		 ; Устанавливаем линию DATA
			   btfss Indicator,0	 ; Если загружаемый бит равен 0,
			   bcf   PORTA,7		 ; сбрасываем линию DATA

			   bsf   PORTA,1		 ; Подаем тактовый сигнал
			   rlf   Indicator,f	 ; Готовим на вывод след бит

			  decfsz temp

			   goto  m1
			   goto  Serial
			  end

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

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

Вы проверку бита использовали, а я маску, но впринципе какая разница, главное чтобы работало :). А вообще Ваше решение с проверкой бита лучше, т.к. не затрагивает остальные пины RA

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

С выводом одной цифры разобрался..теперь пытаюсь реализовать динамическую индикацию...набросал програмку..посмотрите пожалуйста имеет ли право она на существовании..как то все незатейливо.. но работает..или каким другим способом можно .. В программе мы просто выводим 4-х значное число на индикатор..Программа к отладочной плате из первого поста..

динамическая индикация.txt

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

Программа к отладочной плате из первого поста..

чувствуется рука пастора.....

1. выкладываете код пользуйтесь кнопкой <> (код) на панели инструментов сообщения...

2. регистры STATUS, PortA, PortB и тд описаны в инклюде и прописавать их в программе не надо....

3. для динамической индикации применяются таймеры МК , делать задержки типа delay признак плохого тона

4. назначение выводов динамической индикации и выводы управления регистра лучше всего описывать в начале программы используя команду #define препроцессора

5 команды изменения битов портов нужно разделять командами NOP

6 для записи бита конфигурации есть заризервированные слова в инклюде

PS если будет свободное время выложу вам пример кода...

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

Нарушение правил форума пункт П II.9 предупреждение!

в следующий раз накажу! IMXO

Было бы очень хорошо..думаю многим пригодится.И если можно поподробнее про использование таимера МК для динамической индикации.Пытаюсь разобратся по книгам..но что то плохо получается..информации море..но в этом море можно утонуть....

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

да как бы все просто....

частота МК Fosc=4мГц, машинный цикл МК(время выполнения одной команды) Fosc/4=1мГц , а частота обновления индикатора нам нужна скажем Fdigit=100Гц

тк у нас четыре индикатора то частота обращения к ним 400Гц...

для получения количества срабатываний таймера TMR0 нужно период индикатора поделить на период машинных циклов МК или

Ttmr=(Pdigit/4)/Posc=Fosc/4 / 4*Fdigit = 4000000/4 / ( 4 * 100 ) = 2500

тк таймер 8-ми разрядный и считает только от 0 до 255 устанавливаем нужный коэф деления предделителя в регистре OPTION заносим значение PS2:PS0 = 4 (2100) те коэф.деления=1:32

2500/32=78 - количество тактов таймера , чтобы таймер отсчитал нужное количество раз нужно в регистр TMR0 занести значение TMR0_CONST=256-78= 178

собственно в программе это выглядит так:

задаем параметры частоты:

;*******************************************************************************
;
;	 КОНСТАНТЫ ПОЛЬЗОВАТЕЛЯ (могут меняться в зависимости от режима)
;
;*******************************************************************************

F_OSC		 equ	 .4000000	 ; Тактовая частота микропоцессора (Гц)
F_DIGIT		 equ	 .100		 ; частота обновления динамической индикации
								 ; для 4-х индикаторов

рассчитываем константы:


;-------------------------------------------------------------------------------
;	 Расчет констаны TMR0_CONST загружаемой в TMR0
;	 в зависимости от частоы МК Fosc и частоты обновления индикатора Fdigit
;	 c учетом установки предделителя PS2:PS0 регистра OPTION_REG
;-------------------------------------------------------------------------------
TMR0_PERIOD		 equ	 F_OSC/4/(F_DIGIT*4)
TMR0_PRS_CONST	 equ	 0x04 ; - константа для преддилителя
TMR0_CONST_temp	 equ TMR0_PERIOD / (2 << TMR0_PRS_CONST)

; Проверка, что получили константу, соответствующую разрядности TMR8 (не более 8 бит)
#if TMR0_CONST_temp >= 256
error Неправильно выбрана константа TMR0_PRS_CONTS! Следует увеличить ее значение!
#endif
TMR0_CONST	 equ -TMR0_CONST_temp

настраиваем таймер:

;---------------------------------------------------------------
;	 Настройка таймера TMR0
;----------------------------------------------------------------		
 banksel OPTION_REG
 movlw TMR0_PRS_CONST
 movwf OPTION_REG

 banksel TMR0
 movlw TMR0_CONST
 movwf TMR0

обновляем таймер в прерывании

 ;-----------------------------------------------------------------------
 bcf	 INTCON, T0IF		 ; Обновляем таймер
 movlw TMR0_CONST			 ;
 movwf TMR0			 ;
 ;-----------------------------------------------------------------------

ну и собственно код:

pic16f84f_dinamic_ASM.rar

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

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

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

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

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

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

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

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

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

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

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