Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » attiny13 управление одной кнопкой с таймером


attiny13 управление одной кнопкой с таймером

Сообщений 1 страница 30 из 57

1

Здравствуйте. Помогите, пожалуйста осуществить такой вариант: нажимаю кнопку - зажигаем светодиод на 40 сек, нажимаю повторно - принудительно выключаю, и так по кругу. Если использую wait - следующее нажатие возможно только по истечении задержки, пробовал прерывания - светодиод потухает, но следующее включение возможно опять после задержки

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 16
$swstack = 16
$framesize = 16
$noramclear

Dim Level As Byte

Config PINb.2 = Input
Config Portb.3 = Output

Button Alias PINb.2
Led Alias Portb.3


Do
If Button = 0 Then
If Level = 2 Then
Level = 0
Else
Incr Level
End If
Select Case Level
Case 0
Do :
loop until Button=1
waitms 20
Led = 1
Case 1 :
Do
loop until Button=1
waitms 20
Led = 0
End Select
End If
Loop

End

Отредактировано vyko (2017-10-17 09:44:19)

0

2

Ну увеличивайте скорость (уменьшая wait).

0

3

А за счет чего тогда сделать таймер на 40 сек ?

0

4

гм.....
кнопку в прерывания. типа так:
Config Int0 = Low Level : On INT0 But   'конфигурируем кнопку на прерывании 0
тут вы должны волшебно сконфигурировать таймер на подпрограмму к примеру Time
R=0 , T=0
Led = 0
If R=1 Then
Start Timer0
Led=1
End If

If R=2 or T>40 Then
Stop Timer0
Led=0
T=0
End If

But:
If PINB.1 = 0 Then
   Incr R
      If R>2 then R=0
end if
GIFR = 64
Return

:Time
Incr T
Return

0

5

vyko
а вам точно 40 надо?
а то можно без заморочек с таймером тогда:
R=0 , T=0
Do
Led = 0 'изначально светодиод не горит
If R=1 Then 'если кнопка нажата
Led=1         'включаем светик
T=0            'обнуляем переменную отсчета времени
End If

If R=2 or T>40 Then  Led=0  'если кнопка снова нажата или вышло время гасим светик

wait 1  'задержка 1сек
Incr T  'увеличиваем переменную задежки

Loop
End

But:
If PINB.1 = 0 Then  'кто-то нажал кнопку
   Incr R
      If R>2 then R=0
end if
GIFR = 64
Return

Отредактировано IDok (2017-10-17 12:46:09)

0

6

Только Led = 0 вынеси перед do

0

7

Yuriy.pv
да, тут косяконул, поторопился  :'(
ну и для большей живости кнопки задержку wait можно сделать меньше, а условие для Т больше

0

8

Как я понял, последний вариант такой:

     $regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 16
$swstack = 16
$framesize = 16
$noramclear
Dim Level As Byte
Dim R As Byte
Dim T As Byte

Config PINb.2 = Input
Config Portb.3 = Output
Button Alias PINb.2
Led Alias Portb.3
Config Int0 = Low Level : On INT0 But

R=0
T=0
Led = 0
Do

If R=1 Then
Led=1       
T=0           
End If
If R=2 or T>40 Then  Led=0 
wait 1
Incr T 
Loop
End

But:
If PINB.2 = 0 Then 
   Incr R
      If R>2 then R=0
end if
GIFR = 64
Return

мож что я упустил... не работает, время работы таймера не критично

Отредактировано vyko (2017-10-17 13:15:38)

0

9

vyko написал(а):

не работает

прерывания разрешить надо. как-то вот так:
Config Int0 = Low Level : On INT0 But  : Enable Interrupts  :  Enable Int0    :rolleyes:
ну и если уж пользуетесь алиасами - так пользуйтесь везде

vyko написал(а):

Button Alias PINb.2

и

vyko написал(а):

If PINB.2 = 0 Then

  :dontknow:
да и не нужны алиасы при двух портах и полутора переменных. место только в памяти жруть.

Отредактировано IDok (2017-10-17 13:23:16)

0

10

Понял, поправил, не помогло... а вопрос по переменной R  - вроде как кроме нуля ей и не присваивается ничего...

0

11

R увеличивается каждый раз по нажатию кнопки. кнопка замыкает порт на землю (подаем лог.0 )

0

12

vyko написал(а):

А за счет чего тогда сделать таймер на 40 сек

