BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
us5caa
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт апр 04, 2008 08:48:57
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение us5caa »

Подскажите, пожалуйста команду для работы с матричной клавиатурой (Getkbd()), что бы код кнопки выбирался не при нажатии, а при отпускании кнопки.... т.е. надо проверку на отпускание кнопки, как это сделать?
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение vanyap1 »

Атмега8515, несколько последних попыток прошивать закончились крахом. Стер микросхему и прошил нормально, после чего заработал. Теперь включил в программе таймер для генерации ШИМ, прошил и мой МК больше не подавал признаков жизни. Конфигурацию фузов не менял, настроен на внешний кварц - 10 МГц.


какие могут быть соображения?

программатор покупной Авр910, другие МК прошивает на ура, так что проблема не в нем.
Чуть не забыл, программирую внутри схемы, на линиях к программатору ничего нет и плата чистая, никакого флюса и мусора.
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение vanyap1 »

us5caa писал(а):Подскажите, пожалуйста команду для работы с матричной клавиатурой (Getkbd()), что бы код кнопки выбирался не при нажатии, а при отпускании кнопки.... т.е. надо проверку на отпускание кнопки, как это сделать?



Раньше по теме описывали. При нажатии на кнопку отправить в подпрограмму, где проверять - не отпустили ли кнопку. И если отпустили, выполнить ... ну, что там надо.
vitalkalm
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

Re: BASCOM AVR в вопросах и ответах

Сообщение vitalkalm »

Кто может, гляньте, почему в железе не работает код обработки длинного нажатия кнопки, хотя в Протеусе все работает как надо:
If Pind.2 = 0 Then Nlock1 = Nlock1 + 1
Waitms 100
If Nlock1 = 20 Then
If Pind.0 = 1 Then
Portd.0 = 0
Else
Portd.0 = 1
End If
Nlock1 = 0
End If

В архиве полный текст и протеус-проект
Вложения
POWER SUPLY.rar
(28.26 КБ) 213 скачиваний
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Re: BASCOM AVR в вопросах и ответах

Сообщение raf65 »

посмотрите как в этой программе реализован переход в сервис, и попробуйте так же.
офф. кстати для прота есть энкодер
vitalkalm
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

Re: BASCOM AVR в вопросах и ответах

Сообщение vitalkalm »

raf65 писал(а):посмотрите как в этой программе реализован переход в сервис, и попробуйте так же.
офф. кстати для прота есть энкодер


Так Я тоже пробовал.

Код: Выделить всё

Sub Knoblong()

If Pind.2 = 0 Then
Goto Startknoblong
End If
Goto Endknoblong

 Startknoblong:
 Nlock1 = 1

 Asdf:
 If Pind.2 = 0 Then
     Nlock1 = Nlock1 + 1
      Waitms 100
      If Nlock1 = 20 Then
             Portd.0 = 0

      End If
     Goto Asdf

 End If
 If Pind.0 = 0 Then
 Locate 1 , 9
 Lcd " PWR OFF"
 Waitms 1000
 End If
Endknoblong:

End Sub


Может это связано с компилятором? Ну я не знаю, вдруг наименование метки слишком длинное, к примеру...

