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

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

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

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


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


управление одной кнопкой

Сообщений 61 страница 85 из 85

61

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

Вариант да,не работает

Архив у Вас на mail

Программный ШИМ для RGB, Attiny13A

Исходник

$regfile = "attiny13a.dat"
  $crystal = 9600000
  $framesize = 0
  $hwstack = 0
  $swstack = 0

'Режимы считывания: Single - единичное считывание, результаты заносятся в ADCL, ADCH; Free – постоянное считывание, результаты заносятся в ADCL, ADCH, но происходит всё автономно
'  Config Adc = Single , Prescaler = Auto , Reference = Avcc       ' Prescaler может быть 2,4,8,16,32,64,128 или Auto, в случае Auto компилятор выбирает подходящую частоту работы АЦП.
  Config Adc = Free , Prescaler = Auto , Reference = Avcc       ' Источник опорного напряжения Reference может быть: Aref – внешний источник, Avcc – напряжение питания схемы и Internal – внутренний
  On Adc Обработка_прерывания_ацп Nosave
  Admux.mux0 = 0       ' Используем ADC2
  Admux.mux1 = 1       ' Используем ADC2
  Admux.adlar = 1       ' Берём 8 бит из 10, считываем только ADCH

  Config Timer0 = Timer , Prescale = 1 , Clear Timer = 0       '1|8|64|256|1024
  On Timer0 Цветная_подсветка

  Led_синий Alias Portb.0 : Config Led_синий = Output : Set Led_синий
  Led_зеленый Alias Portb.2 : Config Led_зеленый = Output : Set Led_зеленый
  Led_красный Alias Portb.3 : Config Led_красный = Output : Set Led_красный

  Dim Синий As Byte
  Dim Красный As Byte
  Dim Зеленый As Byte
  Dim Яркость As Byte
  Dim Переход_цвета As Byte
  Dim Задержка_изменения_цвета As Byte : Задержка_изменения_цвета = 5
  Dim Шим_для_цветной_подсветки As Byte

'------------  Разрешаем работу необходимых прерываний  ------------------------
  Enable Adc : Start Adc       ' Разрешаем работу АЦП
  Enable Timer0
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
  Idle       ' Ждём первого замера АЦП
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

    On Переход_цвета Goto Переход_цвета_0 , Переход_цвета_1 , Переход_цвета_2 , _
                          Переход_цвета_3 , Переход_цвета_4 , Переход_цвета_5 , Переход_цвета_6

    Переход_цвета_0:
      Incr Синий
      If Синий = Яркость Then Переход_цвета = 1
      Goto Выход_переход_цвета
    Переход_цвета_1:
      Incr Зеленый
      If Зеленый = Яркость Then Переход_цвета = 2
      Goto Выход_переход_цвета
    Переход_цвета_2:
      Decr Синий
      If Синий = 0 Then Переход_цвета = 3
      Goto Выход_переход_цвета
    Переход_цвета_3:
      Incr Красный
      If Красный = Яркость Then Переход_цвета = 4
      Goto Выход_переход_цвета
    Переход_цвета_4:
      Decr Зеленый
      If Зеленый = 0 Then Переход_цвета = 5
      Goto Выход_переход_цвета
    Переход_цвета_5:
      Incr Синий
      If Синий = Яркость Then Переход_цвета = 6
      Goto Выход_переход_цвета
    Переход_цвета_6:
      Decr Красный
      If Красный = 0 Then Переход_цвета = 1
      Goto Выход_переход_цвета
    Выход_переход_цвета:

    Waitms Задержка_изменения_цвета

'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
  Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------
    !push R16
    !in R16 , adch
    !sts {Яркость} , R16
    !pop R16
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Цветная_подсветка:
'-------------------------------------------------------------------------------
    Incr Шим_для_цветной_подсветки

    If Шим_для_цветной_подсветки < Красный Then
        Set Led_красный
      Else
        Reset Led_красный
    End If       ' If Шим_для_цветной_подсветки < Красный Then

    If Шим_для_цветной_подсветки < Зеленый Then
        Set Led_зеленый
      Else
        Reset Led_зеленый
    End If       ' If Шим_для_цветной_подсветки < Зеленый Then

    If Шим_для_цветной_подсветки < Синий Then
        Set Led_синий
      Else
        Reset Led_синий
    End If       ' If Шим_для_цветной_подсветки < Синий Then
'-------------------------------------------------------------------------------
  Return
'===============================================================================

Отредактировано sasha_1973 (2014-12-24 21:33:21)

+1

62

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

+1

63

Если правильно понимаю, это не весь код, судя по Label1, Label2 и т.д. Так же не совсем понял, почему всегда выполняется только GetADC. До main_program-то не доходит.

Этот код занимает 26%, а не 32%, как в "исходнике". Ну и может переключает цвета не в той последовательности, что было задумано.

Код
Код:
    $regfile = "attiny24.dat"
    $crystal = 4000000
    $hwstack = 32
    $swstack = 8
    $framesize = 16

    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc

    Config Timer1 = Pwm , Pwm = 8 , Compare B Pwm = Clear Up , Prescale = 8
    Enable Timer1
    Config Porta.5 = Output
    Config Porta.0 = Output
    Config Porta.1 = Output
    Config Porta.2 = Output
    Config Portb.2 = Input

    Config Int0 = Falling
    On Int0 Button
    Enable Int0
    Enable Interrupts

    Dim M As Byte
    M = 1

Main_program:
    Pwm1b = Getadc(7) / 4
    Waitms 10

    Porta.0 = M.0
    Porta.1 = M.1
    Porta.2 = M.2
    Goto Main_program
End


Button:
   Incr M
   If M > 7 Then M = 1
Return

Отредактировано SIvan (2014-12-25 21:02:44)

0

64

Во,прям как надо!
Только регулировка яркости (PA5 выход) перестала работать.
Подскажите как цвета меняются,чего то не совсем понятно?
Я так понял,М.0 - только включили - красный светодиод
                   М.1- первое нажатие - зелёный светодиод
                   М.2-второе нажатие - синий светодиод,правильно? Если так,то как здесь выглядят остальные нажатия кнопки?

Отредактировано SimBB (2014-12-26 18:05:27)

0

65

Регулировку яркости не трогал. Разберитесь с соответствием схемы и кода. В схеме к резистору подключен ADC(6), а в коде вы смотрите на ADC(7). Не проверял, но считаю, что pwm1b = getadc - это неправильно. Я бы сделал переменная = getadc, pwm1b = переменная.
По переключению цветов. В вашем коде перебираются те же самые комбинации, только в другом порядке. Я их поменял, чтобы сократить программу. М.1, М.2 и т.д. - это биты 1, 2 и т.д. переменной М. Разложите ваши значения М = 1...7 в двоичный код, и всё увидите. Можно это сделать в расширенном режиме windows-калькулятора.
Ну и перенёс метку Main_program выше, над управлением PWM, так как выставление PWM в вашем коде происходило только один раз. При старте контроллера.

0

66

Получается есть три бита,то есть в двоичной системе получится трёх битовый код
М1=001 (red),
М2=010 (green),
М3=011 (red+green),
М4=100 (blue),
М5=101 (blue+red),
М6=110 (blue+green),
М7=111 (red+green+blue).
Если М>7,значит цвета перебираются сначала. Так?
А со схемой да,немного напутал в торопях,прошу прощения.
Насчёт  pwm1b = getadc :  переменную можно обозвать как угодно,да?
Например: Dim A As Bit
                 A = getadc
                 pwm1b = A. Так?

0

67

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

Если М>7,значит цвета перебираются сначала. Так?

В вашем коде так и сделано.

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

переменную можно обозвать как угодно,да?

В разумных для BASCOM-а пределах.

0

68

А переключение режимов происходит
Dim M As Byte
    M = 1,
то есть 1 это шаг?
Правильно?

0

69

М=1 - это начальное состояние, при старте контроллера.

0

70

SIvan,спасибо большое за помощь и толковое разъяснение.

0

71

