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

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

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

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


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


реализация бездействия

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

1

Доброго времени суток! нужна помощь по коду.

Код:
$regfile = "m16def.dat"
$crystal = 8000000

Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , Rs = Porta.2 , E = Porta.3
Config Lcd = 16 * 2
Cursor Off
Cls


Set Portc.4
Set Portc.5
Set Portc.6
Set Portc.7
Cn Alias Pinc.4                                             'ÊÍÎÏÊÀ ÊÓÐÑÎÐ ÂÍÈÇ
Cv Alias Pinc.5                                             'ÊÍÎÏÊÀ ÊÓÐÑÎÐ ÂÅÐÕ
Vv Alias Pinc.7                                             'ÊÍÎÏÊÀ ÂÂÎÄ
 M Alias Pinc.6                                             'ÊÍÎÏÊÀ ÌÅÍÞ



Dim Aa As Byte
Dim X1 As Byte


Cls

Do

Locate 1 , 1
Lcd "hello world"

  If M = 0 Then
  Gosub Menu
  End If

Loop
End


Declare Sub Getkey()
Declare Sub Menu()
Declare Sub Enterdatetime()

Sub Enterdatetime()
 Aa = 0
   X1 = 9
   Do
   If X1 > 50 Then X1 = 9
   If X1 < 9 Then X1 = 50
   Locate 1 , 1
   Lcd "[> Setup  <]"
   Locate 2 , 1
   Lcd "Set: " ; X1 ; "  "
   Getkey
   Loop Until Aa = 1
End Sub

Sub Getkey()
   Waitms 300
   If Cv = 0 Then Incr X1
   If Cn = 0 Then Decr X1
   If Vv = 0 Then
   Aa = 1
   Else
   Aa = 0
   End If
End Sub

Sub Menu()
Aa = 0
X1 = 0
Getkey
Enterdatetime
Cls
End Sub

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

0

2

Задача совсем непонятная?
Исключить или подключить кнопку ввод?
Зачем идти в подпрограмму, чтобы в ней сидеть 10 сек? Особенно это непонятно.
Может что и не догоняю, но если задача верно поставлена, то перед DO укажите метку, например main:, в подпрограмме wait 10 и goto main.
Locate 1 , 1 и Lcd "hello world" выносим перед DO, зачем выполнять одно и тоже постоянно. Вывели один раз и достаточно.
Вообщем нужно более подробное объяснение.

0

3

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

Код:
Do

If K_up_1 = 0 Then                                          'Если Нажата K_up
If Ust_temperature_1 < 100 Then                             'и если Temp меньше 999
Incr Ust_temperature_1
S(1) = "yc1="
S(1) = S(1) + Str(ust_temperature_1)                        'копируем в Dat_adc значение Temp для вывода на индикатор
Gosub Show_lcd                                              'Увеличиваем Temp
End If
End If

If K_dwn_1 = 0 Then                                         'Если Нажата K_up
If Ust_temperature_1 > 10 Then                              'и если Temp меньше 999
Decr Ust_temperature_1
S(1) = "yc1="
S(1) = S(1) + Str(ust_temperature_1)                        'копируем в Dat_adc значение Temp для вывода на индикатор
Gosub Show_lcd                                              'Увеличиваем Temp
End If
End If                                                      '
wdr

If K_up_1 = K_dwn_1 Then
Incr I
Else
I = 0
End If

Waitms 150
Loop Until I => Del_sawe_loop

Cls
If Ust_temperature_1 <> Ep_temperature_1 Then               'если были изменения в Temp
Lcd "coxpaЅЗЖ"                                              'То Выдаём Сообщение  'save'
Ep_temperature_1 = Ust_temperature_1                        'и сохраняем в еепром
Wait 1                                                      'Выдержим 1 Сек Для Сообщения
End If
wdr
I = 0
Upd_lcd = 1
Return

Отредактировано dimon-790 (2013-08-30 17:30:55)

0

4

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

немного подредактировал код, а то чет запутанный какойто

Код:
$regfile = "m16def.dat"
$crystal = 8000000

Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , Rs = Porta.2 , E = Porta.3
Config Lcd = 16 * 2
Cursor Off
Cls

Set Portc.4
Set Portc.5
Set Portc.6
Set Portc.7
Cn Alias Pinc.4                                             'ÊÍÎÏÊÀ ÊÓÐÑÎÐ ÂÍÈÇ
Cv Alias Pinc.5                                             'ÊÍÎÏÊÀ ÊÓÐÑÎÐ ÂÅÐÕ
Vv Alias Pinc.7                                             'ÊÍÎÏÊÀ ÂÂÎÄ
M Alias Pinc.6                                              'ÊÍÎÏÊÀ ÌÅÍÞ

Dim Aa As Byte
Dim X1 As Byte


Cls
Do

