Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: brown, ivan_fd  
Програмка на световые эффекты
Glas1 Дата: Пн, 19.10.2015, 20:24  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 1
Репутация: 0   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 19.10.2015
ADMIN Дата: Чт, 22.10.2015, 11:30  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

А что не работает? Какие вопросы?
pic_simulyant Дата: Сб, 23.04.2016, 22:30  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 23.04.2016

Статус: Offline

Помогите, пожалуйста, разобраться с программой.
Нужно реализовать следующее: МКпо командам, поступающим через последовательный порт включает светодиоды на
заданное в команде время.
ADMIN Дата: Вт, 26.04.2016, 15:31  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

В чем именно помочь? Выше есть пример. Что непонятно?
pic_simulyant Дата: Вт, 26.04.2016, 19:35  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 23.04.2016

Статус: Offline

Программа работает следующим образом: выбираем светодиод (1 из 8) и задаем время его работы. Потом выбираем еще один и его время работы и т.д. При этом работают оба каждый свое время. 
Сейчас у меня работает только поочередное введение команд, т. е. сначала работает один со своим временем, даем команду - другой. Вместе не знаю как реализовать.
Помогите, хоть идею подкиньте.
dimvad Дата: Ср, 27.04.2016, 13:34  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 80
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Забивайте в терминал 3х значное число. Первая цифра это номер светодиода 1-3, а две остальные - время его свечения в сек. Например 310 - это 3ий светик горит 10 сек.
Прикрепления: test.rar (27.0 Kb)

Сообщение отредактировал dimvad - Ср, 27.04.2016, 14:13
pic_simulyant Дата: Ср, 27.04.2016, 22:40  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 23.04.2016

Статус: Offline

dimvad, ваша программа выполняет совместное горение светодиодов каждый со своим временем? или они по очереди просто горят?
dimvad Дата: Ср, 27.04.2016, 23:57  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 80
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

В пакете UART содержится информация о номере светика и времени его свечения. Как только команда прилетает, соответствующий светик зажигается на нужное время, другие диоды продолжают независимо отрабатывать свои задания. Если у Вас установлен протеус, то по-моему проще посмотреть.
pic_simulyant Дата: Чт, 28.04.2016, 00:17  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 23.04.2016

Статус: Offline

dimvad, извиняюсь за назойливость. Просто первый раз сталкиваюсь с PIC Simulator'ом и Basic'ом. Ваша программа помогла разобраться с алгоритмом. Но она у меня не компилится, попытки перевести тщетны.
dimvad Дата: Чт, 28.04.2016, 09:17  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 80
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Забудьте Вы про Пик Симулятор. Установите симулятор-отладчик Proteus. Скачать его можно где угодно. Там Вы увидите и МК и светодиоды и сможете ими помигать как хочется. В архиве, что я дал все это есть. Не компилится наверное потому, что видимо используете БасикПро, а я писал на Протоне, он получше будет. Переписать с Протона на Про довольно просто - чуток синтаксис другой.
pic_simulyant Дата: Чт, 28.04.2016, 20:07  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 23.04.2016

Статус: Offline

dimvad, дак проблема в том, что написать надо именно на пик симуляторе, бэсикеПро(((
ЯНДЕКС Дата: 28.04.2016
ADMIN Дата: Пт, 29.04.2016, 13:04  |                                                                                                                Сообщение # 12
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

pic_simulyant, может, покажешь уже свой код и объяснишь, что не получается?
pic_simulyant Дата: Пт, 29.04.2016, 13:33  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 43   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 23.04.2016

Статус: Offline

Matrix252005, это программа, которая выполняет команды одну за одной.Как говорилось мной ранее, я не знаю как сделать совместную работу. Not потому что программа написана под конкретный макет, где все выходы инвертированы.
Да программа с прерываниями.
Про 8 переменных тоже идея была, но у меня не выходит - работает все также одна за одной. Говорю же, что полный профан, PICSimulator для меня ново.

Сообщение отредактировал pic_simulyant - Пт, 29.04.2016, 15:02
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: