Страница 184 из 304
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 10:09:00
vem566
For Wtime = 0 To 3 Incr Wtime
Абсолютно бессмысленный фрагмент. Переменная Wtime это счетчик цикла. Она увеличивается автоматически. Увеличивать её еще на единицу внутри цикла зачем? Но это еще не все.
Как будет изменяться переменная Wtime:
Первая итерация цикла = 1, добавление 1 внутри цикла (Incr Wtime) = 2
Вторая итерация цикла = 3, добавление 1 внутри цикла = 4
Я уж не говорю о таком правиле, что без крайней необходимости настоятельно не рекомендуется принудительно изменять величину счетчика цикла внутри самого цикла. Вот как себя поведет компилятор? В цикле явно задано условие окончания цикла при Wtime равном трем. А ведь по факту она или меньше, или больше. Но равенства не будет. Будем надеяться, что компилятор сообразит проверить на больше/равно. Если нет, то результат работы не предсказуем.
Следующий оператор:
If Wtime = 3 Then 'время ожидания второго нажатия
Вопрос № раз: в каком месте это ожидание?
Если посмотреть даташит на МК и узнать, сколько циклов процессора выполняетя цикл for + Incr можно посчитать время выполнения всего этого ожидания. Будут это микросекунды.
Кроме того, переменная Wtime значения 3 никогда не достигнет по выходу из цикла. Она всегда будет четной. И данном фрагменте будет = 4(будем надеяться).
Вопрос № два раза: кроме обнуления переменной Wtime она нигде больше не упоминается. На хрена она вообще нужна?
По выходу из цикла она равна 4, условие на равенство трем не выполняется. Стало быть, светодиод всегда выключен.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 10:45:23
amv2000
KOTик писал(а):Как реализовать двойное нажатие?Может у кого примерчик с комментариями имеется - для разбора самое то.
Ну конечно же есть, к примеру страница 107, комментарии от edm2007
Код: Выделить всё
$regfile = "attiny2313.dat" ' тип МК
$crystal = 4000000 ' тактовая частота
'------------------------------------------------------
Config Portd.2 = Input ' кнопка
Config Porta.0 = Output ' красный светодиод
Config Porta.1 = Output ' зеленый светодиод
Config Debounce = 50 ' антидребезг
'------------------------------------------------------
Dim Count As Byte ' счетчик удержания кнопки
Reset Porta.0 ' гасим оба светодиода
Reset Porta.1 ' (начальное состояние)
'------------------------------------------------------
Do ' основной цикл
Debounce Pind.2 , 0 , Button , Sub ' опрос кнопки
Loop
'------------------------------------------------------
Button: ' обработка нажатия кнопки
While Pind.2 = 0 ' до тех пор пока кнопка удерживается
Incr Count ' увеличиваем счетчик
Waitms 50 ' задержка
If Count => 20 Then ' если кнопка удерживается 1 секунду
Reset Porta.0 ' гасим красный светодиод
Set Porta.1 ' включаем зеленый
Count = 0 ' обнуляем счетчик
Goto Ext ' уходим
End If ' конец условия
Wend
' если же кнопка удерживалась менее секунды
Reset Porta.1 ' гасим зеленый светодиод
Set Porta.0 ' включаем красный
Count = 0 ' обнуляем счетчик
Ext: ' уходим
Return ' возврат в основной цикл
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 11:20:34
KOTик
amv2000 писал(а):KOTик писал(а):Как реализовать двойное нажатие?Может у кого примерчик с комментариями имеется - для разбора самое то.
Ну конечно же есть, к примеру страница 107, комментарии от edm2007
Код: Выделить всё
$regfile = "attiny2313.dat" ' тип МК
$crystal = 4000000 ' тактовая частота
'------------------------------------------------------
Config Portd.2 = Input ' кнопка
Config Porta.0 = Output ' красный светодиод
Config Porta.1 = Output ' зеленый светодиод
Config Debounce = 50 ' антидребезг
'------------------------------------------------------
Dim Count As Byte ' счетчик удержания кнопки
Reset Porta.0 ' гасим оба светодиода
Reset Porta.1 ' (начальное состояние)
'------------------------------------------------------
Do ' основной цикл
Debounce Pind.2 , 0 , Button , Sub ' опрос кнопки
Loop
'------------------------------------------------------
Button: ' обработка нажатия кнопки
While Pind.2 = 0 ' до тех пор пока кнопка удерживается
Incr Count ' увеличиваем счетчик
Waitms 50 ' задержка
If Count => 20 Then ' если кнопка удерживается 1 секунду
Reset Porta.0 ' гасим красный светодиод
Set Porta.1 ' включаем зеленый
Count = 0 ' обнуляем счетчик
Goto Ext ' уходим
End If ' конец условия
Wend
' если же кнопка удерживалась менее секунды
Reset Porta.1 ' гасим зеленый светодиод
Set Porta.0 ' включаем красный
Count = 0 ' обнуляем счетчик
Ext: ' уходим
Return ' возврат в основной цикл
Спасибо за ссылку на пост.
Этот вариант Я реализовал. Они отлично работает, но при длительном нажатии.
А мне нужна обработка двойного нажатия за ННН секунд...
переписывал этот фрагмент кода и так, и сяк - ровным счетом ниего

Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 12:12:58
amv2000
KOTик писал(а):мне нужна обработка двойного нажатия за ННН секунд...
переписывал этот фрагмент кода и так, и сяк - ровным счетом ниего

