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

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


NikolayZ

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

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

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

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

Доброго времени суток! "покурил" мануал еще разок, вроде что то получилось, во всяком случае мплаб не ругается, посмотрите пожалуйста, теперь правильно?

Запустил в протеусе, работает :D :D :D

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

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

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

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

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

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

работает значит правильно.... :)

теперь запускайте АЦП с правым выравниванием, запуск делайте в прерывании по таймеру, а чтение в основной проге по флагу окончания преобразования... и полученные данные загружаете в промежуточную переменную, сдвигаете влево на <<3 , и в старшем байте у вас получатся значение АЦП в диапазоне [0..31] , ну а дальше это значение сравниваете с "счетчиком сдвигов" у вас Reg_2 , пока значение< Reg_2 в segment_led загружаем 1 , иначе 0 .... в итоге СД будут отображать значение АЦП кол-вом светящихся СД....

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

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

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

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

Эммм...... :shok: попробую :huh: :huh:.....

В прерывании, после сохранения статуса и W добавляю:

bcf ADIF - (написанно в пдф что флаг устанавливается в 1 после окончания преобразования, я его найти не могу....)

bsf ADCON0, GO/-DONE - запускаю АЦП

В инициализации

movlw (1<<ADFM)|(0<<VCFG)|(0<<?)|(0<<?)|(1<<CHS1)|(1<<CHS0)|(0<<GO/-DONE)|(1<<ADON) ;

movwf ADCON0 ; правое выравнивание, опорное напряжение Vdd, (как записывать биты которые не используются?), канал подключения АЦП=3 =вывод GP4,модуль АЦП в ожидании, модуль АЦП включен

movlw (1<<?)|(0<<ADCS2)|(0<<ADCS1)|(1<<ADCS0)|(1<<ANS3)|(0<<ANS2)|(0<<ANS1)|(0<<ANS0) ;

movwf ANSEL ; источник тактового сигнала Fosc/8,GP4- аналоговый вход, GP0,1,2 цифровые порты ввода вывода

правильно?

а как реализовать вот это

а чтение в основной проге по флагу окончания преобразования... и полученные данные загружаете в промежуточную переменную, сдвигаете влево на <<3 , и в старшем байте у вас получатся значение АЦП в диапазоне [0..31] , ну а дальше это значение сравниваете с "счетчиком сдвигов" у вас Reg_2 , пока значение< Reg_2 в segment_led загружаем 1 , иначе 0 .... в итоге СД будут отображать значение АЦП кол-вом светящихся СД....

Не пойму :(

Мне нужно будет загрузить значение ADRESH и ADRESL в Segment_LED_temp?

про сравнение и счетчик тоже в ступор что то впал....

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

movlw (1<<ADFM)|(0<<VCFG)|(0<<?)|(0<<?)|(1<<CHS1)|(1<<CHS0)|(0<<GO/-DONE)|(1<<ADON) ;

как записывать биты которые не используются?)

Мне нужно будет загрузить значение ADRESH и ADRESL в Segment_LED_temp?

про сравнение и счетчик тоже в ступор что то впал....

никак... их не указываем....

movlw	 (1<<ADFM)|(0<<VCFG)|(1<<CHS1)|(1<<CHS0)|(0<<GO/-DONE)|(1<<ADON) ;

нет значение АЦП загрузить в отдельную переменную temp_ADC , и сделать три сдвига влево... в старшем байте получим нужное значение АЦП.... регистор Reg_2 вы использовали как счетчик , и в цикле устанавливая STATUS,C загружали его значение в Segment_Led , вот и сравниваете Reg_2 со старшим байтом temp_ADC , если Reg_2<temp_ADC то STATUS,C =1, Reg_2>temp_ADC то STATUS,C =0.....

movlw .32
movwf Reg_2
label_1 movlw .25 ; мс - задержка в пределах 5...255 миллисекунд
call pause

movf temp_ADC,w
subwf Reg_2,w


;***** bcf STATUS,C
rlf Segment_LED_L,f
rlf Segment_LED_LH,f
rlf Segment_LED_HL,f
rlf Segment_LED_HH,f
decfsz Reg_2,f
goto label_1

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

