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

Светомузыка На Pic16F84A


NikolayZ

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

Доброго времени суток,форумчане!

Хочу обратиться к Вам с таким вопросом: увидел я вот такой ролик на ютюбе

. Очень понравилось, и эффекты и под музыку все. Хотелось бы сделать что нибудь подобное для ПК (у меня сына очень любит когда что нить мигает под музыку).

Сам я люблю попаять, есть небольшой (пока) опыт с мк, правда пока только с 16F84A (учусь по самоучителям с интернета, язык ассэмблер, уже умею помигать светодиодами по разным алгаритмам, сделал знакомому "контроллер" для ходовых огней.).

Вот и возникла мысль сделать 2 таких полоски и встроить их в колонки (колонки активные, питание +12В). Стал думать как можно сделать, в голове пока такие мысли:

1 - PIC16F84A, сдвиговый регистр - 74HC595N, и алгаритм...

Но непонятно следующее, допустим ставим 2 сдвиговых регистра, по 1-му на вывод RB0 и 1, потом переключая их зажигаем светодиоды с "низу" в "верх", (по описанию 74HC595N, он сдвигает биты от вывода к 7 (если правильно понял из описания на аглицком), здесь как бы пока все предворительно понятно, но вот как их заставить двигаться в обратном порядке?

Возможно я вообще не правильно представляю как это сделать...

Вот и хочу попросить у вас помощи в осуществлении задуманного (сейчас борьсь с даташитом на 74HC595N, с онглийским тяжеловато..,)

Наверное возникнет вопрос, почему именно 16F84A, да все просто, он у меня есть (4 шт, купил для изучения), да и с другими не работал, так как только осваиваю новое для себя направление....

Заранее спасибо за помощь:)

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

  • Ответов 66
  • Создана
  • Последний ответ

Топ авторов темы

Почитай тут на сайте - камень правда другой... но информации по теме "Светомузыка"... достаточно .

Изменено пользователем lazertok

С Уважением

Если дело завершено, Человек должен усомниться. (закон Дао Ли)

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

ну то что в ролике больше похоже на работу lm3915 или аналогичных. просто выход не сразу на светики, а через ключи. как раз там и режим точки и режим столбика. поищите в гугле, и программировать ничего не надо)

С уважением, Андрей.

Считаю, что если информация была полезна, то не грех и спасибку нажать

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

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

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

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

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

На 3915 не похоже, я как то делал на ней индикатор напряжения,и если память не изменяет, она может зажигать светодиоды либо один за другим, либо точкой, и насколько знаю только строго в одной последовательности, с "низу" в "верх", а наоборот уже не может... Утверждать конечно не буду, но все схемы что встречал на ней, работали только по такому алгаритму... А на видео, режимов 10 насчитал... Искал в интернете что то подобное на лмках, но увы, ничего не попалось... А судя по видео, там контроллер,больше чем уверен... (уж очень много эффектов)...

За ссылки спасибо, почитаю.

Вот нашел статью про сдвиговый регистр http://avrproject.ru/publ/kak_podkljuchit/bascom_avr_74hc595/2-1-0-44 , стало понятно как он работает :)

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

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

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

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

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

1 - PIC16F84A, сдвиговый регистр - 74HC595N, и алгаритм...

Но непонятно следующее, допустим ставим 2 сдвиговых регистра, по 1-му на вывод RB0 и 1, потом переключая их зажигаем светодиоды с "низу" в "верх", (по описанию 74HC595N, он сдвигает биты от вывода к 7 (если правильно понял из описания на аглицком), здесь как бы пока все предворительно понятно, но вот как их заставить двигаться в обратном порядке?

ну чтобы это понять надо бы изучить как работает регистр 595... хотя это и не нужно... достаточно понимать как идет обычная загрузка... а дале усё просто : каждые 1-5мс в прерывании по таймеру0 загружаем значение переменой скажем Segment_LED в регистор 595 , в основной программе через равные промежутки времени (пользуем делей) изменяем значение Segment_LED на сколько позволяет воображалка

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

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

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

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

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

Вот этого я и боялся... прерывания :) Для меня это как кошмар, я ни как пока не могу понять, как с ними работать, точнее вроде и понятно, но не получается пока... Смотрел примеры ( сылка про регистр сдвига выше) так, там автор статьи отправляет число в регистр под средством одной команды, к сожалению, я ни знаю ни каких языков программирования кроме ассэма (и то знаниями это назвать пока нельзя), но пологаю что на ассэме одной командой не обойтись... Можно Вас попросить рассказать про прерывания, или пример привести, что бы посидеть поразбираться? Сам сейчас тоже сижу, листаю литературу, статьи, пытаясь понять как работать с прерываниями...