Ну берем этот код и навскидку получается вроде этого
Код: Выделить всё
Button: ' обработка нажатия кнопки
Do
Incr Count ' увеличиваем счетчик
Waitms 50 ' задержка
if Pind.2 = 0
Toggle Porta.1 ' инвертируем Porta.1
Count = 0 ' обнуляем счетчик
If Count > 30 Then ' если прошло 3 секунды
Goto Ext ' уходим
End If ' конец условия
Loop
Ext: ' уходим
Return ' возврат в основной цикл
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 12:17:09
vem566
amv2000 писал(а):Waitms 50 ' задержка
if Pind.2 = 0
Toggle Porta.1 ' инвертируем Porta.1
Count = 0 ' обнуляем счетчик
If Count > 30 Then ' если прошло 3 секунды
0.05 секунды * 30 = 1.5 сек. Или задержку удвоить, или счетчик.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 13:20:45
amv2000
Ну да согласен, я ж сказал навскидку( видимо плохо целился)
If Count > 60 Then ' если прошло 3 секунды
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 13:29:40
vem566
А я бы задержку удвоил.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 14:12:52
amv2000
Да кто ж Вам запретит то

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт окт 01, 2013 16:42:17
KOTик
amv2000 писал(а):KOTик писал(а):мне нужна обработка двойного нажатия за ННН секунд...
переписывал этот фрагмент кода и так, и сяк - ровным счетом ниего

Ну берем этот код и навскидку получается вроде этого
Код: Выделить всё
Button: ' обработка нажатия кнопки
Do
Incr Count ' увеличиваем счетчик
Waitms 50 ' задержка
if Pind.2 = 0
Toggle Porta.1 ' инвертируем Porta.1
Count = 0 ' обнуляем счетчик
If Count > 30 Then ' если прошло 3 секунды
Goto Ext ' уходим
End If ' конец условия
Loop
Ext: ' уходим
Return ' возврат в основной цикл
Запарка на работе
Наконец-таки добрался я до кода, а он не пашет

При нажатии на кнопку, сразу загорается LED и все.
Т.е. роль count-a никакая. нет никакой обработки двойного нажатия

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт окт 01, 2013 16:55:00
vem566
Несколько вопросов:
1. На Pinb.2 повешена кнопка, которая замыкает его на землю?
2. На Porta.1 - светодиод?
3. Как вызывается подпрограмма?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт окт 01, 2013 17:42:09
KOTик
vem566 писал(а):Несколько вопросов:
1. На Pinb.2 повешена кнопка, которая замыкает его на землю?
2. На Porta.1 - светодиод?
3. Как вызывается подпрограмма?
Код: Выделить всё
'выход
Config Portb.0 = Output 'LED
'вход
Config Pinb.4 = Input 'КНОПКА
Led Alias Portb.0
Button Alias Pinb.4
Do
Debounce Button , 0 , Knopka , Sub ' кнопка прижата к земле
Loop
'ОБРАБОТЧИК
Knopka:
waitms 50
While Button = 0
Led = 1
Waitms 50
If Button = 1 Then
Led = 0
End If
Wend
Waitms 50
Return
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт окт 01, 2013 17:46:43
KOTик
Замените только порты под свои.
А можно еще в обработчике вместо If.. Then можно написать так:
While PINX.X = 0
Led = 0
Bitwait PINX.X, Set 'или Reset, в зависимости к чему прижата кнопка
Bitwait PINX.X - производит проверку пина на "0" или "1" (сет или ресет) - т.е. проверка на отпускание кнопки
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт окт 01, 2013 18:12:52
KOTик
А у меня ни в какую не получиЦа отработать двойное нажатие