Здравствуйте! Посмотрите пожалуйста, правильно добавил строки в инициализации?И еще вопрос, а как мне загрузить значение АЦП в переменную, в ПДФ сказанно, что для этого дела имеется спаренный 16 разрядный регистр ADRESH и ADRESL, а результат АЦП 10 разрадный (помещается в эти регистры со смешением правым или левым)..., а переменная которую мы назначили temp_ADC 8 разрядная.... я не правильно мыслю,да?

загрузить в отдельную переменную temp_ADC , и сделать три сдвига влево...
А откуда ее загружать? Не могу понять как делать :( ... можно будет сдвинуть таким образом shl temp_ADC,3? или я опять не туда полез?

T0IF_Check  btfsc	  INTCON, T0IF		    ; проверка флага прерывания по переполнению TMR0
	    btfss	  INTCON, T0IF;
	    goto	   OUT					 ; небыло (0)
;==================================================================================================
	    bcf	    INTCON, T0IF		    ; Обновляем таймер
	    movlw	  .6					  ; предустановка таймера
	    addwf	  TMR0, F				 ;
	    bsf	    FLAG, mc_1			  ; устанавливаем в 1 флаг mc_1
	    bcf	    PIR1, ADIF			  ; сбрасываем флаг, когда преобразование закончится флаг поднимется
	    bsf	    ADCON0,GO_NOT_DONE	  ; запуск АЦП, после окончания преобразования бит установится в 0
;==================================================================================================
	    movf	   Segment_LED_HH,W
	    movwf	  Segment_LED_temp   ; загружаем самые старшие 8 бит в буфер
	    movlw	  .8				 ; было (1) (подторяем алгаритм 8 раз, если регистр один, 16 если два?)
	    movwf	  TimerH			 ; записываю значение в счетчик
lebel_1	 bcf	    GPIO,PIN_SH	   ; сбрасываем в 0 тактовый импульс

Можно использовать как флаг бит GO_NOT_DONE, в пдф говорится, что после того как АЦП закончит преобразование, этот бит установится в 0

START	   movlw	    .32
	    movwf	    Reg_2
label_1	 movlw	    .25		    ; мс - задержка в пределах 5...255 миллисекунд
	    call		 pause
	    btfsc	  ADCON0,GO_NOT_DONE  ; проверяем отработал ли АЦП (бит в 1 если АЦП работает, 0- закончил преобразование)
	    goto	  label_1								 ;
	    movf		 temp_ADC,w	 ;
	    subwf	    Reg_2,w	    ; вычитаем из Reg_2 значение temp_ADC
	    bcf		  STATUS,C
	    rlf		  Segment_LED_L,f
	    rlf		  Segment_LED_LH,f
	    rlf		  Segment_LED_HL,f
	    rlf		  Segment_LED_HH,f
	    decfsz	   Reg_2,f
	    goto		 label_1

Проверку работы АЦП так делать?

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

Проверку работы АЦП так делать?

вот так:

обратите внимание на то как описаны переменные Segment_LED(4 байта) и ADC_temp(2 байта) ... и как идет к ним обращение

12f675_ADC.rar

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

Оболдеть :huh: :huh: :huh: .... Я бы такую программку долго писал.... :unsure:

Что означают цифры после Segment_LED?

Segment_LED+3
Segment_LED+2
Segment_LED+1
Segment_LED+0

Это переход на строку "btfss FLAG,mc_1", если условие не выполнено,да?

btfss	 FLAG,mc_1
goto  $-1

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

Николай я вам уже дал все необходимые ссылки в пост 7

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

как пользоваться директивами препроцессора компилятора разжевано в статье Тивофеева

все начинается отсюда:

 CBLOCK 0x20
W_Temp	 ; Регистр сохранения содержимого W при прерываниях.
Stat_Temp ; Регистр сохранения содержимого STATUS при прерываниях.
TimerH	 ; регистры для счетчиков
TimerL	
Reg_1	 ; :регистры под счетчик
Reg_2	
Segment_LED :4
Segment_LED_temp
ADC_temp :2
FLAG
ENDC 

этой директивой мы указали с какие значения присвоить константам и с какого значения, каждой следующей константе будет присваиватся значение на 1 больше

те компилятор встретив W_Temp заменит его на 0х20, Stat_Temp на 0х21 и тд

Segment_LED на 0х26, Segment_LED :4 мы указали что следующей константе присвоить значение на 4 больше те Segment_LED_temp = 0х2А и тд

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

когда компилятор встречает запись

movf Segment_LED,w , асембрер это воспринимает как

movf 0x26,w

а команду

movf Segment_LED+1,w , асембрер это воспринимает как

movf 0x27,w

те первой командой мы обращаемся к нулевому байту переменной

а второй уже к первому байту переменной....

$ - сиввол адрес текущей строки

команда goto $-1 перейти на 1 строку назад....

команда goto $+4 перейти на 4 строки вперед....

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

Понятно, буду читать......... Можно тогда Вас попросить объяснить, как добавить эффекты? Я так понимаю что дописывать нужно блок после команда START? или в прерывании тоже менять что то нужно?

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

Доброго времени суток, уважаемые! В общем благодаря терпению IMXO (который мне так долго объяснял что да как) программка готова!!! :dance2: :dance2: :dance2:

Исходник со схемой в протеусе ниже (весь архив выгрузить не могу, нет рубанули с телефона пока сижу)

В общем в симуляции все классно работает :)

