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

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

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

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


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


Прошу помощи в управлении портом одной кнопкой.

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

1

Приветствую всех. Осваиваю микроконтроллеры AVR и Bascom-avr, возможно вопрос задал некорректно но все таки прошу помощи.

Решил начать с простого, написать программку управления освещением в комнате. Набросал тестовый текст управления одним портом контроллера:

Код:
 onfig Portb.1 = Output                                     ' настраиваем на выход порт b пин 1
Config Pind.7 = Input                                                ' настраиваем на вход порт d пин 7
Config Pind.6 = Input                                                ' настраиваем на вход порт d пин 6
1:                                                                            ' маркируем
Do                                                                           ' начинаем
Debounce Pind.7 , 0 , En                                            ' если на пин 7 появился 0 переходим на En
Debounce Pind.6 , 0 , Di                                             ' если на пин 6 появился 0 переходим на Di
Loop

En:
Set Portb.1                                                               ' подаем 1 на порт b 1пин
Goto 1

Di:
Reset Portb.1                                                            ' подаем 0 на порт b 1пин
Goto 1

End

в этой программке используется 3 порта один пин на вывод и два пина на ввод( используется две кнопочки одна для включения (1 на порт подается) и выключения (0 на порт)), что нерационально хотелось бы обойтись двумя те один пин на вывод и один пин на ввод те использовать его как вкл (подаем 1 на порт) и выкл (подаем 0 на порт).

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

Подскажите как лучше написать, или ссылочку дайте пожалуйста.

Евгений

0

2

Код:
$regfile = "m16def.dat"                                     'определяем контроллер
$crystal = 8000000                                          'внутренний генератор

Config Debounce = 10                                        'время задержки в мс
Config Pina.1 = Input                                       'настройка пина а1 на вход
Config Pina.2 = Output                                      'настройка пина а2 на выход
Set Porta.1                                                 'включить внутренний подтягивающий резистор
Reset Porta.2                                               'сбросить порт
Vv Alias Pina.1                                             'присваиваем порту имя Vv

1:                                                          'метка

Do                                                          'основной цикл программы

If Vv = 0 Then                                              'если нажали кнопку, то
Gosub Led_on                                                'идти на Led_on
End If

Loop                                                        'конец основного цикла
End                                                         'конец программы

Led_on:
Do
Set Porta.2
Goto Perehod
Loop

Perehod:
Do
Debounce Vv , 0 , Led_off
Loop

Led_off:
Do
Reset Porta.2
Goto 1
Loop

0

3

max
Спасибо за ответ. Но приведенный вами текст программы не работает... после нажатия на кнопку на порту появляется 1 и при повторном нажатии не пропадает.

0

4

Сейчас немного подумал и подправил, получился следующий текст.

Код:
 Config Debounce = 10                                        'время задержки в мс
Config Pind.7 = Input                                       'настройка пина d7 на вход
Config Pinb.1 = Output                                      'настройка пина b1 на выход

Reset Portb.1                                               'сбросить порт
Vv Alias Pind.7                                             'присваиваем порту имя Vv

1:                                                          'метка

Do                                                          'основной цикл программы

Debounce Vv , 0 , Led_on                                    'если нажали кнопку, то идти на Led_on


Loop                                                        'конец основного цикла


Led_on:
Do                                                          'подпрограмма включения
Set Portb.1
Goto 2
Loop

2:                                                          'ждем второго нажатия
Do
Debounce Vv , 0 , Led_off
Loop

Led_off:                                                    'подпрограмма выключения
Do
Reset Portb.1
Goto 1
Loop

End                                                         'конец программы

Подтягивающие резисторы у меня внешние :)

Отредактировано rv9c (2010-01-31 18:38:08)

0

5

А вот еще короче

Код:
Config Portb.1 = Output :  Set Portd.7   '  конфигурируем порт В1 на выход, D7 на вход и включаем внутренний подтягивающий резистор на порт D7
  Do
    Debounce Pind.7 , 0 , En , Sub
  Loop
En:
Toggle Portb.1  
Return

еще вариант

Код:
Config Portb.1 = Output : Config Pind.7 = Input : Set Portd.7  '  конфигурируем порт В1 на выход и включаем внутренний подтягивающий резистор на порт D7
  Do
       Bitwait Pind.7 , reset  ' ждем пока на пине не появится 0 (ждем нажатия)
       Toggle Portb.1           ' инвертируем состояние порта
       Bitwait Pind.7 , set     ' ждем пока на пине не появится 1 (ждем отпускания)
  Loop

Из справки Bascom
'(
With TOGGLE you can simply invert the output state of a port pin.

When the pin is driving a relays for example and the relays is OFF, one TOGGLE statement will turn the relays ON. Another TOGGLE will turn the relays OFF again.
)'

Отредактировано Pasha (2010-02-01 03:45:49)

0

6

Pasha
cпасибо!

