BASCOM AVR в вопросах и ответах
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Да я давненько роюсь в примере. Переделал как хотел. Но когда выполняется подпрограмма нельзя отслеживать кнопку. Это не очень хорошо, но что нибудь попробую придумать. Может в подпрограмму дописать команду чтоб отслеживать светодиодом нажата она или нет? Эх... Опыту мало 
- Реклама
Повесьте кнопку на внешнее прерывание. Делов-то. 
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Но тогда индикация будет сбрасываться
Ведь я применил в программе ваш пример 
Это почему же? Прерывание таймера - это одно. А прерывание кнопки - совершенно другое. И вместе они запросто уживутся. 
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Сейчас попробую 
Пока не вьехал в стройку как это сделать
Почитаю еще литературы немного
Пока не вьехал в стройку как это сделать
Почитаю еще литературы немного
- Реклама
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Мозги уже кипят
По нажатию кнопки происходит переход сразу в подпрограмму. Это понятно из вашего примера.
Далее работает подпрограмма. Весь основной цикл опрашивается кнопка и все. Что то дописывать (даже простейшее ) туда бесполезно , программа отрабатывает сразу переход в подпрограмму. Что то я совсем отупел уже
Не могу уже придумать ничего 
По нажатию кнопки происходит переход сразу в подпрограмму. Это понятно из вашего примера.
Далее работает подпрограмма. Весь основной цикл опрашивается кнопка и все. Что то дописывать (даже простейшее ) туда бесполезно , программа отрабатывает сразу переход в подпрограмму. Что то я совсем отупел уже
Нормальное явление, не переживайте.
Давайте начнем с того, что именно вас не устраивает в имеющемся варианте?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Устраивает всё
Но проблема в том что помимо переключения светодиодов и отключения через 3 сек надо еще индицировать нажатие кнопки в реальном времени отдельным светодиодом. Но в основном цикле у меня это сделать как я понимаю уже не получится. В остальном все получается очень даже хорошо 
Да и как тут не переживать? Столько усилий прикладываешь чтоб создать элементарное, даже стыдно

Да и как тут не переживать? Столько усилий прикладываешь чтоб создать элементарное, даже стыдно
Доброго времени суток !
Тоже решил впрячься в решение задачи.
осторожно! леоныч!!!, а что конкретно сейчас не устраивает ? edm2007 предложил рабочее решение, только что попробовал.
edm2007, виртуозно написано !
Я пока так не умею...
Можно прокомментировать поподробнее ?
Я не понял, как тут отсчитывается 3 секунды ?
Тоже решил впрячься в решение задачи.
осторожно! леоныч!!!, а что конкретно сейчас не устраивает ? edm2007 предложил рабочее решение, только что попробовал.
edm2007, виртуозно написано !
Можно прокомментировать поподробнее ?
Код: Выделить всё
Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 ' отсчет 3-х секунд
Ocr1a = &HB71B
On Oc1a 3sec
Enable Interrupts ' разрешаем прерывание
Enable Oc1aС уважением,
Алексей.
Алексей.
Таймер 1 тактируется сигналом с частотой F0/256=15625 Гц. Чтобы получить задержку 3 с, нам необходимо пропустить 3*15625=46875 периодов этого сигнала. Что в шестнадцатеричном выражении равно &hB71B. Это значение и записывается в регистр сравнения таймера, по достижению которого сработает прерывание.Gordon Shumway писал(а):Я не понял, как тут отсчитывается 3 секунды ?Код: Выделить всё
Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 ' отсчет 3-х секунд Ocr1a = &HB71B On Oc1a 3sec
Даже остановленные часы два раза в сутки показывают правильное время.
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
осторожно! леоныч!!!, а что конкретно сейчас не устраивает ? edm2007 предложил рабочее решение, только что попробовал.
edm2007, виртуозно написано !
Я пока так не умею...
Можно прокомментировать поподробнее ?
Да все меня устраивает. Код замечательный, не спорю. Я этот пример использовал в своей программе для мк. Дополнил еще очень много чем. Как я уже писал, я не программист, это моя вторая работа.
Просто я не мог вчера придумать как в ходе работы предложенного кода отслеживать нажатие кнопки и индицировать его отдельным светодиодом в реальном времени. В остальном все отлично.
edm2007, виртуозно написано !
Можно прокомментировать поподробнее ?
Да все меня устраивает. Код замечательный, не спорю. Я этот пример использовал в своей программе для мк. Дополнил еще очень много чем. Как я уже писал, я не программист, это моя вторая работа.
Просто я не мог вчера придумать как в ходе работы предложенного кода отслеживать нажатие кнопки и индицировать его отдельным светодиодом в реальном времени. В остальном все отлично.
Я же выше расписывал подробно.Gordon Shumway писал(а):Я не понял, как тут отсчитывается 3 секунды ?
Секретный кот, спасибо.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Вот зараза. Не получается. Хоть еще один порт задействуй. Глупо как то......
Нашел довольно не плохой список команд с описанием http://www.cqham.ru/bascom.htm
Может как и мне кому нибудь пригодиться.
Нашел довольно не плохой список команд с описанием http://www.cqham.ru/bascom.htm
Может как и мне кому нибудь пригодиться.
Вы про индикацию нажатий кнопок ? В каком виде она вам нужна - отдельным светодиодом, или как-то существующие светодиоды должны отреагировать помимо их основной работы ?осторожно! леоныч!!! писал(а):Вот зараза. Не получается. Хоть еще один порт задействуй. Глупо как то......
С уважением,
Алексей.
Алексей.
Вы нормально скажите, что нужно-то? Сформулируйте задание. А тоосторожно! леоныч!!! писал(а):Вот зараза. Не получается.
А чем именно - непонято. О нажатии кнопки должен сигнализировать светодиод? И как? Пока нажата кнопка, или что?осторожно! леоныч!!! писал(а):Дополнил еще очень много чем.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Поясню проще) Считаем что ваш пример без изменений, надо просто индицировать нажатие кнопки. Кнопка нажата - отдельный светодиод горит, отпущена - не горит. При это функция счета 3 светодиодов должна оставаться. Я пробовал перенести подпрограмму в основной цикл, думал так получится. Но так и не разобрался
Компилятор обматерил меня как мог

