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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Адвансед
Встал на лапы
Сообщения: 98
Зарегистрирован: Вс мар 11, 2012 23:06:08
Откуда: Казань

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

Сообщение Адвансед »

1. нет (у того что стоял вначале)
2. подтяжка программная,
3. кондеры не висят, впервые работаю с энкодерами.
4. да, появлялись, пока не поставил другой энкодер.
---
Поигрался с разными энкодерами, были энкодеры отпаяные с магнитол и музцентров, два из них "глючат" (помогает программный сброс)
- - -
оказывается, энкодеры разные есть, я то и знать не знал... спасибо за советы :beer:
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

Попробуйте эти файлы.
Должно компилироваться.
Реклама
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

Сообщение Novice user »

эти идут нормально,все работает,воюю далее :))

фух,разобрался...
Аватара пользователя
Адвансед
Встал на лапы
Сообщения: 98
Зарегистрирован: Вс мар 11, 2012 23:06:08
Откуда: Казань

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

Сообщение Адвансед »

продолжаю вощиться с кодом, точнее добавлять функции нужные в него...

допустим есть код

Код: Выделить всё

Config Portb.4 = Output : Set Portd.2  

do
if pinb.2=1 then
goto rabota
else
end if
loop

Rabota:
portb.4 =1
wait 180
portb.4=0
return
как сделать, чтобы при повторном нажатии на кнопку порт сразу выключился, то есть, моя цель - обойти кусок кода когда программа считает эти wait 180, то есть пока не насчитает порт не выключится, а мне нужно чтобы можно было в любой момент его выключить.

то есть, нажали на кнопку, заработал процесс, скажем включили порт и через 180 секунд он должен выключится сам. НО если я нажму в любой момент на кнопку, то он должен выключится, не дожидаясь того пока натикает 180 сек. как это реализовать?

мне нужно это реализовать на порте PB0/AIN0/OC0A/PCINT0 на атини13,


можно на примере этого например, этот код включает и выключает порт

Код: Выделить всё

Config Portb.4 = Output : Set Portd.2

do
Debounce Pind.2 , 0 , Kn1 , Sub
loop

Kn1:
wait 180
Toggle Portb.4
ну , тут то же самое, пока не посчитает 180 секунд порт не вырубится, а мне нужно чтобы он вырубился в любой момент когда нажмешь на кнопку, если не нажать, то через 180 сек выключится сама
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Разбейте свои 180 секунд на миллисекунды, зациклив их 180000 раз. Или, например, по 100 миллисекунд 1800 раз. В цикле проверяйте порт, если условие сработало - выход из цикла.
Реклама
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Адвансед, у "глючащих" просто другая последовательность смены состояний. Найду такой, покажу обязательно, как можно обойтись без всяких сбросов. :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Реклама
Аватара пользователя
Адвансед
Встал на лапы
Сообщения: 98
Зарегистрирован: Вс мар 11, 2012 23:06:08
Откуда: Казань

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

Сообщение Адвансед »

Аlex писал(а):Разбейте свои 180 секунд на миллисекунды, зациклив их 180000 раз. Или, например, по 100 миллисекунд 1800 раз. В цикле проверяйте порт, если условие сработало - выход из цикла.
наверняка есть вариант попроще, у меня выше уже есть код, если я разобью то все у меня не уместится в МК,
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Ну вариантов-то не особо много. Делить выдержку вполне логично и не так затратно по месту. Ваша огромная задержка топчется на месте, и прервать ее можно только сбросом и прерываниями. Все остальное с таймерами / прерываниям, думается мне, и сложнее и больше.

P.S. Кстати, может Вам и воспользоваться вектором сброса? :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Адвансед писал(а):наверняка есть вариант попроще
Проще ? Да куда уж проще обычного цикла for ? :)
И давно ли обычный цикл стал занимать всю память ? На что у Вас там места не хватит ? :)
Аватара пользователя
Tankor
Встал на лапы
Сообщения: 139
Зарегистрирован: Вт май 03, 2011 10:13:12
Откуда: Россия, Татарстан

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

Сообщение Tankor »

Адвансед писал(а):продолжаю вощиться с кодом, точнее добавлять функции нужные в него...

допустим есть код

Код: Выделить всё

Config Portb.4 = Output : Set Portd.2  

do
if pinb.2=1 then
goto rabota
else
end if
loop

Rabota:
portb.4 =1
wait 180
portb.4=0
return
Ваша конструкция:
if pinb.2=1 then
goto rabota
else
end if
не оптимальна и так же добавит код в тиньку.
Правильнее так:
Do
if pinb.2=1 then goto rabota
Loop
А ещё оптимальнее:
Do
!SBIC PINB, 2
!JMP rabota
Loop
Аватара пользователя
Balzercvua
Потрогал лапой паяльник
Сообщения: 311
Зарегистрирован: Вт дек 31, 2013 17:36:43

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

Сообщение Balzercvua »

правильно вот так
Config Pinb.4 = Output
Config Pind.2 = Input

Do
If Pind.2 = 1 Then
portb.4 =1
wait 180
Portb.4 = 0
End If
loop
End
но несовсем если это кнопка то положено прерывание
Config Pinb.4 = Output
Config Pind.2 = Input
Config Int0 = Falling
Config Debounce = 50
Const Debouncetime = 75
On Int0 button1
Enable Interrupts
Enable Int0
Do
Loop
button1:

portb.4 =1
wait 180
portb.4 = 0
Waitms Debouncetime
Gifr = 64
Return
end
В принципе прерывание как бы и не нужно если задержка 3 минуты
Последний раз редактировалось Balzercvua Чт янв 28, 2016 02:00:19, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Я в барсике не ферштейн, но как понимаю, это :