0

7

Сейчас пробую добавить управление с помощью rc5 (пульт от телевизора) написал простой текст

Код:
 Config Rc5 = Pind.0
Config Portb = Output

Enable Interrupts
Dim Address As Byte , Command As Byte


Do

Getrc5(address , Command)

Cls
Cursor Off
Lcd Address ; "  " ; Command

If Address = 0 Then
Command = Command And &B01111111


   If Command = 32 Then
   Set Portb.1
   End If



   If Command = 33 Then
   Reset Portb.1
   End If


End If


Loop

End

С этой программкой все работает попутно на lcd выдает адрес и команду передаваемую пультом.

и опять таки столкнулся столкнулся с трудностью сделать управление при помощи одной кнопки те нажал горит еще раз нажал потух...

пробовал скомпоновать

Код:
 

Bitwait Pind.7 , reset  ' ждем пока на пине не появится 0 (ждем нажатия)
Toggle Portb.1           ' инвертируем состояние порта
Bitwait Pind.7 , set     ' ждем пока на пине не появится 1 (ждем отпускания)

создав переменную

Код:
 Dim Onoff As Byte

ну и прописав ее вместо

Код:
 Pind.7

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

На форуме посмотрел, в справке посмотрел и не нашел решения... Пожалуйста подскажите.

Отредактировано rv9c (2010-02-01 08:42:23)

0

8

Dim Onoff as bit

do
............
Onoff = 1
............
if Onoff = 1 then
Toggle Portb.1
Onoff = 0
waitms 100
end if
............

loop

0

9

Вот тебе рабочая прога для тани2313.
При первом включении на всех портах 1.

Код:
$regfile = "ATtiny2313.DAT"
$crystal = 8000000

Enable Interrupts

Config Rc5 = Pind.0

Config Pinb.1 = Output
Relay1 Alias Portb.1

Config Pinb.2 = Output
Relay2 Alias Portb.2

Config Pinb.3 = Output
Relay3 Alias Portb.3

Config Pinb.4 = Output
Relay4 Alias Portb.4

Config Pinb.5 = Output
Relay5 Alias Portb.5

Config Pinb.6 = Output
Relay6 Alias Portb.6

Config Pinb.7 = Output
Relay7 Alias Portb.7

Config Pind.1 = Input
Relay1_on_off Alias Pind.1
Set Portd.1

Config Pind.2 = Input
Relay2_on_off Alias Pind.2
Set Portd.2

Config Pind.3 = Input
Relay3_on_off Alias Pind.3
Set Portd.3

Config Pind.4 = Input
Relay4_on_off Alias Pind.4
Set Portd.4

Config Pind.5 = Input
Relay5_on_off Alias Pind.5
Set Portd.5

Config Pind.6 = Input
Relay6_on_off Alias Pind.6
Set Portd.6

Config Pinb.0 = Input
Relay7_on_off Alias Pinb.0
Set Portb.0

Dim Address As Byte
Dim Command As Byte
Dim Status_relay_on_off(7) As Byte

Readeeprom Status_relay_on_off(1) , 1
If Status_relay_on_off(1) = 0 Then
Set Relay1
End If
Readeeprom Status_relay_on_off(2) , 2
If Status_relay_on_off(2) = 0 Then
Set Relay2
End If
Readeeprom Status_relay_on_off(3) , 3
If Status_relay_on_off(3) = 0 Then
Set Relay3
End If
Readeeprom Status_relay_on_off(4) , 4
If Status_relay_on_off(4) = 0 Then
Set Relay4
End If
Readeeprom Status_relay_on_off(5) , 5
If Status_relay_on_off(5) = 0 Then
Set Relay5
End If
Readeeprom Status_relay_on_off(6) , 6
If Status_relay_on_off(6) = 0 Then
Set Relay6
End If
Readeeprom Status_relay_on_off(7) , 7
If Status_relay_on_off(7) = 0 Then
Set Relay7
End If

Do

Getrc5(address , Command)
If Address = 0 Then
Command = Command And &B01111111
End If

If Relay1_on_off = 0 Or Command = 12 Then
Waitms 200
Toggle Relay1
Toggle Status_relay_on_off(1)
Writeeeprom Status_relay_on_off(1) , 1
End If

If Relay2_on_off = 0 Or Command = 16 Then
Waitms 200
Toggle Relay2
Toggle Status_relay_on_off(2)
Writeeeprom Status_relay_on_off(2) , 2
End If

If Relay3_on_off = 0 Or Command = 17 Then
Waitms 200
Toggle Relay3
Toggle Status_relay_on_off(3)
Writeeeprom Status_relay_on_off(3) , 3
End If

If Relay4_on_off = 0 Or Command = 13 Then
Waitms 200
Toggle Relay4
Toggle Status_relay_on_off(4)
Writeeeprom Status_relay_on_off(4) , 4
End If

