Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Световые эффекты » Помогите оживить цветомузыкальное устройство


Помогите оживить цветомузыкальное устройство

Сообщений 1 страница 11 из 11

1

Доброго времени суток. Решил сделать цветомузыку на микроконтроллере Атмега 16. схема приведена на фото ниже. устройство содержит 6 групп приборов:
1 группа: 2 прибора - лунный цветок или световой еж, на основе RGB 9-ти ватного светодиода и зеркал на шаговом двигателе от принтера;
2 группа: 2 прибора - СДУ состоящая из 5-ти ватных светодиодов (4 канала по 2 светодиода в приборе красн.синий,желтый,зеленый) ;
3 группа: 2 прибора - стробоскоп на ИФК 120;
4 группа: 1 прибор- стробоскоп на ИФК 2000;
5 група: 1 прибор- светодиодный оптический (состоящий из 5мм светодиодов (4 группы по 15 светодиодов) и линзы), названный мною "снежинка" из-за проецируемого рисунка
6 группа: 1 прибор - лазер, состоящего из собственно лазерного диода и системы зеркал на двух моторчиках.

устройство уже собранно, приборы то же (см фото). все приборы изготавливал самостоятельно в гаражных условиях. в программирование пока не очень силен, но хотелось бы всетаки оживить самоделку.http://uploads.ru/i/n/Q/q/nQqcP.jpg
http://uploads.ru/i/4/j/C/4jChz.jpg
http://uploads.ru/i/4/p/D/4pD8d.jpg
http://uploads.ru/i/N/t/Z/NtZiC.jpg
http://uploads.ru/i/4/g/l/4glhY.jpg
http://uploads.ru/i/l/9/g/l9gLH.jpg
http://uploads.ru/i/j/v/q/jvqtg.jpg
http://uploads.ru/i/U/e/c/Uec16.jpg

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

устройство вполне работоспособно, проверял написанием тестовых программ на примитивном уровне =)

0

2

вот пока бъюсь с лунным цветком. при нажати на кнопку-программа отрабатывается, а вот при повторном нажатии, программа выключается, только после того, как отработает цикл до конца.

Код:
$regfile = "m16def.dat"                                     'установка модели микроконтроллера  Атмега16
$crystal = 16000000                                         'частота генератора 16МГц
Config Portb = Input                                        'конфигурируем порт B на вход
Config Portd = Output                                       'конфигурируем порт D на выход
Config Porta = Output                                       'конфигурируем порт A на выход
Config Portc = Output                                       'конфигурируем порт C на выход

$framesize = 16
$hwstack = 24
$swstack = 16

Stop Timer0
Config Timer0 = Timer , Prescale = 256
On Timer0 Button
Enable Timer0
Enable Interrupts
'--------------------------------------------------------------------------------------------------------
'--------------------------------------------------------------------------------------------------------
'присваиваем имена
'кнопки

But1 Alias Pinb.0                                           ' присваиваем имя But1 выводу 0 порта B
But2 Alias Pinb.1                                           ' присваиваем имя But2 выводу 1 порта B
But3 Alias Pinb.2                                           ' присваиваем имя But3 выводу 2 порта B
But4 Alias Pinb.3                                           ' присваиваем имя But4 выводу 3 порта B
But5 Alias Pinb.4                                           ' присваиваем имя But5 выводу 4 порта B
But6 Alias Pinb.5                                           ' присваиваем имя But6 выводу 5 порта B
But7 Alias Pinb.6                                           ' присваиваем имя But7 выводу 6 порта B
But8 Alias Pinb.7                                           ' присваиваем имя But8 выводу 7 порта B

'лунный цветок

Step1 Alias Portd.3                                         ' присваиваем имя step1 выводу 3 ????? D
Step2 Alias Portd.4                                         ' присваиваем имя step2 выводу 4 ????? D
Step3 Alias Portd.5                                         ' присваиваем имя step3 выводу 5 ????? D
Step4 Alias Portd.6                                         ' присваиваем имя step4 выводу 6 ????? D

Rled1 Alias Porta.0                                         ' присваиваем имя RLed выводу 0 ????? A
Gled1 Alias Porta.1                                         ' присваиваем имя GLed выводу 1 ????? ?
Bled1 Alias Porta.2                                         ' присваиваем имя BLed выводу 2 ????? ?

Rled2 Alias Porta.3                                         ' присваиваем имя RLed выводу 3 ????? ?
Gled2 Alias Porta.4                                         ' присваиваем имя GLed выводу 4 ????? ?
Bled2 Alias Porta.5                                         ' присваиваем имя BLed выводу 5 ????? ?