Еще возник вопрос, а почему прерываться по TMR0 a не по внешнему сигнаму на RB0/INT ? ведь мигать должно под музыку, допустим под средние частоты, перед входом RB0/INT будет стоять какая то (пока не знаю какая, проект пока все таки) схемка, которая будет отфильтровывать все кроме средних частот и подавать сигнал на RB0/INT, или не так?

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

Можно Вас попросить рассказать про прерывания, или пример привести, что бы посидеть поразбираться? Сам сейчас тоже сижу, листаю литературу, статьи, пытаясь понять как работать с прерываниями...

для начала на сайт В.Тимофеева http://pic24.ru/doku.php/articles/list в раздел статьи и

выучить это: Как оформлять программы на ассемблере (ноябрь, 2010)

далее сюда http://www.microchip.ru/lit/?mid=1x0 смотрим справочник по МК раздел 8 и раздел 11

далее пишете программу , показываете что получилось , задаете вопросы....

ну и сюда можете заглянуть http://forum.cxem.net/index.php?showtopic=78771&view=findpost&p=810610

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

Доброго времени суток, форумчане :)

Прочитал статьи приведенные выше, и ... появились вопросы...

1- правильно ли я понял, что в TRM0 - нужно записать какое то значение, и выставить режим "инкремирования" от RA4/T0CKI от ВНЕШНЕГО источника?

2- Выбирать нужно передний фронт?

3- нужен ли предделитель (как понять да или нет, и если нужен, то какой коэф-т делителя ставить)?

И самый главный вопрос, какой алгаритм должен выполняться в пп прерывания?

Что то я совсем запутался с алгоритмом..

Попробовал " написать" часть программы, даже не часть, а постарался (прочтя статью и посмотрев примеры) сделать все "красиво", постарался "написать" прерывания ( пока только установка битов, сохранение регистров) и основной алгаритм (тоже самое), посмотрите пожалуйста, правильно ли начал? Оформление Вам врядли понравится, так как там пока ничего нет толком, хочу понять, правильно ли я понял про прерывания (описал алгаритм)

Прилогаю архив, с проектом в мплабе.

P/S сильно не ругайтесь от увиденного, я ведь только учусь... :huh::unsure:

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

:) :) :)

1- нет не правильно.... режим "инкремирования" приращение TMR0 от тактового сигнала CLKOUT

2- без разницы

3- зависит от требований... предположим нам нужно чтобы прерывание происходило каждую 1мс

а частота Fosc=4MHz тактовый сигнал будет равен CLKOUT=1MHz или 1мкс, нам нужно 1000тактов (1мкс*1000=1мс)

TMR0 считает от 0 до 255 , берем 1000такт/256такт=3.9 ближайший больший коэф.предделителя =1:4

1000такт/4=250, TMR0 = 256 - 250 = 6 - нужное значение предустановки в прерывании....

проверяем 1мкс*4*(256-6)=4мкс*250=1000мкс=1мс.... как-то так....

по поводу алгоритма: в 16F84A нет АЦП и создать вменяемый СМУ на нем нереально. а автомат световых эффектов реально...

как ? вдумчиво перечитываем пост5

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

Блин, внес исправлениия в пост, не обновив страницу.... И Ваше сообщение не увидел...

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

Скорее всего неправильно представил алгаритм всего этого дела, думал как то так будет: Пришел сигнал с усилителя, жаглись все светодиоды, потом пока сигнала нет, они по одному тухнут (шкала идет на убывание) потом сигнал опять пришел, опять все зажглись и т.д., так как в музыке постоянно что то бахает и пищит, светодиоды не успеют все потужнуть...

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

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

правильно ли я понял про прерывания (описал алгаритм)

