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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Attiny 2313 переключение режимов кнопкой


Attiny 2313 переключение режимов кнопкой

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

1

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

Код:
$regfile = "2313def.dat"
$crystal = 1000000

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

Do
Portb.2 = 0
Portb.3 = 0

Do
Waitms 50
Loop Until Pind.2 = 0
Do
Waitms 50
Loop Until Pind.2 = 1

Do
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 2000
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 2000

Loop

Do
Waitms 50
Loop Until Pind.2 = 0
Do
Waitms 50
Loop Until Pind.2 = 1

Do
Portb.2 = 1
Portb.3 = 0
Waitms 1000
Portb.2 = 0
Portb.3 = 0
Waitms 2000
Portb.3 = 1
Portb.2 = 0
Waitms 1000
Portb.3 = 0
Portb.2 = 0
Waitms 2000

Loop

Do
Loop Until Pinb.0 = 0
Do
Waitms 50
Loop Until Pinb.0 = 1

Loop


End

0

2

пользуйтесь командой debounce

0

3

есть возможность пример набросать да данном коде

0

4

Код:
Do
Waitms 50
debounce Pind.2 = 0
Do
Waitms 50
debounce Pind.2 = 1

вот так?

0

5

В первом Вашем посте ахинея полная..
Вообще вариаций кода много..
как вариант вот,  можно хоть 10 режимов вставить

Код:
Dim Speed As Word
Dim Time_on As Word
Dim Regim As Byte

Config Debounce = 30

Regim = 0
Portb.2 = 0
Portb.3 = 0

Do
 Debounce Pind.0 , 1 , Regim

 If Regim > 0 Then
   Portb.2 = 1 ; Portb.3 = 0
   Waitms Time_on
   Portb.2 = 0 ; Portb.3 = 0
   Waitms Speed
   Portb.3 = 1 ; Portb.2 = 0
   Waitms Time_on
   Portb.3 = 0 ; Portb.2 = 0
   Waitms Speed
 End If
Loop


Regim:
  Incr Regim
  If Regim > 2 Then Regim = 0
  Select Case Regim
   Case 1 : Speed = 2000
            Time_on = 100
   Case 2 : Speed = 2000
            Time_on = 1000
'  Case 3 : Speed = 100
'           Time_on = 50
  End Select
Return

Отредактировано Yuriy.pv (2016-05-23 23:04:50)

0

6

пишет Error : 369 Line: 34 Dublicate label name used by const or variable [REGIM]

Код:
$regfile = "2313def.dat"
$crystal = 1000000

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

Dim Speed As Word
Dim Time_on As Word
Dim Regim As Byte

Config Debounce = 30

Regim = 0
Portb.2 = 0
Portb.3 = 0

Do
 Debounce Pind.2 , 1 , Regim

 If Regim > 0 Then
   Portb.2 = 1
   Waitms Time_on
   Portb.2 = 0
   Waitms Speed
   Portb.3 = 1
   Waitms Time_on
   Portb.3 = 0
   Waitms Speed
 End If
Loop


Regim
  Incr Regim
  If Regim > 2 Then Regim = 0
  Select Case Regim
   Case 1 : Speed = 2000
            Time_on = 100
   Case 2 : Speed = 2000
            Time_on = 1000
   Case 3 : Speed = 100
            Time_on = 50
  End Select
Return

0

7

Измените в строке Debounce Pind.2 , 1 , Regim на Debounce Pind.2 , 1 , Regim_call
и, соответственно измените имя подпрограммы Regim на Regim_call

0

8

теперь выдает error 1 unknown statement [regim_call]

0

9

В начале подпрограммы,после имени regim_call нужно поставить двоеточие.
Вот так

Regim_call:
Incr Regim
  If Regim > 2 Then Regim = 0
  Select Case Regim
   Case 1 : Speed = 2000
            Time_on = 100
   Case 2 : Speed = 2000
            Time_on = 1000
   Case 3 : Speed = 100
            Time_on = 50
  End Select
Return

0

10

сделал так как было указанно, но режимы так и не переключает

0

11

Iosif, а камень какой?

0

12

Attiny 2313A

0

13

Код:
$regfile = "attiny2313a.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 32
$framesize = 32



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

Dim Speed As Word
Dim Time_on As Word
Dim Regim As Byte

