Свежие обсуждения
Микроконтроллеры

Музыкальная шкатулка с таймером

1 2 3

Звук появился, это я в программе нахомутал
Как я понял, для того, чтобы звук был сразу, нужно дописать команду:
Mainloop_label ;Основной цикл
goto Melody0
Но теперь, оно проходит 1 цикл и виснит (загораются все светодиоды).
Выходит из этого состояния эмуляцией нажатия на кнопку (отключаю подтягивающий от 1го вывода).
А можно как то програмно отключить кнопу? После моих попыток, результат был ввиде монтонного пииииии....

 

Такс, пришел увидел победил! Сегодня все вышло. Мелодия звучит по кругу, в паузах я оставил один эффект.
Теперь приступил к 10 часовой задержке... как оказалось не все так просто. Сначала я столкнулся с нехваткой места ПЗУ микроконтроллера. Я был удивлен! Пришлось чуть укоротить последнюю мелодию.
Запустил код и... вот тут у меня начались расхождения теории с практикой.
(Тут я заметил свою первую ошибку 1 цикл - это 1Е-6 секунды.)
Как я понимаю, первый цикл будет иметь длительность 255*3=765мкс
Второй цикл - 255*5=1275 мкс
Третий цикл - 255*7=1785 мкс
...
итого, перемножив 3 числа и разделив на 1Е6, получаю 1741 секунды. А на макете регистр (для визуализации, использовал порт В) опустошается за 50 сек. Где может быть ошибка в расчетах? Кварц на 4МГц.

;****************
VAL1 equ 20h
VAL2 equ 21h
VAL3 equ PORTB
VAL4 equ 23h

LongPause ;--- Длинная пауза!

                 movlw 10h
movwf VAL1

; movlw 1h
movwf VAL2

; movlw 1h
movwf VAL3

movlw 2h
movwf VAL4

decfsz VAL1,1
goto $-1
decfsz VAL2,1
goto $-3
decfsz VAL3,1 ; Опустошается за 50 сек
goto $-5
decfsz VAL4,1
goto $-7

return ;--- Длинная пауза!

 

А! Все понял!
1й цикл 9*255=2295мкс (9- это в новой программе, см. ниже)
остальные - просто *255
В результате, 2295мкс*255*255=149 секунд, что соответствует опыту (на стенде - 150 секунд).
Вот последний вариант. По моим расчетам, такой цикл будет иметь длительность примерно 10 часов 37 минут. К сожаленью, проверить время у меня не выйдет.
По нажатию на кнопку, длительность укорачивается до 150 секунд.
Вот сам код:

LongPause ;--- Длинная пауза!

                movlw 0FFh
movwf VAL1
               movwf VAL2
movwf VAL3

movlw 0FFh
movwf VAL4

zzzzz nop
nop
nop
movlw 1h
btfss BUTTON
movwf VAL4

decfsz VAL1,1
goto zzzzz
decfsz VAL2,1
goto zzzzz
decfsz VAL3,1 ;**** 50 сек
goto zzzzz
decfsz VAL4,1
goto zzzzz

return ;--- Длинная пауза!

И еще момент, потребляемый стендом ток (когда горят все светодиоды) составляет примерно 20мА (замерял). Стоит ли отавить индикацию на порту В (для контроля ночью, то схема не повисла?). Или это вызовет быстрый разряд элементов питания и индикацию лучше отключить? Батарейки самые обычные (не дорогие, но и не самый дешевые. Новые). Ваш вердикт?

 

Можно 1 светодиод оставить.

 

Выпаивать не охота, поэтому и получается, что или все или "ноль".
На парах нашел еще один глюк переделаной мной прошивки. После того как все мелодии проходят по кругу, начинаеться бегущий огонь и не заканчивается... Причину пока не нашел.

 

Сергей К: или все или "ноль"
Это просто. Не менять состояние 7 бит из 8 - и всё. Будет только 1 светодиод загораться.

movf ADDRESS,W ;Адрес ячейки с требуемыми на данном шаге данными
movwf FSR ;заносим в FSR (косвенная адресация)
movf INDF,W ;Переносим данные из ячейки с указанным адресом в W

andlw B'00000001'

movwf PORTB ;И выдаем результат на выводы PORTB

 

Все упирается в то, что память программ ПИКа заполнена на 100% и добавить даже 1 новую команду нет возможности (нет уже времени на поиски того, что можно "закоментировать"). Оставил как есть. На порт В вывел содержимое последнего (самого медленого) регистра. Надеюсь батарейки новые батарейки протянут 10,5 часов, тем более, что через 1/8 этого времени будет гаснуть 1 светодиод.

 

Удачи!

 

picmaniac, спасибо!
Эффект был 100%.
Устройство, вместе с подарком было спрятано в серой коробочке под кроватью. Через 20 минут поиска (а внешний светодиод я не успел припаять) устройство не было обнаружено (благодаря паузе между мелодиями)!
То что я на парах принял за ошибку в коде (когда после проигрывания всех мелодий не было перехода на начало) оказалась просто продолжительная пауза (на слух), после чего все пошло по кругу!
picmaniac, еще раз спасибо за отлаженную музыкальную программу!

 

no problem
Присоединяйтесь к "ликбезу 2", а то там совсем тихо стало.