Теперь нужно решить вопросы по схеме и все готово :)

1- сигнал предполагается брать с линейного выхода компутера, выходной сигнал не больше 1В, то есть нужен предусилитель, а какой лучще выбрать???

2- самое главное, сделать автоматическую регулировку входного сигнала, что бы "баловство" с уровнем громкости на ПК, не влияло на мигание светодиодов?

2 пункт я так понимаю это АРУ?

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

  • 3 недели спустя...

Доброго времени суток,Уважаемые! Помогите разобраться со схемой?

В общем протравил я плату, для проверки работоспособности, да и так посмотреть что да как, прошил ПИК 12F675, установил сдвиговые регистры SN74MC595N - 4 шт, к ним светодиоды через резисторы в 150Ом, питание от кренки на 5В (на выходе 4.98В). Сигнал подаю с портативных колонок с питанием от ЮСБ, и ситуация следующая: При включении, светодиоды загораются и тухнут как задумано, потом включаю режим мигания под музыку, и светодиоды первые 30 секунд мигают столбиком с права налево, но при этом первые 5 светодиодов с лева горят постоянно и на музыку не реагируют, потом вообще начинают мигать непонять как, а потом пик начинает греться сильно.... Сбрасываю питание, начинает работать, но по той же схеме как описано выше... В протеусе все хорошо симулируется, гонял часа 2 на предмет глюков, все хорошо, а на реальном железе ничерта....

Посмотрите пожалуйста, куда копать? Почему греется ПИК?

Архив с прошивкой, схемой протеуса и фоткой платы здесь - Новая папка.zip

Попозже выложу видео как работает...

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

Сигнал подаю с портативных колонок с питанием от ЮСБ
Николай , то что звуковой сигнал с колонок переменное напряжение,а на вход МК можно подавать напряжение от 0 до 5в ни на какие мысли не наводит? может выпрямитель нужно поставить?
Ссылка на комментарий
Поделиться на другие сайты

Вот обещанное видео 20140426_222443.mp4 (9.5 мб)

Поставил диод по входу, как на схеме протеуса, или 1-го диода не достаточно, нужно мост ставить диодный?

Уровень сигнала тоже достаточен, до 5,5 вольт подскакивает (смотрю на входе пика мультиметром)

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

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

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

Проблема не в сигнале, дабы исключить возможные проблемы с колонками, диодами и т.д. я просто подавал на вход напряжение от 0 до 5 вольт (3V, 4V, 5V) И проблема в том, что у меня все светодиоды не тухнут, когда на входе 0, то светодиоды не должны гореть, а горят 6 шт, и когда сигнал 5В вся линейка не зажигается, последние 5 диодов не горят, на видео видно что за проблема, специально выложил со звуком, что бы было видно что, при прибавлении звука шкала зажигается не до конца, а при убавлении звука, тухнет не вся....

поставил еще один диод (D2) ситуация не поменялась....

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

И всетаки почему то греется сам ПИК.... вот принт скрин icprog, правильные установки?

Мужики, что не так? :(

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

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

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

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

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

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

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

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

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

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

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

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