Config Debounce = 30

Regim = 0
Portb.2 = 0
Portb.3 = 0

Do
 Debounce Pind.2 , 1 , Regim_sub, sub

 If Regim > 0 Then
   Portb.2 = 1
   Waitms Time_on
   Portb.2 = 0
   Waitms Speed
   Portb.3 = 1
   Waitms Time_on
   Portb.3 = 0
   Waitms Speed
 End If
Loop


Regim_sub:
  Incr Regim
  If Regim > 2 Then Regim = 0
  Select Case Regim
   Case 1 : Speed = 2000
            Time_on = 100
   Case 2 : Speed = 2000
            Time_on = 1000
   Case 3 : Speed = 100
            Time_on = 50
  End Select
Return

0

14

Код:
Debounce Pind.2 , 1 , Regim_sub, sub

Без последнего параметра МК не знает куда возвращаться из подпрограммы и сбрасывается.

0

15

внешний квац не использую

0

16

Лучше проверить фьюзы

0

17

http://s8.uploads.ru/t/bxUEs.jpg
вот фьюзы

Отредактировано Iosif (2016-05-24 14:46:28)

0

18

Заводские фьюзы. Камень работает от внутреннего генератора 4 МГц с делителем на 8 = 0,5 МГц

0

19

Код рабочий, единственно временные уставки будут не соответствовать заданным (по факту в 2 раза медленнее)

0

20

Мне видится это примерно так:

Код:
$regfile = "attiny2313a.dat"
$Crystal=4000000
$hwstack = 16
$swstack = 16
$framesize = 32

Dim Rej As Byte

Led Alias Portb.0 : Config Led = Output
Led1 Alias Portb.1 : Config Led1 = Output
Kn Alias Pinb.2
Pcmsk = &B00000100
On Pcint0 Flash
Enable Pcint0
Enable Interrupts

Rej = 1

Do

   If Rej > 2 Then Rej = 1

   If Rej = 1 Then Gosub Led_flash
   If Rej = 2 Then Gosub Led1_flash

Loop
End

Flash:
   If Kn = 0 Then
      Waitms 50
      Rej = Rej + 1
   End If
   Eifr = 32
Return

Led_flash:
   Set Led
   Waitms 200
   Reset Led
   Waitms 200
Return

Led1_flash:
   Set Led1
   Wait 2
   Reset Led1
   Wait 2
Return

0

21

Самый простой и понятный способ-

Код:
A1:
Do
 'делаем первое действие
Debounce Pind.2 , 1 , A2
Loop
A2:
Do
 'делаем второе действие
Debounce Pind.2 , 1 , A3
Loop
A3:
Do
 'делаем третье действие
Debounce Pind.2 , 1 , A1
Loop

Есть способ по компктней.

0

22

По алгоритмуSergik07

Код:
Do

Debounce Pind.2 , 1 , Flash
On Rej , Gosub , Led_flash , Led1_flash

Loop
End

Flash:
Incr Rej
If Rej > 1 Then Rej = 0
Return

Led_flash:
   Set Led
   Waitms 200
   Reset Led
   Waitms 200
Return

Led1_flash:
   Set Led1
   Wait 2
   Reset Led1
   Wait 2
Return

Если без прерывания.

0

23

спасибо за помощь!!!!!
сделал таким образом

Код:
$regfile = "attiny2313a.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 32
$framesize = 32



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

Dim Speed As Word
Dim Time_on As Word
Dim Regim As Byte

Config Debounce = 30

Regim = 0
Portb.2 = 0
Portb.3 = 0

A1:
Do
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 1000
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 1000
Debounce Pind.2 , 1 , A2
Loop
A2:
Do
Portb.2 = 1
Portb.3 = 0
Waitms 1000
Portb.2 = 0
Portb.3 = 0
Waitms 1000
Portb.2 = 1
Portb.3 = 0
Waitms 1000
Portb.2 = 0
Portb.3 = 0
Waitms 1000
Debounce Pind.2 , 1 , A3
Loop
A3:
Do
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 100
Debounce Pind.2 , 1 , A4
Loop
A4:
Do
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 1500
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 1500
Debounce Pind.2 , 1 , A5
Loop
A5:
Do
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100                                                  '
Portb.3 = 0
Portb.2 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 100
Debounce Pind.2 , 1 , A1
Loop

