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

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

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

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

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

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

Сообщение 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                      ' возврат в основной цикл


Спасибо за ссылку на пост.
Этот вариант Я реализовал. Они отлично работает, но при длительном нажатии.
А мне нужна обработка двойного нажатия за ННН секунд...
переписывал этот фрагмент кода и так, и сяк - ровным счетом ниего :(
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

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

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

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

Сообщение amv2000 »

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

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

Сообщение vem566 »

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

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

Сообщение amv2000 »

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

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

Сообщение 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 никакая. нет никакой обработки двойного нажатия :(
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сообщение pavel1979 »

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

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

Сообщение vem566 »

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

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

Сообщение pavel1979 »

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

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

Сообщение vem566 »

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

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

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

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

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

Сообщение 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»