If Relay5_on_off = 0 Or Command = 32 Then
Waitms 200
Toggle Relay5
Toggle Status_relay_on_off(5)
Writeeeprom Status_relay_on_off(5) , 5
End If

If Relay6_on_off = 0 Or Command = 33 Then
Waitms 200
Toggle Relay6
Toggle Status_relay_on_off(6)
Writeeeprom Status_relay_on_off(6) , 6
End If

If Relay7_on_off = 0 Or Command = 38 Then
Waitms 200
Toggle Relay7
Toggle Status_relay_on_off(7)
Writeeeprom Status_relay_on_off(7) , 7
End If

Loop

End

Описание кнопок:

tv - включить/выключить 1канал(вывод 13)
vol+  - включить/выключить 2канал(вывод 14)
vol-  - включить/выключить 3канал(вывод 15)
mute - включить/выключить 4канал(вывод 16)
ch+ - включить/выключить 5канал(вывод 17)
ch- - включить/выключить 6канал(вывод 18)
sleep - включить/выключить 7канал(вывод 19)

Все установки сохраняются в EEPROM.

Отредактировано max (2010-02-01 16:48:55)

0

10

Выложи схему подключения ИК датчика. Охота разобраться. А то есть в планах собрать девайс, но пока еще дела с ик не имел

0

11

Pasha
схемка типовая в качестве приемника tsop1736 ее сигнальный выход приткнул к первому попавшемуся порту атмеги16 :)

в icq подробнее расскажу, мой номер 499-809-954

0

12

Вот тебе схема:

увеличить

Отредактировано max (2010-02-02 20:37:08)

0

13

Спасибо. Разобрался. Оказался просто глючный приемник

0

14

Если подержать кнопку пульта дольше вемени задержки Wait, то программа будет реагировать как на повторное нажатие ( :crazy: мало ли у кого какие пальцы кривые, могут и минуту нажимать на кнопку) :idea: можно без оператора Wait осуществить однократное выполнение команды до следующего нажатия кнопки пульта. Ввести флаг нажатия (удержания кнопки).

Код:
Command1 = 5                                                     'Команда управления нагрузкой
Do
   Command_save = Command                              'Запоминаем предыдущую принятую команду
   Getrc5(address , Command)
   Command = Command And &B01111111             'Сразу наложить маску
   If Command_save = Command Then : Reset Push_flag : Else : Set Push_flag : End If   'Собственно флаг нажатия. Если равны, значит удержание кнопки. Если нет - кнопка отпущена.
  If Command1 = Command And Nagr_flag = 0 And Push_flag = 1 Then
      Set Nagr_flag
      Set Nagruzka
   Elseif Command1 = Command And Nagr_flag = 1 And Push_flag = 1 Then
      Reset Nagr_flag
      Reset Nagruzka
   End If
Loop

Отредактировано MACTEPok (2010-11-26 22:11:18)

0

15

Здравствуйте форумчане, подскажите, в Bascome есть стандарт написания кода, или если прога работает значит код правильный:
Do                                                         
Set Portb.1
Waitms 200   
Reset Portb.1 
Waitms 200   
Loop
но можна и так написать
Do                                                         
Portb.1= 1
Waitms 200
Portb.1 = 0
Waitms 200   
Loop
как надо???

0

16

Можно так и так.
Результат будет одинаковым.

0

17

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

в Bascome есть стандарт написания кода, или если прога работает значит код правильный

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

Do                                                         
toggle PORTB.1 : Waitms 200   
Loop

Делает то же самое

0

18

используйте аппаратный ШИМ (PWM)
поищите, я недавно спрашивал - у меня через него генерируется

0

19

Спасибо что ответили, вроде разобрался, нужно знать синтаксис языка.

0

20

Добрый вечер, у меня еще один вопрос вот код:
$regfile = "m8515.dat"                                     
$crystal = 8000000                                          '

Leds Alias Porta                                         
Config Porta = Output                                     

Do
Leds = &HFF                                             
Wait 1                                                   
Leds = 00                                               
Wait 1                                                   
Loop
                                                       
End
вопрос - от куда берется это значение &HFF ???

0

21

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

от куда берется это значение &HFF

Это число 255, записанное в шестнадцатеричном виде.
В двоичном оно будет таким &B11111111.

0

22

Доброй ночи, форумчане!
А как можно одним нажатием циклически перебирать порты?
Например, нажатием на кнопку PIND.1 циклически меняется состояние на выходах PORTB.0 , PORTB.1, PORTB.2 и т.д.
А лучше, нажатием на кнопку происходит ссылка на метку, goto, gosub, case.
Никто не набросает примерчик?

Отредактировано ma35tr0 (2011-08-21 01:24:53)

0

23

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

Доброй ночи, форумчане!А как можно одним нажатием циклически перебирать порты?

есть функции rotate, shift(right, left)

0


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