Locate 1 , 1
Lcd "hello world"

If M = 0 Then
Gosub Enterdatetime
End If

Loop
End



Declare Sub Enterdatetime()


Sub Enterdatetime()
 Aa = 0
   X1 = 9
   Do
   If X1 > 50 Then X1 = 9
   If X1 < 9 Then X1 = 50
   Locate 1 , 1
   Lcd "[> Setup  <]"
   Locate 2 , 1
   Lcd "Set: " ; X1 ; "  "
   Waitms 300
   If Cv = 0 Then Incr X1
   If Cn = 0 Then Decr X1
   If Vv = 0 Then
   Aa = 1
   Else
   Aa = 0
   End If
   Loop Until Aa = 1
   Cls
End Sub

я так думаю чтобы после запуска подпрограмы секунд через десять переменная Аа стала равной 1,а вот как это сделать чет я пока недоганяю

Отредактировано klimencovan (2013-08-30 19:17:05)

0

5

Но разбираться в чужом коде нет желания вот что скажу: делаешь таймер частотой 1сек, твоя переменная
Dim A, as byte
Dim B as bit
Dim C as long

If B = 1 then
   If A > 0 then A = A - 1 else B = 0
end if

Когда B будет 0 тогда начнёт выполняться твоё там, когда ты установишь B = 1 и в A положешь нужное время в сек и всё.
А про таймер делается тупо:

ltimer: 'прерывание по таймеру
C = C + (шаг таймера в мкс)

If C >= 1000000 then
   C = 0
   'тут будет каждую сек срабатывать
end if
return

Но я думаю смысл понятен. Обычный таймер.

Отредактировано Rotgar (2013-08-31 04:24:31)

0

6

Код:
[color=fuchsia]Основной цикл[/color]
do
if kn=0 gosub set1
....
loop

[color=fuchsia]подпрограмма[/color]
set1:
sbros=10
do
if sbros=0 then return
'if kn2=0 then sbros=10    [color=fuchsia]если хотите, что бы сбрасывалось от бездействия[/color]
....
loop

Вот так. Уменьшать переменную Sbros можно либо по таймеру, либо повесить часовой кварц, включить софтовые часы и уменьшать в подпрограмме Sectic, что намного проще.

0

7

Всем - привет  :flag: Подскажите, кому не трудно, как реализовать выход по бездействию энкодера? Подтолкните к мысли или поделитесь куском кода. Уже больше недели бьюсь. Знаю что я очень близко, но никак не соображу.   :dontknow:  Спасибо.
Задача такая. Есть главное меню, при вращении энкодера переходим в подменю и после поворотов энкодера в подменю  влево или  вправо - выход по бездействию обратно в главное. Т.е. я застрял на том, как например, указать в программе, что импульсы с ног, куда подключён энкодер, уже не приходят какое-то время и пора на выход.

Отредактировано sevastopolets (2015-03-17 21:33:15)

0

8

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

0

9

Александр Д. написал(а):

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

Т.е. я застрял на том, как например, указать в программе, что импульсы с ног, куда подключён энкодер, уже не приходят какое-то время и пора на выход.

Отредактировано sevastopolets (2015-03-17 23:18:47)

0

10

Объясню проще.
В подменю увеличивайте переменную Sbros. Поставьте условие в подменю- если Sbros равен 100, то перейти в меню. А в программе обработки энкодера напишите Sbros = 0.

0

11

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

Объясню проще.
В подменю увеличивайте переменную Sbros. Поставьте условие в подменю- если Sbros равен 100, то перейти в меню. А в программе обработки энкодера напишите Sbros = 0.

Спасибо. Попробую.

0

12

Вот хоть убейте!!  :D  С реализацией по бездействию кнопки мне всё понятно, а по реализации по бездействию энкодера - нет. Переспрошу, куда вешать хотя бы тот кусок кода, который привели выше? На какую из ног? Одна на INT. На неё, или на другую, или на обе сразу? Подскажите, пожалуйста. Ни как не соображу.

Отредактировано sevastopolets (2015-03-20 22:34:56)

0

13

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

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


Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portd.1 , Rs = Portd.0

Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input

Config Debounce = 30

Debounce Pind.2 , 1 , Knopka , Sub
Debounce Pind.3 , 0 , Encode , Sub
Debounce Pind.4 , 0 , Encode , Sub

Config Int0 = Rising
Config Int1 = Falling

On Int0 Knopka
On Int1 Encode

Enable Interrupts
Enable Int0
Enable Int1

Dim A As Byte
Dim Vol As Integer
Dim Tre As Integer
Dim Bas As Integer
Dim Bal As Integer
Dim Level As String * 3
Dim Level_2 As String * 3
Dim Pauza As Byte


A = 0
Vol = -47
Tre = 0
Bas = 0
Bal = 0