Доброго времени суток. Прошу помощи у знающих людей. Есть у меня меню, переключающееся одной кнопкой по кругу. (спасибо этому форуму) Хочу организовать задержку, если в каком либо из подпунктов, не было действий,то в течении 3 сек. был бы переход на основной "экран". Уж совсем запутался. Простите новичка. Заранее спасибо за ответ.
P.S. Если нужен код или блок-схема меню - выложу. Спасибо.

0

72

Не зная алгоритма работы вашего кода/меню, посоветовать что-то - не реально. Телепатов нет. :)

0

73

Включите таймер, и считайте. При нажатии кнопки, сбрасывайте на 0. В каждом меню(подменю), от куда хотите выйти на главный экран, пишите if taimer > 10000 then goto главный экран.
Т.е. таймер постоянно считает, и при значении превысившим нужное время выходим в главное меню. При нажатии кнопки  он сбрасывается и считает с начала.

+1

74

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

Не зная алгоритма работы вашего кода/меню, посоветовать что-то - не реально. Телепатов нет.

Это понятно.  :)  Вот код.
===========================
On Int0 Knopka

Dim A As Byte
A = 1

Cursor Off
Cls

Do

Select Case A
   Case 1 : Gosub 1
   Case 2 : Gosub 2
   Case 3 : Gosub 3
   Case 4 : Gosub 4
End Select

Waitms 100

Loop

Knopka:
   If A = 1 Or A = 2 Or A = 3 Or A = 4 Then
   Incr A
   End If

   If A > 4 Then
   A = 1
   End If
Return

End

1:
Cls
   Lcd "MAIN SCREEN"
Return

2:
Cls
   Lcd "menu 1"
Return

3:
Cls
   Lcd "menu 2"
Return

4:
Cls
   Lcd "menu 3"
Return
===================
Посоветуйте, пожалуйста.

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

Включите таймер, и считайте. При нажатии кнопки, сбрасывайте на 0. В каждом меню(подменю), от куда хотите выйти на главный экран, пишите if taimer > 10000 then goto главный экран.
Т.е. таймер постоянно считает, и при значении превысившим нужное время выходим в главное меню. При нажатии кнопки  он сбрасывается и считает с начала.

Спасибо за подсказку. Но назрел ещё один дурацкий вопрос - как сбросить таймер? В хелпе из Баскома ничего похожего не встретил. Какой командой он вообще сбрасывается?

Отредактировано sevastopolets (2015-03-01 17:25:14)

0

75

Всем спасибо. Полдня "мучений" и разобрался сам.  :D

0

76

Либо в Do/Loop ставите счетчик по которому обнуляете меню (с сбросом его, если кнопки трогали) или как сказали ранее, по таймеру (если свободный есть).

0

77

Так, на секундочку-

Код:
Knopka:
   If A = 1 Or A = 2 Or A = 3 Or A = 4 Then ' в этом есть какой-то смысл?
   Incr A
   End If
   If A > 4 Then
   A = 1
   End If
Return
Код:
Select Case A
   Case 1 : Gosub 1
   Case 2 : Gosub 2
   Case 3 : Gosub 3
   Case 4 : Gosub 4
End Select

отлично заменяется командой

Код:
on A gosub 1,2,3,4

В хелпе смотрим ON VALUE

Отредактировано kip (2015-03-02 14:43:47)

+1

78

Согласен, глуповато выглядит:
If A = 1 Or A = 2 Or A = 3 Or A = 4 Then

Переделал вот так:
If A >= 1 Then

Теперь смысл появился?  :rolleyes:
ON VALUE попробую. Спасибо большое. Я вот человек такой - главное направить, а дальше сам.

0

79

Просто не могу понять, зачем вообще проверять условие?

Код:
Knopka:
   Incr A
   If A > 4 Then  A = 1
Return

Так, по моему, тоже работать будет!  "А" и так ни когда не выйдет за пределы 1-4.

+1

80

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

Просто не могу понять, зачем вообще проверять условие?

