BASCOM AVR в вопросах и ответах
Re: BASCOM AVR в вопросах и ответах
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, условие на равенство трем не выполняется. Стало быть, светодиод всегда выключен.
Абсолютно бессмысленный фрагмент. Переменная Wtime это счетчик цикла. Она увеличивается автоматически. Увеличивать её еще на единицу внутри цикла зачем? Но это еще не все.
Как будет изменяться переменная Wtime:
Первая итерация цикла = 1, добавление 1 внутри цикла (Incr Wtime) = 2
Вторая итерация цикла = 3, добавление 1 внутри цикла = 4
Я уж не говорю о таком правиле, что без крайней необходимости настоятельно не рекомендуется принудительно изменять величину счетчика цикла внутри самого цикла. Вот как себя поведет компилятор? В цикле явно задано условие окончания цикла при Wtime равном трем. А ведь по факту она или меньше, или больше. Но равенства не будет. Будем надеяться, что компилятор сообразит проверить на больше/равно. Если нет, то результат работы не предсказуем.
Следующий оператор:
If Wtime = 3 Then 'время ожидания второго нажатия
Вопрос № раз: в каком месте это ожидание?
Если посмотреть даташит на МК и узнать, сколько циклов процессора выполняетя цикл for + Incr можно посчитать время выполнения всего этого ожидания. Будут это микросекунды.
Кроме того, переменная Wtime значения 3 никогда не достигнет по выходу из цикла. Она всегда будет четной. И данном фрагменте будет = 4(будем надеяться).
Вопрос № два раза: кроме обнуления переменной Wtime она нигде больше не упоминается. На хрена она вообще нужна?
По выходу из цикла она равна 4, условие на равенство трем не выполняется. Стало быть, светодиод всегда выключен.
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: BASCOM AVR в вопросах и ответах
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 в вопросах и ответах
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 ' возврат в основной цикл
Спасибо за ссылку на пост.
Этот вариант Я реализовал. Они отлично работает, но при длительном нажатии.
А мне нужна обработка двойного нажатия за ННН секунд...
переписывал этот фрагмент кода и так, и сяк - ровным счетом ниего
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: BASCOM AVR в вопросах и ответах
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 в вопросах и ответах
amv2000 писал(а):Waitms 50 ' задержка
if Pind.2 = 0
Toggle Porta.1 ' инвертируем Porta.1
Count = 0 ' обнуляем счетчик
If Count > 30 Then ' если прошло 3 секунды
0.05 секунды * 30 = 1.5 сек. Или задержку удвоить, или счетчик.
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: BASCOM AVR в вопросах и ответах
Ну да согласен, я ж сказал навскидку( видимо плохо целился)
If Count > 60 Then ' если прошло 3 секунды
If Count > 60 Then ' если прошло 3 секунды
Re: BASCOM AVR в вопросах и ответах
А я бы задержку удвоил.
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: BASCOM AVR в вопросах и ответах
Да кто ж Вам запретит то 
Re: BASCOM AVR в вопросах и ответах
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 в вопросах и ответах
Несколько вопросов:
1. На Pinb.2 повешена кнопка, которая замыкает его на землю?
2. На Porta.1 - светодиод?
3. Как вызывается подпрограмма?
1. На Pinb.2 повешена кнопка, которая замыкает его на землю?
2. На Porta.1 - светодиод?
3. Как вызывается подпрограмма?
Re: BASCOM AVR в вопросах и ответах
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 в вопросах и ответах
Замените только порты под свои.
А можно еще в обработчике вместо If.. Then можно написать так:
While PINX.X = 0
Led = 0
Bitwait PINX.X, Set 'или Reset, в зависимости к чему прижата кнопка
Bitwait PINX.X - производит проверку пина на "0" или "1" (сет или ресет) - т.е. проверка на отпускание кнопки
А можно еще в обработчике вместо If.. Then можно написать так:
While PINX.X = 0
Led = 0
Bitwait PINX.X, Set 'или Reset, в зависимости к чему прижата кнопка
Bitwait PINX.X - производит проверку пина на "0" или "1" (сет или ресет) - т.е. проверка на отпускание кнопки
Re: BASCOM AVR в вопросах и ответах
А у меня ни в какую не получиЦа отработать двойное нажатие 
Кто-нибудь проверял кот обработки двойного нажатия несколькими постами выше?
Может у меня че-то не работает
Кто-нибудь проверял кот обработки двойного нажатия несколькими постами выше?
Может у меня че-то не работает

Re: BASCOM AVR в вопросах и ответах
Вот примерно как:
'ОБРАБОТЧИК
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
'ОБРАБОТЧИК
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
-
pavel1979
- Мучитель микросхем
- Сообщения: 494
- Зарегистрирован: Пн авг 12, 2013 19:07:47
- Откуда: башкирия мелеуз
Re: BASCOM AVR в вопросах и ответах
Кто нибудь пробовал подружить ИЖЦ5-4/8 И АТМЕГУ? http://www.rigexpert.com/index?s=articles&f=cmeter&l=ru&add=cmeter как можно организовать?
Re: BASCOM AVR в вопросах и ответах
pavel1979, делал давно. Обычную динамическую индикацию, только на вывод BP подается меандр. Частоту не помню, да она и не критична. Вроде около 10 килогерц. Во всяком случае больше на порядок, чем сама индикация. Можешь еще вот тут посмотреть http://sezador.radioscanner.ru/pages/ar ... cdctrl.pdf
-
pavel1979
- Мучитель микросхем
- Сообщения: 494
- Зарегистрирован: Пн авг 12, 2013 19:07:47
- Откуда: башкирия мелеуз
Re: BASCOM AVR в вопросах и ответах
vem566 спасибо,наводит на кое какие мысли...только вот таких регистров нет,только 74нс164 и 74нс595,бум думать 
Re: BASCOM AVR в вопросах и ответах
Ну смотря какая мега. 7+4+1 = 12 ног. Если не хватает портов, то прекрасно будут себя вести и 164 и 595. Инерция у ЖК большая, так что на 164 мигать не будет.
Re: BASCOM AVR в вопросах и ответах
Мяууу коты!
сегодня весь день ковырял код обработки двойного нажатия - опять крах
Ну, помогите, плиз котику
ооочень надо
сегодня весь день ковырял код обработки двойного нажатия - опять крах
Ну, помогите, плиз котику
ооочень надо
-
pavel1979
- Мучитель микросхем
- Сообщения: 494
- Зарегистрирован: Пн авг 12, 2013 19:07:47
- Откуда: башкирия мелеуз
Re: BASCOM AVR в вопросах и ответах
можно исходник-посмотрим что да как
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 ' âîçâðàò â îñíîâíîé öèêë
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 ' âîçâðàò â îñíîâíîé öèêë