Cursor Off
Cls
'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Do

   On A Gosub Main , Treble , Bass , Balance

   Waitms 50

   If Pauza >= 0 Then Incr Pauza
   If Pauza >= 60 Then Pauza = 60                           ' значение увеличено в 2 раза для протеуса
   If Pauza = 60 Then A = 0

Loop

End
'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Knopka:                                                     ' обработчик кнопки
   If Pind.2 = 1 Then Incr A : Pauza = 0
   If A > 3 Then A = 0

Return
'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Encode:                                                     ' обработчик энкодера

'--- изменение громкости ---

   If A = 0 Then
   If Pind.3 = 0 Then                                       ' ножка INT1
   If Pind.4 = 0 Then Incr Vol Else Decr Vol
   End If
   End If

   '--- изменение высоких ---

   If A = 1 Then
   If Pind.3 = 0 Then Pauza = 0
   If Pind.4 = 0 Then Incr Tre Else Decr Tre
   End If

   '--- изменение низких ---

   If A = 2 Then
   If Pind.3 = 0 Then Pauza = 0
   If Pind.4 = 0 Then Incr Bas Else Decr Bas
   End If

   '--- изменение баланса ---

   If A = 3 Then
   If Pind.3 = 0 Then Pauza = 0
   If Pind.4 = 0 Then Incr Bal Else Decr Bal
   End If

Gifr = 64

Return

'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

'------------ Главный ---------------
Main:

   Pauza = 0

   If Vol <= -47 Then Vol = -47
   If Vol >= 0 Then Vol = 0

   Level = Str(vol)
   Level_2 = Format(level , "+00")
   Locate 1 , 1
   Lcd "Volume     " ; Level_2 ; "dB"

Return

'------------ Высокие ---------------
Treble:

   If Tre <= -14 Then Tre = -14
   If Tre >= 14 Then Tre = 14

   Level = Str(tre)
   Level_2 = Format(level , "+00")
   Locate 1 , 1
   Lcd "Treble     " ; Level_2 ; "dB"

Return

'------------ Низкие ----------------
Bass:

   If Bas <= -14 Then Bas = -14
   If Bas >= 14 Then Bas = 14

   Level = Str(bas)
   Level_2 = Format(level , "+00")
   Locate 1 , 1
   Lcd "Bass       " ; Level_2 ; "dB"

Return

'------------ Баланс ----------------
Balance:

   If Bal <= -36 Then Bal = -36
   If Bal >= 36 Then Bal = 36

   Level = Str(bal)
   Level_2 = Format(level , "+00")
   Locate 1 , 1
   Lcd "Balance    " ; Level_2 ; "dB"

Return

Кому будет не трудно, прошу указать на мои ошибки.
Всем - спасибо.

Отредактировано sevastopolets (2015-04-04 21:14:39)

0

14

Неполная настройка LCD!

  Config Lcdpin = Pin , Rs = Portb.5 , E = Portb.4 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0
  Config Lcd = 20 * 4       ' Используемый LCD

  Initlcd       ' Инициализируем LCD
  Waitms 50       ' Ждем пока все запустится

  Cursor Off       ' Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor Blink       ' Включаем моргающий курсор
'  Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка  - один из вариантов перехода на строку
  Cls       ' Чистим экран, на всякий случай

0

15

Может так и задумано, но по моему в магнитолах незначащий ноль не горит

У Вас:
..... = Format(level , "+00")

Не отображается:
..... = Format(level , "+ 0")

0

16

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

Неполная настройка LCD!

  Config Lcdpin = Pin , Rs = Portb.5 , E = Portb.4 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0
  Config Lcd = 20 * 4       ' Используемый LCD

  Initlcd       ' Инициализируем LCD
  Waitms 50       ' Ждем пока все запустится

  Cursor Off       ' Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor Blink       ' Включаем моргающий курсор
'  Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка  - один из вариантов перехода на строку
  Cls       ' Чистим экран, на всякий случай


Спасибо. Кое что конечно же допишу. Это всё ясно и понятно. :)

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

Может так и задумано, но по моему в магнитолах незначащий ноль не горит

У Вас:
..... = Format(level , "+00")

Не отображается:
..... = Format(level , "+ 0")


В некоторых горит, в некоторых - нет.
Попробовал, по Вашему совету. Спасибо конечно, но пробел в коде - не работает, так как задумано. Хотелось жёстко привязать отображение символов на дисплее, ( +/-  dB ). Если делать так, как Вы посоветовали, то мне придётся жёстко указывать расположение символов, когда значение на дисплее будет меньше 10, через LOCATE и т.п. Я пробовал и другие варианты. Работало, но не хотелось заморачиваться. Оставил как есть. Так код выглядит короче. :)

Отредактировано sevastopolets (2015-04-05 20:19:35)

0


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