edm2007 писал(а):max50, пока кнопка нажата, светодиод будет моргать туда-сюда. Это не совсем вписывается в поставленую задачу. Тогда хоть ожидание отпускания кнопки надо добавить.
Была задача:
vladik-bob писал(а):чтоб нажал на кнопочку светодиодик светится второй раз нажал светодиодик не светится?
Поставь задержку больше(я ставлю 100) и все прекрасно будет работать.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
max50, я про что говорю, пока нажата кнопка, состояние светодиода будет меняться на противоположное каждые 100 мс. Работать-то оно будет, но это же ерунда полнейшая. Чуть задержался, и он снова сменил состояние... Не серьезно...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
edm2007 писал(а):max50, я про что говорю, пока нажата кнопка, состояние светодиода будет меняться на противоположное каждые 100 мс. Работать-то оно будет, но это же ерунда полнейшая. Чуть задержался, и он снова сменил состояние... Не серьезно...
Для начала в самый раз!
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Ну да, чтоб он потом эту конструкцию куда-нибудь вкорячил... В железе попробовал сейчас, 100 мс очень мало, ловить нужное состояние жутко неудобно. По мне, если уж без всяких debounce и попроще, то так:
Do
While Button = 1 ' пока кнопка не нажата, сидим тут
Wend
Waitms 50 ' иначе, антидребезг
Toggle Led ' изменение состояния на противоположное
While Button = 0 ' ожидание отпускания
Wend
Waitms 50 ' еще раз
Loop ' пошагали по кругу
End 'end program
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
While Button = 1 ' пока кнопка не нажата, сидим тут
Wend
Последнее не есть гуд
Угу, полностью согласен. И вообще весь этот изврат не имеет смысла. В баскоме замечательная работа с кнопками по debounce. Кстати, про кнопки, я вот что хотел спросить, а как реализовать проверку на то, что кнопка нажата и удерживается определенное время? Ну к примеру, кратковременное нажатие выполняет одну задачу, а нажатие и удержание в течение 5 секунд уводит программу совсем в другое место.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
If Kn = 0 Then ' '
Waitms 600
Debounce Kn , 0 , Aa
End If
работает пока нормально
600 мс выбрал экспериментально-
и при кратковремменном нажатии задержку вроде незаметно , и достаточно долго удерживать надо.
для 5 секунд скорее всего ТАЙМЕР нужен (хотя к чему 5 сек)
К примеру нажали кнопку, запустили таймер и каждые (к примеру) 500мс проверяем состояние кнопки- если нажата-проверяем дальше и увеличиваем переменную. Если не нажата- то переходим на метку. Если переменная превысила значение 10( 10 раз проверили условие нажатия кнопки и она была нажата) то переходим на другую метку.
Примерно так я делал, когда надо было проверить "не нажатие" кнопки. Т.Е. если кнопка долго не нажата то переходим в основной цикл.
Все делают ошибки, только мудрецы - новые, а дураки - старые.
If Kn = 0 Then ' '
Waitms 600
Debounce Kn , 0 , Aa
End If
работает пока нормально
600 мс выбрал экспериментально-
и при кратковремменном нажатии задержку вроде незаметно , и достаточно долго удерживать надо.
для 5 секунд скорее всего ТАЙМЕР нужен (хотя к чему 5 сек)
К примеру нажали кнопку, запустили таймер и каждые (к примеру) 500мс проверяем состояние кнопки- если нажата-проверяем дальше и увеличиваем переменную. Если не нажата- то переходим на метку. Если переменная превысила значение 10( 10 раз проверили условие нажатия кнопки и она была нажата) то переходим на другую метку.
Примерно так я делал, когда надо было проверить "не нажатие" кнопки. Т.Е. если кнопка долго не нажата то переходим в основной цикл.
А здорово так-то с debounce, обязательно попробую такой ход. А 5 сек к тому, что надо попасть в меню, которое в принципе использоваться будет только для начальной настройки. Ну может еще когда, но очень редко. И лишние попадания туда совсем не нужны. Хотя, я так подумал... Зачем в программу забивать вещами, которые так редко используются... Проще наверное проверку нажатия при подаче питания сделать и все. Кнопку нажал, питание подал, и попал в это самое меню. Там в eeprom занес изменяемую переменную и всех делов. Как-то так... И проверка НЕ нажатия тут как раз кстати. Спасибо.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
rotor писал(а):Добрый день или вечер!
Решил попробовать BASCOM AVR, столкнуля с одной проблемой.
при чтении датчика температуры ds18b20 при указанном параметре
$crystal = 4000000
прчитанные 9-ть байт не соответствут реальным, каждый байт больше в два раза, а при параметре $crystal = 1000000 или $crystal = 2000000 или $crystal = 3000000 все нормально.
Хотя команда
Reg_no(1) = 1wsearchfirst()
работает нормально при любых параметрах $crystal.
Испльзую BASCOM v1.11.9.0
Вопрос: ктонибудь сталкивался с такой проблемой если да, как с этим бороться?
Всем спасибо.
rotor писал(а):Добрый день или вечер!
Решил попробовать BASCOM AVR, столкнуля с одной проблемой.
при чтении датчика температуры ds18b20 при указанном параметре
$crystal = 4000000
прчитанные 9-ть байт не соответствут реальным, каждый байт больше в два раза, а при параметре $crystal = 1000000 или $crystal = 2000000 или $crystal = 3000000 все нормально.
Хотя команда
Reg_no(1) = 1wsearchfirst()
работает нормально при любых параметрах $crystal.
Испльзую BASCOM v1.11.9.0
Вопрос: ктонибудь сталкивался с такой проблемой если да, как с этим бороться?
Всем спасибо.
День добрый. Народ совсем обленился, уже просто копирует сообщения других пользователей, и все. Подробнее-то хоть напишите, какой МК, в железе это или в протеусе, свой исходник... В протеусе есть такое, там датчик немного настроить надо. А в железе все замечательно читается...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ну, здесь собака зарыта, похоже, в Протосе! Причем что интересно, что в разных версиях Протоса-разные глюки на эту тему. Я уже с такой фигней давно смирился. В реальном железе все равно все работает, а если не работает, то USB-AVR910-Prottoss вам в помощь. Да собственно, от Протеуса и не требуется точного отображения всей вашей программы. Достаточно просто оценить работоспособность, а уж отладка будет в реальном железе...
Igor_67 писал(а):Я уже указал тебе на ошибку, но ты все равно упорно ее совершаешь.
Sub Hilighton
T2 = 0
While T2 < 10
Incr T1
If Pind.3 = 0 Then : Return
End If
Waitms 100
Wend
Set Portb.3
End Sub
Опять после THEN идет двоеточие, то есть получается условие без следствия. И чего ты хочешь тогда добиться?
Я тебе немного исходник подрихтовал, он во вложении. Пробуй. Честно признаюсь, у себя не проверял - некогда, извини!
Да, потом заметил еще один момент. В п/п Highlighton сначала T2=0? , а потом цикл, пока Т2<10...
Ну дык оно(Т2) всегда будет меньше 10, при обращении к этой п/п. Короче думай-переделывай...
Я конечно извиняюсь, но на реальном железе не работает. С исправлениями по Т2. Не может быть косяка с компилятором у меня? Использую версию 1.11.9.5?
Повторюсь.
1 Проще воспользоваться GOSUB-RETURN
при этом ничего декларировать не нужно
2 Воспользуйся симулятором в компиляторе. Очень удобно. Пошагово поймёшь куда программа уходит , потом легче ошибку искать.
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Приветствую.
Ребята, как за определенное, довольно небольшое время посчитать количество импульсов с помощью Bascom'а.
Время - в районе 0,5 секунды. На ногу МК приходят импульсы. Как узнать сколько?
Думаю импульсы считать с помощью прерываний. Т.е. пришел импульс - в обработчике прерываний переменную для количества импульсов увеличиваю на 1. Но вот как ограничить время подсчета?
Заранее спасибо.
Master_of_Puppets писал(а):Думаю импульсы считать с помощью прерываний. Т.е. пришел импульс - в обработчике прерываний переменную для количества импульсов увеличиваю на 1
Это слишком ресурсозатратно!
Нужно считать с помошью таймера и по переполнению последнего, уходить в прерывание.
Промежуток времени можно отсчитывать другим таймером, тактируемым от задающего генератора МК.
Master_of_Puppets писал(а):Я правильно понял, что время, в течение которого считаются импульсы задается этой строкой?
Config Timer1 = Counter , Edge = Falling , Prescale = 1
Этой строкой конфигурируется таймер. Ну в обучалке же есть пример подсчета: