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

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

Сообщение us5caa »

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

Сообщение vanyap1 »

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


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

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

Сообщение vanyap1 »

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

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

Сообщение 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 КБ) 215 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Сообщение raf65 »

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

Сообщение 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 Чё-то не нашел энкодера :(
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Сообщение raf65 »

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

Сообщение vanyap1 »

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

Сообщение vitalkalm »

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

Сообщение vitalkalm »

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

Сообщение 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
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт май 23, 2008 03:48:36
Откуда: Украина

Сообщение vitalkalm »

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

Сообщение edm2007 »

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

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

Сообщение raf65 »

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

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

Сообщение edm2007 »

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

Сообщение 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

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

Сообщение 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)? Я и спрашиваю...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Сообщение raf65 »

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

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

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

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

Сообщение 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 раза.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

Сообщение raf65 »

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

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