' Цветуха

 Led1 Alias Porta.6                                         ' присваиваем имя Led выводу 7 порта D
 Led2 Alias Porta.7                                         ' присваиваем имя Led выводу 7 порта D
 Led3 Alias Portc.7                                         ' присваиваем имя Led выводу 7 порта D
 Led4 Alias Portc.6                                         ' присваиваем имя Led выводу 7 порта D


 'лазер

Lad Alias Portc.3                                           ' присваиваем имя LD выводу 6 ????? C
Mot1 Alias Portc.5                                          ' присваиваем имя Mot1 выводу 5 ????? C
Mot2 Alias Portc.4                                          ' присваиваем имя Mot2 выводу 4 ????? C

' стробоскоп ИФК120

Ifk121 Alias Portc.2                                        ' присваиваем имя IFK121 выводу 6 ????? ?
Ifk122 Alias Portc.1                                        ' присваиваем имя IFK122 выводу 7 ????? ?                                                             ' ??????????? ??? BLed ??????5 ????? ?

'стробоскоп ИФК2000

Ifk2000 Alias Portc.0                                       ' присваиваем имя IFK2000 выводу 7 ????? C



'снежинка

 Sn1 Alias Portd.7                                          ' присваиваем имя SN выводу 3 порта C
 Sn2 Alias Portd.0                                          ' присваиваем имя SN ?????? 2 ????? C
 Sn3 Alias Portd.1                                          ' присваиваем имя SN ?????? 1 ????? C
 Sn4 Alias Portd.2                                          ' присваиваем имя SN ?????? 0 ????? C




  Dim A As Byte
  Dim I As Byte
  Dim Effect As Byte
  Dim Change As Byte
  Dim M As Byte

  Start Timer0

    'инициализация светодиодов

Rled1 = 1
Rled2 = 1
Led1 = 1
   Waitms 200
Rled1 = 0
Rled2 = 0
Led1 = 0
   Waitms 200
Gled1 = 1
Gled2 = 1
Led2 = 1
   Waitms 200
Gled1 = 0
Gled2 = 0
Led2 = 0
   Waitms 200
Bled1 = 1
Bled2 = 1
Led3 = 1
   Waitms 200
Bled1 = 0
Bled2 = 0
Led3 = 0
   Waitms 200
Led4 = 1
   Waitms 200
Led4 = 1
   Waitms 200
Led4 = 0
   Waitms 200



'-------------------------------------------------------------------------------
  Effect = 2

Main_program:
  Do                                                        'начало цикла

' Лунный цветок



   If Effect = 1 Then


     ' помигаем светодиодами

   For A = 1 To 2

Rled1 = 1
Waitms 50
Rled1 = 0
Waitms 50

   Next

    For A = 1 To 3

Rled2 = 1
Waitms 40
Rled2 = 0
Waitms 40

   Next

   For A = 1 To 4

Gled1 = 1
Waitms 70
Gled1 = 0
Waitms 70
Gled2 = 1
Waitms 70
Gled2 = 0
Waitms 70

    Next

    For A = 1 To 8

Gled2 = 1
Waitms 30
Gled2 = 0
Waitms 30

   Next

   For A = 1 To 8

Bled1 = 1
Waitms 30
Bled1 = 0
Waitms 30

      Next

    For A = 1 To 8

Bled2 = 1
Waitms 30
Bled2 = 0
Waitms 30
     Next

       For A = 1 To 4

 Rled1 = 1
Gled1 = 1
Bled1 = 1
Waitms 100
Rled1 = 0
Gled1 = 0
Bled1 = 0
Waitms 100

Rled1 = 1
Gled1 = 1
Bled1 = 1
Waitms 100
Rled1 = 0
Gled1 = 0
Bled1 = 0
Waitms 100

Rled1 = 1
Gled1 = 1
Bled1 = 1
Waitms 100
Rled1 = 0
Gled1 = 0
Bled1 = 0
Waitms 150

Rled2 = 1
Gled2 = 1
Bled2 = 1
Waitms 100
Rled2 = 0
Gled2 = 0
Bled2 = 0
Waitms 100

Rled2 = 1
Gled2 = 1
Bled2 = 1
Waitms 100
Rled2 = 0
Gled2 = 0
Bled2 = 0
Waitms 100

Rled2 = 1
Gled2 = 1
Bled2 = 1
Waitms 100
Rled2 = 0
Gled2 = 0
Bled2 = 0
Waitms 150
 Next
 ' а теперь начнем крутить шаговик и мигать RGB светодиодами
   For A = 1 To 20
Rled1 = 1
Rled2 = 1

Step1 = 1
   Waitms 30
Step1 = 0
   Waitms 30
Step2 = 1
    Waitms 30
Step2 = 0
   Waitms 30
Step3 = 1
   Waitms 30
Step3 = 0
   Waitms 30