0

24

еще назрел вопрос один. подскажите как осуществить это действие постоянно, независимо от выбранного режима

Код:
$regfile = "attiny2313a.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 32
$framesize = 32



Config Pind.2 = Input
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.0 = Output
Config Portb.1 = Output



Dim Speed As Word
Dim Time_on As Word
Dim Regim As Byte

Config Debounce = 30

Regim = 0
Portb.2 = 0
Portb.3 = 0
????????????
Portb.0 = 1
Portb.1 = 0
Waitms 70
Portb.0 = 0
Portb.1 = 0
Waitms 70
Portb.0 = 1
Portb.1 = 0
Waitms 70
Portb.0 = 0
Portb.1 = 0
Waitms 1
Portb.0 = 0
Portb.1 = 1
Waitms 70
Portb.0 = 0
Portb.1 = 0
Waitms 70
Portb.0 = 0
Portb.1 = 1
Waitms 70
Portb.0 = 0
Portb.1 = 0
Waitms 150
???????????
A1:
Do
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 1000
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 1000
Debounce Pind.2 , 1 , A2
Loop
A2:
Do
Portb.2 = 1
Portb.3 = 0
Waitms 1000
Portb.2 = 0
Portb.3 = 0
Waitms 1000
Portb.3 = 1
Portb.2 = 0
Waitms 1000
Portb.3 = 0
Portb.2 = 0
Waitms 1000
Debounce Pind.2 , 1 , A3
Loop
A3:
Do
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 100
Debounce Pind.2 , 1 , A4
Loop
A4:
Do
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 1500
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 1500
Debounce Pind.2 , 1 , A5
Loop
A5:
Do
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.2 = 1
Portb.3 = 0
Waitms 100
Portb.2 = 0
Portb.3 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100                                                  '
Portb.3 = 0
Portb.2 = 0
Waitms 100
Portb.3 = 1
Portb.2 = 0
Waitms 100
Portb.3 = 0
Portb.2 = 0
Waitms 100
Debounce Pind.2 , 1 , A1
Loop

0

25

если ты имеешь ввиду два параллельных потока, то лучше таймер задействовать , или в главном цикле с городушками)

0

26

все верно, два параллельных потока, чтобы Portb.0 и Portb.1 не зависели от переключения режимов

0

27

Всё у вас как-то не так (по ламповому):

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

Далее можно гибко менять количество шагов нажатия или даже предусмотреть режимы удержания кнопки...

0

28

RDW, Вы не профессор в универе? :D 
Чесслово, они так объясняют.... :tired:  Предвижу следующий вопрос:

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

есть возможность пример набросать да данном коде

Iosif, Вариантов вообще куча.
Можно накладывать маску. Т.е. работать с переменной и  выполнять логическое действие "или".
Каждый раз задавая вопрос, ваш код может вырасти до таких размеров, что моргание лампочкой не влезет в Мегу128 o.O

Отредактировано kip (2016-05-28 14:39:50)

0

29

kip поддерживаю вышесказанное..

если вообще в тупую то можно так)

Код:
Dim Pos As Byte
Dim Pos_r As Byte
Dim Regim As Byte
Dim Timer_a As Word
Dim Timer_b As Word

Config Debounce = 30

Timer_a = 0
Timer_b = 0
Pos = 0
Pos_r = 0
Regim = 0
Portb.2 = 0
Portb.3 = 0

Do
 Debounce Pind.0 , 0 , Regim_set , Sub
 Gosub R_osn
 On Regim Gosub  R_1 , R_2 , R_3
Waitms 1
Incr Timer_a
Incr Timer_b
Loop


R_1:
If Timer_b = 1 And Pos_r = 0 Then
   Portb.2 = 1 : Portb.3 = 0 : Pos_r = 1 : Timer_b = 0
Elseif Timer_b = 100 And Pos_r = 1 Then
   Portb.2 = 0 : Portb.3 = 0 : Pos_r = 2 : Timer_b = 0
Elseif Timer_b = 1000 And Pos_r = 2 Then
   Portb.2 = 0 : Portb.3 = 1 : Pos_r = 3 : Timer_b = 0
Elseif Timer_b = 100 And Pos_r = 3 Then
   Portb.2 = 0 : Portb.3 = 0 : Pos_r = 4 : Timer_b = 0