Код: Выделить всё

button1:

portb.4 =1
wait 180
 portb.4 = 0
 Waitms Debouncetime
 Gifr = 64
Return
обработчик прерываний по int0 ?

Тогда вопрос. Как программа выйдет из 180-ти секундной задержки при нажатии на кнопку ?
Аватара пользователя
Balzercvua
Потрогал лапой паяльник
Сообщения: 311
Зарегистрирован: Вт дек 31, 2013 17:36:43

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

Сообщение Balzercvua »

Аlex писал(а):Я в барсике не ферштейн, но как понимаю, это :

Код: Выделить всё

button1:

portb.4 =1
wait 180
 portb.4 = 0
 Waitms Debouncetime
 Gifr = 64
Return
end
обработчик прерываний по int0 ?

Тогда вопрос. Как программа выйдет из 180-ти секундной задержки при нажатии на кнопку ?
закончится задержка потом время дребезга и вернется в основную программу как то вот так!!!+ end должен быть в конце мой промах
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Дак вопрос то был в другом - "Как завершить выполнение задержки по нажатии кнопки ?".

И ещё :
Balzercvua писал(а):если это кнопка то положено прерывание
Поясните, плиз.
Кем положено ?
Откуда такая информация ?
Для чего использовать быстрореагирующее (доли микросекунд) прерывание для кнопки ?
И если будет 10-15 кнопок, то необходимо искать МК с 15-тью внешними прерываниями ?
Аватара пользователя
Balzercvua
Потрогал лапой паяльник
Сообщения: 311
Зарегистрирован: Вт дек 31, 2013 17:36:43

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

Сообщение Balzercvua »

для того чтобы при нажатии кнопки прерывание не повторялось несколько раз за одно нажатие!!!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Хм... Железная логика :)
Чтобы прерывание не выполнялось, его вообще можно исключить.
В этом коде :

Код: Выделить всё

If Pind.2 = 1 Then
portb.4 =1
wait 180
Portb.4 = 0
End If
повторное нажатие тоже исключено.
Так для чего тогда использовать INT0 ?

Ну и по сабжу. Как сделать выход из задержки по нажатию кнопки ? Вопрос более актуальный, чем обработка кнопки.
Например, нажали на кнопку - включился светик, пошла задержка. Если во время этой задержки нажать ещё раз кнопку - задержка прекращается и светик вырубается. И так по кругу.
Во время задержки нужно, чтобы я мог свободно пользоваться этим временем. Т.е. обрабатывать, к примеру, другие кнопки. Или делать что-то полезное.
Дайте пример.
Аватара пользователя
Balzercvua
Потрогал лапой паяльник
Сообщения: 311
Зарегистрирован: Вт дек 31, 2013 17:36:43

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

Сообщение Balzercvua »

Ты меня окончантельно наказал
описать процесс но само прерывание использывать в качестве изменения переменной
Config Pinb.4 = Output
Config Pind.2 = Input
Config Int0 = Falling
Config Debounce = 50
Const Debouncetime = 75
On Int0 button1
Enable Interrupts
Enable Int0
Dim A As Byte
A = 0
Do
if a>1 then
a=a-1
wait 1
end if



loop
Button1:
If Pinb.4 = 0 Then
Portb.4 = 1
A = 180
Else
Portb.4 = 0
a=0
End If
Waitms Debouncetime
Gifr = 64
Return
end
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Тяжело въезжать в синтаксис бейсика. Ну что ж, проанализируем код...
Жмём кнопку. Прерывание. Включился светик. А=180.
В основном цикле пошла задержка на 180 сек.
Жмём ещё раз кнопку. Прерывание. Светик = 1, то выключили светик. А=0. Вроде всё норм.
Основной цикл продолжает выполнять 180-ти секундную задержку. И ей, с вероятностью в 99.9%, пудет пофиг, что А сменилось на 0. Засада... :)))
Второе. Пока идёт задержка, я не могу заняться ничем полезным, программа тупо сидит и ждёт эти 180 секунд. Опять засада... :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Ага. Пока я писал свой пост, Вы быстренько сменили код :))
Первая засада решена. Вторая осталась :)


Добавлено.
--------------------------------------------------
Ан, нет. И вторая решилась :)

Теперь осталось убрать прерывания и всё сделать в основном цикле. Представим, что у нас 10 кнопок и 10 светиков :))
Последний раз редактировалось Аlex Чт янв 28, 2016 02:56:36, всего редактировалось 1 раз.
Причина: -
Аватара пользователя
Balzercvua
Потрогал лапой паяльник
Сообщения: 311
Зарегистрирован: Вт дек 31, 2013 17:36:43

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

Сообщение Balzercvua »

Аlex писал(а):Ага. Пока я писал свой пост, Вы быстренько сменили код :))
Первая засада решена. Вторая осталась :)
задержка 1 милисекунда за цыкл!!!
Config Pinb.4 = Output
Config Pind.2 = Input
Dim A As Long
A = 0
Do
If A > 1 Then
a=a-1
Waitms 1
end if
If Pind.2 = 1 Then
If Pinb.4 = 0 Then
Portb.4 = 1
A = 180000
Else
Portb.4 = 0
A = 0
End If
Waitms 200
End If
loop
End
Спасибо за мотивацию!!!
Последний раз редактировалось Balzercvua Чт янв 28, 2016 03:19:36, всего редактировалось 3 раза.
Ответить

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