PS Чё-то не нашел энкодера :(
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Re: BASCOM AVR в вопросах и ответах

Сообщение raf65 »

я так понял, второе долгое нажатие должно включить блок, а он не включает? или что то другое
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение vanyap1 »

vanyap1 писал(а):Атмега8515, несколько последних попыток прошивать закончились крахом. Стер микросхему и прошил нормально, после чего заработал. Теперь включил в программе таймер для генерации ШИМ, прошил и мой МК больше не подавал признаков жизни. Конфигурацию фузов не менял, настроен на внешний кварц - 10 МГц.

Проблема решена. Как оказалось, при стирании - черт знает как установились новые фюзы, от и все дела.
Микросхема включилась на внешний тактирующий сигнал, а на схеме установлен кварц.
vitalkalm
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

Re: BASCOM AVR в вопросах и ответах

Сообщение vitalkalm »

raf65 писал(а):я так понял, второе долгое нажатие должно включить блок, а он не включает? или что то другое

Оба варианта в Протеусе работают корректно. Когда прошивка залита в контроллер, то при длинном нажатии ничего не происходит вообще. Ни выключает, ни включает.
Последний раз редактировалось vitalkalm Вс дек 25, 2011 02:17:45, всего редактировалось 1 раз.
vitalkalm
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

Re: BASCOM AVR в вопросах и ответах

Сообщение vitalkalm »

vanyap1 писал(а):
vanyap1 писал(а):Атмега8515, несколько последних попыток прошивать закончились крахом. Стер микросхему и прошил нормально, после чего заработал. Теперь включил в программе таймер для генерации ШИМ, прошил и мой МК больше не подавал признаков жизни. Конфигурацию фузов не менял, настроен на внешний кварц - 10 МГц.

Проблема решена. Как оказалось, при стирании - черт знает как установились новые фюзы, от и все дела.
Микросхема включилась на внешний тактирующий сигнал, а на схеме установлен кварц.

Может не прошла идентификация чипа, а Вы при этом нажали "Program". Вообще я приучился от других програм при программировании сначала ститывать фузы, а затем зашивать программу(был горький опыт поначалу...).
Кстате, как-то попадался на подобное - чип запрограммировал от внешнего тактирования по неопытности. Но понял я это после того, как удалось его считать, но каким образом! Вместо установленного согласно схемы кварца на 16 Мгц, вставил на несколько сот килогерц. Проц завелся!
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Re: BASCOM AVR в вопросах и ответах

Сообщение raf65 »

vitalkalm писал(а):
raf65 писал(а):я так понял, второе долгое нажатие должно включить блок, а он не включает? или что то другое

Оба варианта в Протеусе работают корректно. Когда прошивка залита в контроллер, то при длинном нажатии ничего не происходит вообще. Ни выключает, ни включает.


попробуй так

Код: Выделить всё

Sub Knoblong()
   If Pind.2 = 0 Then
    Nlock1 = Nlock1 + 1
    Waitms 100
      If Nlock1 <= 10 Then
      set Portd.0
       Else
      reset Portd.0
      End If
 end IF
      If Nlock1 = 20 Then

      Nlock1 = 0
    end IF
    End Sub
vitalkalm
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

Re: BASCOM AVR в вопросах и ответах

Сообщение vitalkalm »

Так отключится порт до следующего цикла, но если отпусить кнопку, то порт снова включится?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Мда... Что же Вы имели ввиду под "порт отключится" и "порт снова включится"? :) А в предыдущем примере вообще ерунда. Нужно по факту нажатия сидеть на жопе и щупать вывод кнопки. И до тех пор пока кнопка удерживается, увеличивать значение счетчика. И уже от значения этого счетчика плясать. А в том примере вообще получится подсчет нажатий и не более того...

Посмотрите в сторону While .. Wend, на этой конструкции можно легко сделать проверку на удержание кнопки.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Re: BASCOM AVR в вопросах и ответах

Сообщение raf65 »

edm2007 писал(а):Мда... Что же Вы имели ввиду под "порт отключится" и "порт снова включится"? :) А в предыдущем примере вообще ерунда. Нужно по факту нажатия сидеть на жопе и щупать вывод кнопки. И до тех пор пока кнопка удерживается, увеличивать значение счетчика. И уже от значения этого счетчика плясать. А в том примере вообще получится подсчет нажатий и не более того...

Посмотрите в сторону While .. Wend, на этой конструкции можно легко сделать проверку на удержание кнопки.


там кусок кода программы работающей в непрерывном цикле, и пока нажата кнопка увеличивается значение переменной Nlock1
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

raf65 писал(а):там кусок кода программы работающей в непрерывном цикле


Лично я вижу не кусок кода а законченую подпрограмму Knoblong, о чем явно говорит Sub. Покажите мне вызов этой подпрограммы. Проверка If .. Then позволяет проверить условие только в один проход. Это же не While .. Wend, которое проверяет "до тех пор пока..."
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Re: BASCOM AVR в вопросах и ответах

Сообщение raf65 »

to edm2007

vitalkalm писал(а):Кто может, гляньте, почему в железе не работает код обработки длинного нажатия кнопки, хотя в Протеусе все работает как надо:
If Pind.2 = 0 Then Nlock1 = Nlock1 + 1
Waitms 100
If Nlock1 = 20 Then
If Pind.0 = 1 Then
Portd.0 = 0
Else
Portd.0 = 1
End If
Nlock1 = 0
End If