P/S сильно не ругайтесь от увиденного, я ведь только учусь... :huh::unsure:

давайте не ставить телегу в перед лошадью.... сначала сделайте загрузку данных в регистр 595 в прерывании по таймеру TMR0 каждую 1мс ..... а дальше будем посмотреть... :)

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

с основным алгоритмом напутали... инициализация проводится один раз при запуске МК а вот код программы выполняется в вечном цикле...

		 org	 0x0000	 ; Начать выполнение программы с нулевого адреса PC
	 goto	 INIT 	 ; (переход на основной алгоритм).
;*********************************************************************************************
;					 прерывание
;*********************************************************************************************
	 org	 0x0004
;============================================================================================

	 retfie				 ; Возврат из прерывания по стеку.

;					 основной алгаритм
;*********************************************************************************************
;						 подготовка
INIT:
;		 здесь проводим инициализацию переменых и регистров!!!!
INIT_end

START
; код основной программы....

	 goto	 START	 ; Переход на новый цикл сканирования.
;================================================================================================
	 end

ЗЫ ругатся не будем... ваш первый блин выглядит намного лучше говнокода от прихожан пастора...

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

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

По поводу загрузки данных, хотел уточнить, если я выставлю PIN_DS в 1, а потом допустим 20 раз переведу PIN_SH из 0 в 1, то я зажгу все светодиоды, верно? Можно ли сделать загрузку данных одной командой (где то видел пример команды на С,(уже не вспомню...) ? И если честно, пока очень плохо понимаю как это сделать, посмотрю перечень коман ( у меня список из даташите, и пока его хватало).

Скоро вернусь с новыми вопросами:) Спасибо что помогаете:)

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