Кто-нибудь проверял кот обработки двойного нажатия несколькими постами выше?
Может у меня че-то не работает

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт окт 01, 2013 19:02:57
vem566
Вот примерно как:
'ОБРАБОТЧИК
Knopka:
Count = 0 ' Устанавливаем счетчик в 0
Led = 1 ' Зажигаем светодиод
Waitms 50
While Count < 30 ' Цикл, пока счетчик не достигнет 30
Waitms 50 ' Задержка
If Button = 0 Then ' Если кнопка нажата
Count = 40 ' Устанавливаем счетчик в "много" для выхода из цикла
Led = 0 ' Гасим светодиод
Else
Incr Count ' Иначе увеличиваем счетчик на 1
End If
Wend
Waitms 50
Return
Re: BASCOM AVR в вопросах и ответах
Добавлено: Ср окт 02, 2013 07:31:34
pavel1979
Кто нибудь пробовал подружить ИЖЦ5-4/8 И АТМЕГУ?
http://www.rigexpert.com/index?s=articl ... add=cmeter как можно организовать?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Ср окт 02, 2013 09:44:15
vem566
pavel1979, делал давно. Обычную динамическую индикацию, только на вывод BP подается меандр. Частоту не помню, да она и не критична. Вроде около 10 килогерц. Во всяком случае больше на порядок, чем сама индикация. Можешь еще вот тут посмотреть
http://sezador.radioscanner.ru/pages/ar ... cdctrl.pdf
Re: BASCOM AVR в вопросах и ответах
Добавлено: Ср окт 02, 2013 10:46:22
pavel1979
vem566 спасибо,наводит на кое какие мысли...только вот таких регистров нет,только 74нс164 и 74нс595,бум думать

Re: BASCOM AVR в вопросах и ответах
Добавлено: Ср окт 02, 2013 14:33:52
vem566
Ну смотря какая мега. 7+4+1 = 12 ног. Если не хватает портов, то прекрасно будут себя вести и 164 и 595. Инерция у ЖК большая, так что на 164 мигать не будет.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб окт 05, 2013 21:38:00
KOTик
Мяууу коты!
сегодня весь день ковырял код обработки двойного нажатия - опять крах
Ну, помогите, плиз котику
ооочень надо

Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб окт 05, 2013 21:46:22
pavel1979
можно исходник-посмотрим что да как
Config Debounce = 50 ' àíòèäðåáåçã
'------------------------------------------------------
Dim Count As Byte ' ñ÷åò÷èê óäåðæàíèÿ êíîïêè
Reset Porta.0 ' ãàñèì îáà ñâåòîäèîäà
' (íà÷àëüíîå ñîñòîÿíèå)
'------------------------------------------------------
Do ' îñíîâíîé öèêë
Debounce Pind.2 , 0 , Button , Sub ' îïðîñ êíîïêè
Loop
'------------------------------------------------------
Button: ' îáðàáîòêà íàæàòèÿ êíîïêè
Label1: 'æäåì êîãäà îòïóñòèì êíîïêó
Waitms 10
If Pind.2 = 0 Then Goto Label1
For Count = 0 To 255 'çàäàåì 255êëîâ ïî
Waitms 10 '10 ìñåê=2,55 ñåê
If Pind.2 = 0 Then
Set Porta.0 ' âêëþ÷àåì çåëåíûé
Goto Ext ' óõîäèì
End If
Next Count
Reset Porta.0 ' ãàñèì êðàñíûé ñâåòîäèîä
Ext: ' óõîäèì
Return ' âîçâðàò â îñíîâíîé öèêë