Програмка на световые эффекты
|
|
Glas1 |
Дата: Пн, 19.10.2015, 20:24 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
1
Замечания:
±
На сайте с 19.10.2015
Статус:
Offline
|
Здравствуйте, недавно осваиваю МК. Нужно написать программу:
При включении мигает светодиод. При поступлении команд через последовательныйинтерфейс запускаются 1 из 5 программ различных световых эффектов. При поступлении новой команды прекращаетсявыполняемая программа светового эффекта и выполняется новая. Предусмотреть вывод на монитор терминала меню команд и подтверждения принятой команды. Обязательно использовать прерывания!
Кроме Данилина и http://www.oshonsoft.com/ ничего толкового не нашёл, скуднова-то инфы. Написал, пока частично. Помогите с программкой.
Код Define CONF_WORD = 0x3d71 'Номер присваиваемого контроллера Define CLOCK_FREQUENCY = 4 'Заданная частота
Dim i As Byte 'Объявить переменную Dim ps As Byte 'Объявить переменную
Hseropen 9600 'Открыть hardware uart port со скоростью передачи 9600
For i = 10 To 10 Step -1 'Открывается цикл Hserout "Добрый день", CrLf 'Отправить форматированный вывод в последовательный порт Hserout "для вкл всех светодиодов нажмите 1 ", CrLf 'Отправить форматированный вывод в последовательный порт Hserout "для выкл светодиодов нажмите 2 ", CrLf 'Отправить форматированный вывод в последовательный порт Hserout "для вкл пробегающей дорожки светодиодов", CrLf 'Отправить форматированный вывод в последовательный порт Hserout "для вкл с 5-8 светодиод нажмите 4 ", CrLf 'Отправить форматированный вывод в последовательный порт Next i
TRISB = 0 'Присвоение порту D значение 0
INTCON.T0IE = 1 INTCON.GIE = True OPTION_REG.T0CS = False ps = 1
loop: If ps = 1 Then PORTB = %00000001 'WaitMs 10 INTCON.T0IF = 0 'включает заново прерывание TMR0 PORTB = %00000000 Endif Goto loop
End
On Interrupt
If i = 1 Then 'Оператор if, если значение равно 1, то ps = 0 Hserout "Включины все", CrLf 'Вывод на экран "Vkluchit vse" PORTB = %11111111 'Включение всех светодиодов Endif 'Закрытие оператора if If i = 2 Then 'Оператор If, если значение равно 2, то ps = 0 Hserout "Выключины все", CrLf 'Вывод на экран "Vikluchit vse" PORTB = %00000000 'Выключение всех светодиодов ps = 1 Endif 'Закрытие оператора if If i = 3 Then 'Оператор If, если значение равно 3, то ps = 0 Hserout "Пробегающий огонёк", CrLf 'Вывод на экран "Пробегающий огонёк" PORTB = %00000001 PORTB = %00000010 PORTB = %00000100 PORTB = %00001000 PORTB = %00010000 PORTB = %00100000 PORTB = %01000000 PORTB = %10000000 Endif 'Закрытие оператора if If i = 4 Then 'Оператор If, если значение равно 4, то ps = 0 Hserout "5-8", CrLf 'Вывод на экран "4-8" PORTB = %11110000 'Включение с 5 по 8 светодиод Endif 'Закрытие оператора if
Hserin i 'Ожидание для получения байта на последовательный порт
Resume 'выход из подпрограммы обработки прерывания
Сообщение отредактировал
Glas1 - Вт, 20.10.2015, 15:58
|
|
|
|
ADMIN |
Дата: Чт, 22.10.2015, 11:30 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
А что не работает? Какие вопросы?
|
|
|
|
pic_simulyant |
Дата: Сб, 23.04.2016, 22:30 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 23.04.2016
Статус:
Offline
|
Помогите, пожалуйста, разобраться с программой. Нужно реализовать следующее: МКпо командам, поступающим через последовательный порт включает светодиоды на заданное в команде время.
|
|
|
|
ADMIN |
Дата: Вт, 26.04.2016, 15:31 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
В чем именно помочь? Выше есть пример. Что непонятно?
|
|
|
|
pic_simulyant |
Дата: Вт, 26.04.2016, 19:35 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 23.04.2016
Статус:
Offline
|
Программа работает следующим образом: выбираем светодиод (1 из 8) и задаем время его работы. Потом выбираем еще один и его время работы и т.д. При этом работают оба каждый свое время. Сейчас у меня работает только поочередное введение команд, т. е. сначала работает один со своим временем, даем команду - другой. Вместе не знаю как реализовать. Помогите, хоть идею подкиньте.
|
|
|
|
dimvad |
Дата: Ср, 27.04.2016, 13:34 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Забивайте в терминал 3х значное число. Первая цифра это номер светодиода 1-3, а две остальные - время его свечения в сек. Например 310 - это 3ий светик горит 10 сек.
Сообщение отредактировал
dimvad - Ср, 27.04.2016, 14:13
|
|
|
|
pic_simulyant |
Дата: Ср, 27.04.2016, 22:40 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 23.04.2016
Статус:
Offline
|
dimvad, ваша программа выполняет совместное горение светодиодов каждый со своим временем? или они по очереди просто горят?
|
|
|
|
dimvad |
Дата: Ср, 27.04.2016, 23:57 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
В пакете UART содержится информация о номере светика и времени его свечения. Как только команда прилетает, соответствующий светик зажигается на нужное время, другие диоды продолжают независимо отрабатывать свои задания. Если у Вас установлен протеус, то по-моему проще посмотреть.
|
|
|
|
pic_simulyant |
Дата: Чт, 28.04.2016, 00:17 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 23.04.2016
Статус:
Offline
|
dimvad, извиняюсь за назойливость. Просто первый раз сталкиваюсь с PIC Simulator'ом и Basic'ом. Ваша программа помогла разобраться с алгоритмом. Но она у меня не компилится, попытки перевести тщетны.
|
|
|
|
dimvad |
Дата: Чт, 28.04.2016, 09:17 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Забудьте Вы про Пик Симулятор. Установите симулятор-отладчик Proteus. Скачать его можно где угодно. Там Вы увидите и МК и светодиоды и сможете ими помигать как хочется. В архиве, что я дал все это есть. Не компилится наверное потому, что видимо используете БасикПро, а я писал на Протоне, он получше будет. Переписать с Протона на Про довольно просто - чуток синтаксис другой.
|
|
|
|
pic_simulyant |
Дата: Чт, 28.04.2016, 20:07 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 23.04.2016
Статус:
Offline
|
dimvad, дак проблема в том, что написать надо именно на пик симуляторе, бэсикеПро(((
|
|
|
|
ADMIN |
Дата: Пт, 29.04.2016, 13:04 | Сообщение # 12 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
pic_simulyant, может, покажешь уже свой код и объяснишь, что не получается?
|
|
|
|
pic_simulyant |
Дата: Пт, 29.04.2016, 13:33 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 23.04.2016
Статус:
Offline
|
Что не получается, сказано ранее! А именно: не удается реализовать совместную независимую работу светодиодов. Сейчас команды выполняются последовательно. Насчет правильности кода ничего сказать не могу, но на макете он заработал корректно
Код Define CONFIG = 0x3f71
Define CLOCK_FREQUENCY = 4 'Заданная частота
Dim i As Byte 'Объявить переменную Dim vr As Byte Dim vr1 As Word
TRISD = %00000000 'порт D на выход PORTD = Not %00000000
Hseropen 9600 'Открыть hardware uart port со скоростью передачи 9600 Hserout "Добрый день!", CrLf 'Отправить форматированный вывод в последовательный порт Hserout "Задайте номер светодиода от 1 до 8 (9 - горят все) и время работы в сeкундах", CrLf 'Отправить форматированный вывод в последовательный порт
INTCON.T0IE = 1 'прерывания INTCON.GIE = True OPTION_REG.T0CS = False
End
On Interrupt 'подпрограмма
Hserin i, vr 'Ожидание для получения байта на последовательный порт
If i = 1 Then PORTD = Not %00000001 'Включение 1 светодиода Hserout "Горит 1й светодиод", CrLf Hserout "Bремя работы: ", #vr, CrLf Endif
If i = 2 Then PORTD = Not %00000010 'Включение 2 светодиода Hserout "Горит 2й светодиод", CrLf Hserout "Bремя работы: ", #vr, CrLf Endif
If i = 3 Then PORTD = Not %00000100 'Включение 3 светодиода Hserout "Горит 3й светодиод", CrLf Hserout "Bремя работы: ", #vr, CrLf Endif
If i = 4 Then PORTD = Not %00001000 'Включение 4 светодиода Hserout "Горит 4й светодиод", CrLf Hserout "Bремя работы: ", #vr, CrLf Endif
If i = 5 Then PORTD = Not %00010000 'Включение 5 светодиода Hserout "Горит 5й светодиод", CrLf Hserout "Bремя работы: ", #vr, CrLf Endif
If i = 6 Then PORTD = Not %00100000 'Включение 6 светодиода Hserout "Горит 6й светодиод", CrLf Hserout "Bремя работы: ", #vr, CrLf Endif
If i = 7 Then PORTD = Not %01000000 'Включение 7 светодиода Hserout "Горит 7й светодиод", CrLf Endif
If i = 8 Then PORTD = Not %10000000 'Включение 8 светодиода Hserout "Горит 8й светодиод", CrLf Hserout "Bремя работы: ", #vr, CrLf Endif
If i = 9 Then PORTD = Not %11111111 'Включение 8 светодиода Hserout "Горят все светодиод", CrLf Hserout "Bремя работы: ", #vr, CrLf Endif
vr1 = vr * 1000 WaitMs vr1
PORTD = Not %00000000 'Выключение всех светодиодов
INTCON.T0IF = 0 Resume 'выход из подпрограммы обработки прерывания
Сообщение отредактировал
pic_simulyant - Пт, 29.04.2016, 13:34
|
|
|
|
Matrix252005 |
Дата: Пт, 29.04.2016, 14:02 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Приятного времени суток!!!
pic_simulyant, и не получится!!!
Объясню: У Вас все выполняется в цикле, пока выполняется одно, другое не может быть выполнено!!! Если уже на то пошло, то Вам нужно создать минимум 8 дополнительных переменных, которые будут отсчитывать "время" для данного светика.
С "Pic SimulatorIDE" не работал, так что его синтаксис не знаю... Но не могу понять, что это значит: "PORTD = Not %00000001" Что за "NOT" ???
В микробэйсике, это означает противоположное значение... Например: PORTD = Not %00000001 = PORTD = %11111110 Тобишь инверсное состояние...
И еще, не пойму, Вы все сделали в прерываниях???
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
pic_simulyant |
Дата: Пт, 29.04.2016, 15:00 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 23.04.2016
Статус:
Offline
|
Matrix252005, это программа, которая выполняет команды одну за одной.Как говорилось мной ранее, я не знаю как сделать совместную работу. Not потому что программа написана под конкретный макет, где все выходы инвертированы. Да программа с прерываниями. Про 8 переменных тоже идея была, но у меня не выходит - работает все также одна за одной. Говорю же, что полный профан, PICSimulator для меня ново.
Сообщение отредактировал
pic_simulyant - Пт, 29.04.2016, 15:02
|
|
|
|