Elseif Timer_b = 1000 And Pos_r = 4 Then
   Pos_r = 0 : Timer_b = 0
End If
Return


R_2:
If Timer_b = 1 And Pos_r = 0 Then
   Portb.2 = 1 : Portb.3 = 0 : Pos_r = 1 : Timer_b = 0
Elseif Timer_b = 1000 And Pos_r = 1 Then
   Portb.2 = 0 : Portb.3 = 0 : Pos_r = 2 : Timer_b = 0
Elseif Timer_b = 1000 And Pos_r = 2 Then
   Portb.2 = 1 : Portb.3 = 0 : Pos_r = 3 : Timer_b = 0
Elseif Timer_b = 1000 And Pos_r = 3 Then
   Portb.2 = 0 : Portb.3 = 0 : Pos_r = 4 : Timer_b = 0
Elseif Timer_b = 1000 And Pos_r = 4 Then
   Pos_r = 0 : Timer_b = 0
End If
Return


R_3:
If Timer_b = 1 And Pos_r = 0 Then
   Portb.2 = 1 ; Portb.3 = 0 ; Pos_r = 1 ; Timer_b = 0
Elseif Timer_b = 100 And Pos_r = 1 Then
   Portb.2 = 0 : Portb.3 = 0 : Pos_r = 2 : Timer_b = 0
Elseif Timer_b = 100 And Pos_r = 2 Then
   Portb.2 = 1 : Portb.3 = 0 : Pos_r = 3 : Timer_b = 0
Elseif Timer_b = 100 And Pos_r = 3 Then
   Portb.2 = 0 : Portb.3 = 0 : Pos_r = 4 : Timer_b = 0
Elseif Timer_b = 100 And Pos_r = 4 Then
   Portb.2 = 0 : Portb.3 = 1 : Pos_r = 5 : Timer_b = 0
Elseif Timer_b = 100 And Pos_r = 5 Then
   Portb.2 = 0 : Portb.3 = 0 : Pos_r = 6 : Timer_b = 0
Elseif Timer_b = 100 And Pos_r = 6 Then
   Portb.2 = 0 : Portb.3 = 1 : Pos_r = 7 : Timer_b = 0
Elseif Timer_b = 100 And Pos_r = 7 Then
   Portb.2 = 0 : Portb.3 = 0 : Pos_r = 8 : Timer_b = 0
Elseif Timer_b = 100 And Pos_r = 8 Then
   Pos_r = 0 : Timer_b = 0
End If
Return


R_osn:
If Timer_a = 150 And Pos = 0 Then
   Portb.0 = 1 : Portb.1 = 0 : Pos = 1 : Timer_a = 0
Elseif Timer_a = 70 And Pos = 1 Then
   Portb.0 = 0 : Portb.1 = 0 : Pos = 2 : Timer_a = 0
Elseif Timer_a = 70 And Pos = 2 Then
   Portb.0 = 1 : Portb.1 = 0 : Pos = 3 : Timer_a = 0
Elseif Timer_a = 70 And Pos = 3 Then
   Portb.0 = 0 : Portb.1 = 0 : Pos = 4 : Timer_a = 0
Elseif Timer_a = 1 And Pos = 4 Then
   Portb.0 = 0 : Portb.1 = 1 : Pos = 5 : Timer_a = 0
Elseif Timer_a = 70 And Pos = 5 Then
   Portb.0 = 0 : Portb.1 = 0 : Pos = 6 : Timer_a = 0
Elseif Timer_a = 70 And Pos = 6 Then
   Portb.0 = 0 : Portb.1 = 1 : Pos = 7 : Timer_a = 0
Elseif Timer_a = 70 And Pos = 7 Then
   Portb.0 = 0 : Portb.1 = 0 : Pos = 0 : Timer_a = 0
End If
Return


Regim_set:
  Incr Regim
  Timer_b = 0
  Pos_r = 0
  If Regim > 3 Then Regim = 0
Return


End

Отредактировано Yuriy.pv (2016-05-28 16:40:24)

0

30

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

RDW, Вы не профессор в универе? :D
Чесслово, они так объясняют....

Нет, я так мыслю. Не думаешь же, что я буду пытаться писать код под чужую задачу с безвестными хотелками на будущее. )

+1


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Attiny 2313 переключение режимов кнопкой