верно? Можно ли сделать загрузку данных одной командой (где то видел пример команды на С,(уже не вспомню...) ? И если честно, пока очень плохо понимаю как это сделать, посмотрю перечень коман ( у меня список из даташите, и пока его хватало).

1.нет не верно... в одном 595 8 выходов , в двух 16 и тд , те на каждый регистр по 8 тактов на PIN_SH

2.нет нельзя , в Си кстати тоже... для передачи значения переменной Segment_LED в PIN_DS используется команда сдвиг влево rlf x,f и проверка бита переноса С регистра STATUS

	 movlw 8
	 movwf count_bit
lebel_1
	 bcf PORTB,PIN_SH
		 nop
	 rlf Segment_LED_H,f
	 btfss STATUS,C
	 bcf PORTB,PIN_DS
	 btfsc STATUS,C
	 bsf PORTB,PIN_DS
		 nop
		 nop
	 bsf PORTB,PIN_SH
		 nop
		 nop
	 bcf PORTB,PIN_SH
	 decfsz count_bit,f
		 goto lebel_1

	 movlw 8
	 movwf count_bit
lebel_2
	 bcf PORTB,PIN_SH
		 nop
	 rlf Segment_LED_L,f
	 btfss STATUS,C
	 bcf PORTB,PIN_DS
	 btfsc STATUS,C
	 bsf PORTB,PIN_DS
		 nop
		 nop
	 bsf PORTB,PIN_SH
		 nop
		 nop
		 bcf PORTB,PIN_SH
	 decfsz count_bit,f
		 goto lebel_2
	 bsf PORTB,PIN_ST
		 nop
		 nop
	 bcf PORTB,PIN_ST
		 nop
		 nop

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

Доброго времени суток! Посмотрите пожалуйста по замечаниям, добавил проверку флага прерывания, изменил конфигурацию регистра INTCON и OPTION_REG (надеюсь что все правильно понял, и верно выставил биты). Использовал часть вашего кода (предыдуший пост) в прерывании ( если не правильно понял, поправьте пожалуйста, получается так, что записав число в регистр Segment_LED мы переносим его через регистр С (1 или 0 попадают в регистр, а затем переключая сигнал на SH мы записываем его в 595? ))

Ни как не могу понять до конца

TMR0 = 256 - 250 = 6 - нужное значение предустановки в прерывании....

А как она (предустановка) устанавливается? :blush:

Вроде что то прояснилось в голове и дополним программку, если я все правильно понял, то алгаритм должен быть таким ( в прерывании зажигаем все светодиоды 8 шт, потом, выходя из прерывания тушим их по одному....)

Архив прилогаю.

Надеюсь двигаюсь в правильном направлении....

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

нет, поняли не правильно.... в прерывании мы только передаем текущее значение Segment_LED в регистр 595....

а в главном цикле программы изменяем значение Segment_LED....

по поводу

конфигурацию регистра INTCON и OPTION_REG
биты выставили правильно, но

это:

movwf	 b'11000001'
movlw	 OPTION_REG	
	 ....
movlw	 b'10100000' ;
movwf	 INTCON	 ;

- "магические числа"

намного наглядней так:

movwf (1<<NOT_RBPU)|(1<<INTEDG)|(1<<PSA)|(0<<PS2)|(0<<PS1)|(1<<PS0)
movlw	 OPTION_REG	
	 ....
movlw	 (1<<GIE)|(0<<EEIE)|(1<<T0IE)|(0<<INTE)|(0<<RBIE)|(0<<T0IF)|(0<<INTF)|(0<<RBIF)
movwf	 INTCON	 ;

вот что должно быть в прерывании

;*******************************************************************************
;
;	 ПРЕРЫВАНИЕ
;
;*******************************************************************************
 ORG	 0x0004
Interrupt:
;==================================================================================================
;			 cохранение содержимого регистров STATUS и W в ОЗУ.
;==================================================================================================
	 movwf	 W_Temp	 ; Скопировать содержимое регистра W в регистр W_Temp.
	 movf	 STATUS,W ; Скопировать содержимое регистра Status в регистр W.
	 movwf	 Stat_Temp ; Скопировать содержимое регистра W в регистр Stat_Temp.
;-------------------------------------------------------------------------------
; Прерывание TMR0: смена текущей позиции индикатора
; загружаем 16 бит в два регистра 74НС595
; Segment_LED_H - старшие 8 бит
; Segment_LED_L - младшие 8 бит
; Segment_LED_temp - буфер для передачи бит
;-------------------------------------------------------------------------------
T0IF_Check:

 btfsc intcon, T0IF
 btfss intcon, T0IE
 goto T0IF_Skip
 ;-----------------------------------------------------------------------
 bcf	 intcon, T0IF		 ; Обновляем таймер
 movlw 6			 ;
 addwf TMR0, f				 ;
 ;-----------------------------------------------------------------------
 movf Segment_LED_H,w     ; загружаем старшие 8бит в буфер
 movwf Segment_LED_temp	
 movlw 8							 ; кол-во бит буфера загружаем
 movwf count_bit				 ; в счетчик
lebel_1
 bcf PORTB,PIN_SH
 nop
 rlf Segment_LED_temp,f	 ; выводим бит на линию PIN_DS
 btfss STATUS,C
	 bcf PORTB,PIN_DS
 btfsc STATUS,C
	 bsf PORTB,PIN_DS
	 nop
	 nop
 bsf PORTB,PIN_SH			 ; записываем бит в регистр
	 nop								 ; формируем импульс на PIN_SH
	 nop
 bcf PORTB,PIN_SH
 decfsz count_bit,f
	 goto lebel_1
 movf Segment_LED_L,w
 movwf Segment_LED_temp
 movlw 8
 movwf count_bit
lebel_2
 bcf PORTB,PIN_SH
	 nop
 rlf Segment_LED_temp,f
 btfss STATUS,C
	 bcf PORTB,PIN_DS
 btfsc STATUS,C
	 bsf PORTB,PIN_DS
	 nop
	 nop
 bsf PORTB,PIN_SH
	 nop
	 nop
 bcf PORTB,PIN_SH
 decfsz count_bit,f
	 goto lebel_2
 bsf PORTB,PIN_ST		 ; получинные данные выводим
	 nop								 ; на выводы двух регистров 74НС595
	 nop								 ; формируем импульс на PIN_ST
 bcf PORTB,PIN_ST
	 nop
	 nop		 ;

T0IF_Skip:
 movf	 Stat_Temp,W ; Восстанавливаем регистр Status
 movwf	 STATUS	 ;
 swapf	 W_Temp,F ;
 swapf	 W_Temp,W ;
 retfie				 ; Возврат из прерывания по стеку.
;==================================================================================================
;					 КОНЕЦ ПРЕРЫВАНИЯ
;==================================================================================================

что должно быть в главном цикле проги

START	
 call pause
	 movlw	 b'00000000' ;
	 movwf	 Segment_LED_H
	 movlw	 b'00000001' ;
	 movwf	 Segment_LED_L
 call pause
	 movlw	 b'00000000' ;
	 movwf	 Segment_LED_H
	 movlw	 b'00000011' ;
	 movwf	 Segment_LED_L
 call pause
	 movlw	 b'00000000' ;
	 movwf	 Segment_LED_H
	 movlw	 b'00000111' ;
	 movwf	 Segment_LED_L
 call pause
	 movlw	 b'00000000' ;
	 movwf	 Segment_LED_H
	 movlw	 b'00001111' ;
	 movwf	 Segment_LED_L
 call pause
	 movlw	 b'00000000' ;
	 movwf	 Segment_LED_H
	 movlw	 b'00011111' ;
	 movwf	 Segment_LED_L
	 goto	 START	 ; Переход на новый цикл.

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

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

Рано я решил что все могу :) почему то вчера был уверен что все правильно...

