BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4744
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение 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, условие на равенство трем не выполняется. Стало быть, светодиод всегда выключен.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение 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                      ' возврат в основной цикл
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57

Сообщение 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                      ' возврат в основной цикл
Спасибо за ссылку на пост.
Этот вариант Я реализовал. Они отлично работает, но при длительном нажатии.
А мне нужна обработка двойного нажатия за ННН секунд...
переписывал этот фрагмент кода и так, и сяк - ровным счетом ниего :(
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение 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               ' возврат в основной цикл
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4744
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение 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 сек. Или задержку удвоить, или счетчик.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

Ну да согласен, я ж сказал навскидку( видимо плохо целился) :))
If Count > 60 Then ' если прошло 3 секунды
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4744
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

А я бы задержку удвоил.
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

Да кто ж Вам запретит то :))
Встал на лапы
Аватара пользователя
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57

Сообщение 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               ' возврат в основной цикл
Запарка на работе :cry:
Наконец-таки добрался я до кода, а он не пашет :(
При нажатии на кнопку, сразу загорается LED и все.
Т.е. роль count-a никакая. нет никакой обработки двойного нажатия :(
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4744
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Несколько вопросов:
1. На Pinb.2 повешена кнопка, которая замыкает его на землю?
2. На Porta.1 - светодиод?
3. Как вызывается подпрограмма?
Встал на лапы
Аватара пользователя
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57

Сообщение 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
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57

Сообщение KOTик »

Замените только порты под свои.

А можно еще в обработчике вместо If.. Then можно написать так:

While PINX.X = 0
Led = 0
Bitwait PINX.X, Set 'или Reset, в зависимости к чему прижата кнопка

Bitwait PINX.X - производит проверку пина на "0" или "1" (сет или ресет) - т.е. проверка на отпускание кнопки
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57

Сообщение KOTик »

А у меня ни в какую не получиЦа отработать двойное нажатие :(
Кто-нибудь проверял кот обработки двойного нажатия несколькими постами выше?
Может у меня че-то не работает :dont_know:
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4744
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение 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
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

Кто нибудь пробовал подружить ИЖЦ5-4/8 И АТМЕГУ? http://www.rigexpert.com/index?s=articl ... add=cmeter как можно организовать?
Друг Кота
Аватара пользователя
Сообщения: 4744
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

pavel1979, делал давно. Обычную динамическую индикацию, только на вывод BP подается меандр. Частоту не помню, да она и не критична. Вроде около 10 килогерц. Во всяком случае больше на порядок, чем сама индикация. Можешь еще вот тут посмотреть http://sezador.radioscanner.ru/pages/ar ... cdctrl.pdf
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

vem566 спасибо,наводит на кое какие мысли...только вот таких регистров нет,только 74нс164 и 74нс595,бум думать :lol:
Друг Кота
Аватара пользователя
Сообщения: 4744
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Ну смотря какая мега. 7+4+1 = 12 ног. Если не хватает портов, то прекрасно будут себя вести и 164 и 595. Инерция у ЖК большая, так что на 164 мигать не будет.
Встал на лапы
Аватара пользователя
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57

Сообщение KOTик »

Мяууу коты!
сегодня весь день ковырял код обработки двойного нажатия - опять крах :(
Ну, помогите, плиз котику
ооочень надо :oops:
Контактная информация:
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение 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 ' âîçâðàò â îñíîâíîé öèêë
Ответить

Вернуться в «AVR»