А если включить в обработку прерывания такой кодосторожно! леоныч!!! писал(а): Считаем что ваш пример без изменений, надо просто индицировать нажатие кнопки. Кнопка нажата - отдельный светодиод горит, отпущена - не горит.
Код: Выделить всё
3leds: ' подпрограмма обработки нажатия кнопки
if Button = 0 then
Set Led_4 ' здесь ваш отдельный светодиод, не забыть в начале присвоить его к порту например: Led_4 Alias Portb.4
Else
Reset Led_4
Timer1 = 0 ' обнуляем таймер отсчета 3-х секунд
Incr Count
If Count > 3 Then Count = 3
If Count = 1 Then
Set Red_led
Elseif Count = 2 Then
Set Yellow_led
Elseif Count = 3 Then
Set Green_led
End If- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Очень интересно amv2000
Сам бы точно не допёр
Да еще второй день зуб болит,башка вообще почти не варит. Сейчас попробую 
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
label not found (endif0) Вот так снова меня обматерил компилятор 
Даже после успешной компиляции с одной строкой If Button = 0 Then Set Leda (просто зажечь светодиод) "leda" - так он прописан, он не загорается...
Только сейчас вспомнил что вроде вчера так пробовал только без присвоения имен, просто порт прописывал.
Даже после успешной компиляции с одной строкой If Button = 0 Then Set Leda (просто зажечь светодиод) "leda" - так он прописан, он не загорается...
Только сейчас вспомнил что вроде вчера так пробовал только без присвоения имен, просто порт прописывал.
Ну да еще один End If внизу допишитеосторожно! леоныч!!! писал(а):label not found (endif0) Вот так снова меня обматерил компилятор
Код: Выделить всё
Elseif Count = 3 Then
Set Green_led
End If
End ifКод: Выделить всё
if Button = 0 then
Set Led_4 ' здесь ваш отдельный светодиод, не забыть в начале присвоить его к порту например: Led_4 Alias Portb.4
Else
Reset Led_4
End ifКод: Выделить всё
if Button = 0 then : Set Led_4 = Button : End if
Последний раз редактировалось amv2000 Вт окт 09, 2012 11:22:48, всего редактировалось 2 раза.