Ну берёте waitms скажем на 1, далее просто считаете в переменной накопившееся значение. Если переменной разрядности будет не хватать, то считайте в двух циклах (первый до 1000 (до секунды), а второй в секундах уже (40).

0

13

vyko
пробуете в железе или протеусе?
попробуйте кнопку на PinB.1 пересадить

0

14

Пробую на железе, пересадил, тоже безрезультатно

0

15

вот так точно работает. в протеусе покатал.

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 8

Dim R As Byte
Dim T As Integer

Config Pinb.1 = Input
Config Portb.3 = Output

Config Int0 = Falling : On Int0 But : Enable Interrupts : Enable Int0

R = 0 : Portb.3 = 0 : T = 0
Do

If R = 1 Then
Portb.3 = 1
T = 0
End If

If R = 0 Or T > 4000 Then Portb.3 = 0
Waitms 100
Incr T
Loop
End

But:
If Pinb.1 = 0 Then
Waitms 10
   Incr R
End If
If R > 1 Then R = 0

GIFR = 64
Return

0

16

vyko написал(а):

Если использую wait - следующее нажатие возможно только по истечении задержки, пробовал прерывания - светодиод потухает, но следующее включение возможно опять после задержки

Если нет желания использовать таймер, то наилучший вариант - как предложил RDW - вести отсчет вложенными циклами.

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

По сути работы получится имитация аппаратного прерывания.

0

17

Waitms 10 в прерывании для какой цели? Если от дребезга то перенесите перед If Pinb.1 = 0 Then

0

18

туплю. кусок кода надо исправить как
If R = 0 Or T > 400 Then
Portb.3 = 0
R = 0
End If
и вместо Incr T написать Т=Т+1

0

19

место Incr T написать Т=Т+1 что изменится?

0

20

Incr считает до 255, на сколько я помню. итоговая программа с работающим таймером:

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 8
Dim R As Byte
Dim T As Integer

Config Pinb.1 = Input
Config Portb.3 = Output
Config Int0 = Falling : On Int0 But : Enable Interrupts : Enable Int0
R = 0 : Portb.3 = 0 : T = 0
Do
If R = 1 Then
Portb.3 = 1
T = T + 1
End If

If R = 0 Or T > 40 Then
Portb.3 = 0
R = 0 : T = 0
End If
Waitms 100
Loop
End

But:
If Pinb.1 = 0 Then
Waitms 10
   Incr R
End If
If R > 1 Then R = 0
GIFR = 64
Return

играйтесь параметрами задержки

0

21

IDok написал(а):

и вместо Incr T написать Т=Т+1


Последний вариант работает, но без таймера, а последнюю поправку баском не переваривает

0

22

vyko написал(а):

Последний вариант работает, но без таймера

да. там косячок был

vyko написал(а):

а последнюю поправку баском не переваривает

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

0

23

IDok написал(а):

да. там косячок был

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


Variable not dimensioned [T]

0

24

vyko
тип переменной Т - integer , проверьте у себя.

0

25

С 20 поста код работает нормально! Спасибо всем огромное!  IDok особенно!

Отредактировано vyko (2017-10-17 15:16:17)

0

26

vyko
гы, вам спасибо, за терпение  :crazyfun:  я чот сам затупил на ровном месте

0

27

Прошу еще помощи с другим вариантом, вариант с оной кнопкой, долгим нажатием вкл - выключаю один порт, как добавить вызов отдельных 3 х подпрограмм короткими нажатиями для управления другим портом

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

dim a as Byte
config PORTB.3=OUTPUT
led alias portb.3

config portB.4 =OUTPUT
pwr alias portB.4

config INT0 = Falling
On Int0 Zapusk:

enable int0
enable interrupts

Portb.3 = 0

zapusk:

do
incr a
waitms 1

if a=255 then
toggle pwr

goto ext
end if

loop until pinB.1=1

ext:
a=0
waitms 100

Gifr = 64

return

0

28

Button:
If PINB.2 = 0 Then
   T=0           ' нажатие кнопки 1  +
  For B = 0 To 200
    Incr T
      If T > 110 Then R=10           ' долгое удержание кнопки 1
    If PINB.2 = 1 Then Exit For       ' Выходим из цикла подсчета времени удержания кнопки
     Waitms 10
  Next

   If T < 111 Then
      Incr R
      If R>1 then R=0       ' Если короткое нажатие кнопки 1
   End If
End If
GIFR = 64
Return

ставьте R сколько надо вариантов и в главном цикле проверяйте условие
вообще вот здесь: RGB-ночник у меня как раз одна кнопка, 4 порта и три варианта работы

0

29

и у вас программа как-то не до конца оформлена. порт на вход не настроен, переменные не описаны...

0

30

Да, не то скопировал

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » attiny13 управление одной кнопкой с таймером