Step4 = 1
   Waitms 30
Step4 = 0
   Waitms 30
   Rled1 = 0
   Rled2 = 0
   Next

   For A = 1 To 20
Gled1 = 1
Gled2 = 1

Step1 = 1
   Waitms 30
Step1 = 0
   Waitms 30
Step2 = 1
   Waitms 30
Step2 = 0
   Waitms 30
Step3 = 1
   Waitms 30
Step3 = 0
   Waitms 30
Step4 = 1
   Waitms 30
Step4 = 0
   Waitms 30
    Gled1 = 0
    Gled2 = 0
     Next

   For A = 1 To 20
   Bled1 = 1
   Bled2 = 1

Step1 = 1
   Waitms 30
Step1 = 0
   Waitms 30
Step2 = 1
   Waitms 30
Step2 = 0
   Waitms 30
Step3 = 1
   Waitms 30
Step3 = 0
   Waitms 30
Step4 = 1
   Waitms 30
Step4 = 0
   Waitms 30
    Bled1 = 0
    Bled2 = 0
     Next

     For A = 1 To 20
  Rled2 = 1
  Rled1 = 1

Step4 = 1
   Waitms 30
Step4 = 0
   Waitms 30
Step3 = 1
   Waitms 30
Step3 = 0
   Waitms 30
Step2 = 1
   Waitms 30
Step2 = 0
   Waitms 30
Step1 = 1
   Waitms 30
Step1 = 0
   Waitms 30
   Rled2 = 0
   Rled1 = 0
   Next

   For A = 1 To 20
Gled2 = 1
Gled1 = 1

Step4 = 1
   Waitms 30
Step4 = 0
   Waitms 30
Step3 = 1
   Waitms 30
Step3 = 0
   Waitms 30
Step2 = 1
   Waitms 30
Step2 = 0
   Waitms 30
Step1 = 1
   Waitms 30
Step1 = 0
   Waitms 30
     Gled2 = 0
     Gled1 = 0
     Next

     For A = 1 To 20
   Bled2 = 1
   Bled1 = 1

Step4 = 1
    Waitms 30
Step4 = 0
   Waitms 30
Step3 = 1
   Waitms 30
Step3 = 0
   Waitms 30
Step2 = 1
   Waitms 30
Step2 = 0
   Waitms 30
Step1 = 1
   Waitms 30
Step1 = 0
   Waitms 30
  Bled2 = 0
  Bled1 = 0
  Next


           Goto Main_program
          End If







 'выключаем
 If Effect = 2 Then
 Change = 1
     Step1 = 0
     Step2 = 0
     Step3 = 0
     Step4 = 0
     Rled2 = 0
     Gled2 = 0
     Bled2 = 0

        Goto Main_program
       End If
   Loop
End                                                         'конец цикла

 'опрос кнопок и присвоение переменной Effect соответствующего значения

 Button:

   If But1 = 0 Then
        Change = 1
      Incr Effect
      If Effect > 2 Then Effect = 1
     Bitwait But1 , Set
   End If

     Return

0

3

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

0

4

Евгений86 написал(а):

подскажите в чем проблема? почему программа отключается не сразу при нажатии кнопки?

Потому что она должна закончить все свои шаги, пока дойдёт до условия If Effect = 2.

0

5

а как нужно прописать, что бы в любой момент времени включать и отключать устройство???

0

6

Если программу оставлять в таком же виде, нужно везде, где есть задержки, ставить перед ними проверку, что произошел выход из эффекта. Затем Return или просто игнорируем все задержки, тогда программа пройдёт оставшуюся часть моментально.

0

7

Или через внешнее прерывание
Config Int0 = Rising                                        'Прирывание при повышении уровня
On Int0 Komanda                                             'при прерывании перейти на метку Komanda
или
Config Int1 = Falling                                       'Прирывание при понижении уровня
On Int1 Konec_kom                                           'при прерывании перейти на метку Konec_kom

Кнопку надо подключить к соответствующему выводу микр.

0

8

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

0

9

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

0

10

Используй Timer1
При прерывании проверяй кнопки хотя у тебя это  сделано на Timer0. Добавь опрос других кнопок.
Button:

   If But1 = 0 Then
        Change = 1
      Incr Effect
      If Effect > 2 Then Effect = 1
     Bitwait But1 , Set
   End If

     Return

0

11

а чем Timer1 спасет ситуацию? пробывал и на нем...radan не приведешь примерчек как сделать, что бы два устройства параллельно работали и выключались сразу(предпологаю, что мой код программы не является оптимальным), а то что то туговато пока у меня с программированием..я больше в электронику...

0


Вы здесь » Программирование ATMEL в BASCOM. » Световые эффекты » Помогите оживить цветомузыкальное устройство