Честно признаюсь не знал, что можно так выставлять биты в регистрах

movwf (1<<NOT_RBPU)|(1<<INTEDG)|(1<<PSA)|(0<<PS2)|(0<<PS1)|(1<<PS0)

movlw OPTION_REG

....

movlw (1<<GIE)|(0<<EEIE)|(1<<T0IE)|(0<<INTE)|(0<<RBIE)|(0<<T0IF)|(0<<INTF)|(0<<RBIF)

movwf INTCON ;

Так конечно намного информативнее, испралюсь:)

Век живи, век учись....

Еще вопрос такой, про основную часть программы: Если у меня будет допустим 4 регистра последовательно соеденены (32 всетодиода), то мне нужно 4 регитсра Segment_LED и 32 блока команд

call pause

movlw b'00000000' ;

movwf Segment_LED_HH

movlw b'00000000' ;

movwf Segment_LED_HL

movlw b'00000000' ;

movwf Segment_LED_LH

movlw b'00001111' ;

movwf Segment_LED_L

Правильно я понимаю или опять не верно...?

И еще вопрос, который не могу доканца уяснить, что мне делать в части программы где разрешены прерывания? Или прерывания разрешать сразу по метке старт?

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

Правильно я понимаю или опять не верно...?.....

Или прерывания разрешать сразу по метке старт?

правильно.... но и в прерывании надо добавлять код для передачи еще двух регистров и увеличивать время ТМР0 (на отправку двух регистров уходит около 260 маш.циклов),

можно и 32блока или придумываем алгоритм изменения значений Segment_LED , я код привел для примера чтоб было понятно что где делаем

перед инициализацией прерывания запрещаем, инициализируем переменные, разрешаем прерывания, главный цикл.

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

Доброго времени суток!!! Я наверно уже замучил Вас вопросами... Но они все появляются и появляются :(

Что сделал, 4 алгаритма загрузки данных в прерывании, переписал выводы RB, сделал 4 вывода (получилось занял 7 из 8 выходов, чтоб не болтались без дела) для загрузки данных в регистры (пит синхроимпульса, защелки и памяти оставил общими)....

Попробовал по риведенному Вами примеру сделать установку ORTION_REG

movlw (1<<GIE)|(0<<EEIE)|(1<<T0IE)|(0<<INTE)|(0<<RBIE)|(0<<T0IF)|(0<<INTF)(0<<RBIF)

movwf ORTION_REG

Так мп лаб ругается... Выдает ошибку 112 (отсутствие арифметического оператора в выражении) а как исправить не пойму...

Сделал запись - (1<<GIE)|(0<<EEIE)|(1<<T0IE)|(0<<INTE)|(0<<RBIE)|(0<<T0IF)|(0<<INTF)(0<<RBIF) как пояснение....

Еще вопрос по

.........и увеличивать время ТМР0 (на отправку двух регистров уходит около 260 маш.циклов),

Я правильно понимаю, что времени для следующего сброса (прерывания) должно хватать на отправку данных в 4-ре регистра + покрутиться в основной программе что бы изменить значения в регистрах Segment_LED_xx (260*2- время отправки 4-х регистров)= 520 мц (при F=4МГц= 520микросекунд) + t?)

