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 в вопросах и ответах
Ну конечно же есть, к примеру страница 107, комментарии от edm2007KOTик писал(а):Как реализовать двойное нажатие?Может у кого примерчик с комментариями имеется - для разбора самое то.
Код: Выделить всё
$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 писал(а):Ну конечно же есть, к примеру страница 107, комментарии от edm2007KOTик писал(а):Как реализовать двойное нажатие?Может у кого примерчик с комментариями имеется - для разбора самое то.Код: Выделить всё
$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 в вопросах и ответах
0.05 секунды * 30 = 1.5 сек. Или задержку удвоить, или счетчик.amv2000 писал(а):Waitms 50 ' задержка
if Pind.2 = 0
Toggle Porta.1 ' инвертируем Porta.1
Count = 0 ' обнуляем счетчик
If Count > 30 Then ' если прошло 3 секунды
- Реклама
- 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=articl ... 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 ' âîçâðàò â îñíîâíîé öèêë