В коде написано - если А больше 4, то возвращаемся на значение 1
Какая здесь проверка и чего? Обычное условие. Может я "не догоняю"?  :rolleyes:  Новичёк же.
Спасибо вам же, уважаемый kip я привёл своё меню в порядок. Всё работает, благодаря вашей подсказке.
Кстати,

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

то что отлично заменяется командой - on A gosub 1,2,3,4

не заработало  :(
Баскомовский хелп перечитал, код поправил, но не работает... Жаль.  :'(
И почему это А не выйдет за пределы 1-4? Может объясните? Я вот например, думал и думаю, что если тупо инкрементировать переменную, допустим Byte (в моём случае), то переменная будет увеличиваться на единицу по кругу 0-255, если не "обозначить" определённые действия с переменной. Как-то так я это вижу.  :rolleyes:

Отредактировано sevastopolets (2015-03-03 23:50:02)

0

81

Ну так после увеличения А у Вас сразу условие(If A > 4 Then  A = 1), которое сделает его тут-же 1. Проследите логику, и скажите когда А у Вас станет ровно, к примеру, 6? Видимо никогда. Т.е. эта строчка (If A = 1 Or A = 2 Or A = 3 Or A = 4 Then) не имеет смысла, поскольку вот эта (If A > 4 Then  A = 1).не даст А выйти за пределы 4.

Код:
on A gosub 1,2,3,4
Rem Note That The Starting Value Begins With 0

Да, она начинает считать с нуля. Т.е. 1,2,3,4 это не номера а имена. Короче, либо а должно быть с 0, либо написать так A gosub defolt,1,2,3,4
и добавить

Код:
defolt:
return

0

82

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

Ну так после увеличения А у Вас сразу условие(If A > 4 Then  A = 1), которое сделает его тут-же 1. Проследите логику, и скажите когда А у Вас станет ровно, к примеру, 6? Видимо никогда. Т.е. эта строчка (If A = 1 Or A = 2 Or A = 3 Or A = 4 Then) не имеет смысла, поскольку вот эта (If A > 4 Then  A = 1).не даст А выйти за пределы 4.


Всё правильно. "Видимо никогда" мне и не надо, чтобы А было равно или было больше 6.
Логика понятна?

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

эта строчка (If A = 1 Or A = 2 Or A = 3 Or A = 4 Then) не имеет смысла.


И опять всё правильно. Она потеряла смысл, когда я изменил код на вот эту строчку:
If A >= 1 Then
   Incr A

Всё работает. Спасибо. Ну не надо мне, чтобы она выходила за эти пределы. 

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

Да, она начинает считать с нуля. Т.е. 1,2,3,4 это не номера а имена. Короче, либо а должно быть с 0, либо написать так A gosub defolt,1,2,3,4
и добавить


Я же писал, что хелп перечитал, код поправил - ну не работает оно почему-то. Может знаний у меня пока маловато, может ещё почему. Да и вообще, зачем мусолить тему, если давным давно всё работает? Ну и х... с ним, что у меня может быть код не такой, как бы Вам хотелось. Научусь.  :) А то выходит так, что попросил помощи и направить в нужное русло, а вместо этого теперь у меня появился "дотошный препод". :D Будут у меня конкретные вопросы - задам. А если нет - значит, нет.

И уж если решились быть "дотошным преподом"  :D, то как Вы объясните вот это?

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

после увеличения А у Вас сразу условие(If A > 4 Then  A = 1)

Условие наступает не сразу после увеличения А, а при достижении определённого значения. И если значение больше n, то А=1. Я опять не прав?

Отредактировано sevastopolets (2015-03-05 23:34:12)

0

83

Я разве написал "наступает условие"?
Ну работает, и славно.

0

84

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

А то выходит так, что попросил помощи и направить в нужное русло, а вместо этого теперь у меня появился "дотошный препод".

Да уж, помогаешь - плохо, не помогаешь - плохо!

И где золотая середина.

0

85

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

Да уж, помогаешь - плохо, не помогаешь - плохо!

Это провокация!!  :D Кроме Вас, слово плохо, никто не употреблял.  :playful:

0


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