Сейчас в TRMO 1мс (сделал по вашему примеру), то есть его нужно еще увеличить? (еще же нужно учитывать pause на 0.1 сек,да?)

Прикрепил архив с изменениями, посмотрите пожалуйста (колментарии специально дублировал для себя, что бы не запутаться)

PS; Вы извините если я оказался сильно туговатым, мне очень интерересно данное направление, но пока не могу переработать всю информацию по МК, ее так много (а времени как всегда мало)...

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

Попробовал по риведенному Вами примеру сделать установку ORTION_REG

потеряли знак логического ИЛИ при копировании

movlw (1<<GIE)|(0<<EEIE)|(1<<T0IE)|(0<<INTE)|(0<<RBIE)|(0<<T0IF)|(0<<INTF)|(0<<RBIF)

movwf ORTION_REG

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

Что сделал, 4 алгаритма загрузки данных в прерывании, переписал выводы RB, сделал 4 вывода (получилось занял 7 из 8 выходов, чтоб не болтались без дела) для загрузки данных в регистры (пит синхроимпульса, защелки и памяти оставил общими)....

не изобретайте велосипед с квадратными колесами!

PIN_MR - для работы не нужен абсолютно....

использовать четыре вывода данных смысла нет

используем три пина

PIN_DS - данные

PIN_SH - тактирование

PIN_ST - защелка

и... и все

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

Взял из описания работы с 74HC595

- MR осуществляет сброс регистра, устанавливая все выходы Q0…Q7 в состояние логического нуля. Для осуществления сброса нужно подать логический ноль на этот вход и подать положительный импульс на вход

Сейчас наверное глупый вопрос задам,

PIN_MR - для работы не нужен абсолютно....

Почему не нужно сбрасывать регистр? Просто на прямую держим логическую 1 на выводе MR, тем самым меняем эффекты без перерыва и мерцания?

использовать четыре вывода данных смысла нет

Соединить 4 регистра последовательно и посадить на 1 ножку DS, верно?

Исправил... убрал лишние порты.... С алгаритмом в ПП прерываний и основной программы все впорядке или я опять все напутал и сделал не так? :blush:

Если там все верно, то остается написать какой то код (пока даже представления не имею какой...), который будет менять значение Segment_LED_xx, да? :yes:

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

movlw Segment_LED_HH

movwf Segment_LED_temp ; загружаем самые старшие 8 бит в буфер

каким образом команда movf стала movlw ???? вы разницу между этими командами понимаете?

bsf PORTB,PIN_ST ; зашелкиваем данные, зажигаем светодиоды

; потом их нужно потущить, сбросить в 0 PORTB,PIN_SH, когда это лучше делать?

смотрим пост 17!!!

;==================================================================================================

OUT bcf INTCON,T0IF ; Сброс флага прерывания по переполнению TMR0 (обновляем таймер).

этой команды быть недолжно!!!уже сбрасывали флаг в начале прерывания!!!

movf Stat_Temp,W ; Восстанавливаем регистр Status.

movwf STATUS ;

swapf W_Temp,F ;

swapf W_Temp,W ;

retfie ; Возврат из прерывания по стеку.

;==================================================================================================

; КОНЕЦ ПРЕРЫВАНИЯ

;==================================================================================================

;==================================================================================================

; Разрешение прерываний, Основной цикл

;==================================================================================================

START movlw (1<<GIE)|(0<<EEIE)|(1<<T0IE)|(0<<INTE)|(0<<RBIE)|(0<<T0IF)|(0<<INTF)|(0<<RBIF)

movwf INTCON ; разрешаем прерывания по TMR0 (переднему фронту на RA4/T0CKI.<p>каким образом инициализация прерываний попала в основной цикл???

;==================================================================================================

; алгаритм для изменения значений Segment_LED_xx?

;==================================================================================================

clrf INTCON ; Запрет всех прерываний. это зачем????

goto START ; Переход на новый цикл.

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...