В архиве полный текст и протеус-проект
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

raf65, нет, я не о том немного. Это Вы советуете:

raf65 писал(а):попробуй так


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

Код: Выделить всё

Sub Knoblong()
   If Pind.2 = 0 Then
    Nlock1 = Nlock1 + 1
    Waitms 100
      If Nlock1 <= 10 Then
      set Portd.0
       Else
      reset Portd.0
      End If
 end IF
      If Nlock1 = 20 Then

      Nlock1 = 0
    end IF
    End Sub


Ну допустим эта подпрограмма была вызвана чем-нибудь типа If Pind.2 = 0 Then Gosub Knoblong. Ну или Call, это не так и важно. Главное, что мы зафиксировали нажатие и ушли на подпрограмму. Где смотрим, ага, кнопка нажата? (спрашивается, нахрена If Pind.2 = 0 Then, если мы туда попали то значит кнопка явно нажата была :) ). Ладно, нажата. Увеличиваем значение счетчика (Nlock1 = Nlock1 + 1). Был он изначально равен 0, стал равен 1, проверили, да, меньше 10, выдали 1 на PORTD.0. И? Что дальше-то? Куда мы уходим по End Sub (Return)? Я и спрашиваю...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Re: BASCOM AVR в вопросах и ответах

Сообщение raf65 »

вот так она и вызывается :)

Код: Выделить всё

 
.....
Do
 Call Knoblong
Call U_i_metr
Call Diapason                                               'вычисление номера реле
Call Akseler
                                               'подпрограмма коэф ускорения енкод
Call Knob
Call U_i_set
Call Isobra                                                 ' вывод изображения
Loop
 End
....

Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Появилось 10 свободных минут, появился на свет следующий код под эту задачу:

Код: Выделить всё

$regfile = "attiny2313.dat"     ' тип МК
$crystal = 4000000               ' тактовая частота

'----------

Config Portd.2 = Input      ' кнопка
Config Porta.0 = Output    ' красный светодиод
Config Porta.1 = Output    ' зеленый светодиод

Config Debounce = 50      ' антидребезг

'----------

Dim Count As Byte    ' счетчик удержания кнопки

Reset Porta.0            ' гасим оба светодиода
Reset Porta.1           ' (начальное состояние)

'----------

Do                           ' основной цикл

Debounce Pind.2 , 0 , Button , Sub  ' опрос кнопки

Loop

'----------

Button:                       ' обработка нажатия кнопки

While Pind.2 = 0         ' до тех пор пока кнопка удерживается

Incr Count                 ' увеличиваем счетчик
Waitms 50                 ' задержка

If Count => 20 Then   ' если кнопка удерживается 1 секунду
Reset Porta.0             ' гасим красный светодиод
Set Porta.1                ' включаем зеленый
Count = 0                  ' обнуляем счетчик
Goto Ext                    ' уходим
End If                        ' конец условия

Wend

' если же кнопка удерживалась менее секунды

Reset Porta.1            ' гасим зеленый светодиод
Set Porta.0                ' включаем красный
Count = 0                  ' обнуляем счетчик

Ext:                          ' уходим

Return                      ' возврат в основной цикл 


Сидим себе в основном цикле, болтаем ногой и щупаем кнопку. Как только зафиксировали нажатие - уходим на обработку. А там уже попадаем в ловушку цикла While - Wend. И если кнопка удерживается то тикаем счетчиком. Натикали 1 секунду (50 мс * 20 = 1000 мс = 1 с), включаем зеленый светодиод. Ну а если уж отпустили раньше, то включаем красный.

Код конечно может быть оптимизирован еще, но и в этом состоянии работоспособен вполне. И в протеусе и в железе. В протеусе проект привязываю, а в железе проверил лично. Видео снять? :))

Удержание кнопки
Последний раз редактировалось edm2007 Ср дек 28, 2011 19:02:25, всего редактировалось 2 раза.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Re: BASCOM AVR в вопросах и ответах

Сообщение raf65 »

все хорошо, но в программе , в другой подпрограмме, эта кнопка выполняет и другую функцию
Ответить

Вернуться в «AVR»