Страница 107 из 304
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 20:51:10
us5caa
Подскажите, пожалуйста команду для работы с матричной клавиатурой (Getkbd()), что бы код кнопки выбирался не при нажатии, а при отпускании кнопки.... т.е. надо проверку на отпускание кнопки, как это сделать?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 21:38:30
vanyap1
Атмега8515, несколько последних попыток прошивать закончились крахом. Стер микросхему и прошил нормально, после чего заработал. Теперь включил в программе таймер для генерации ШИМ, прошил и мой МК больше не подавал признаков жизни. Конфигурацию фузов не менял, настроен на внешний кварц - 10 МГц.
какие могут быть соображения?
программатор покупной Авр910, другие МК прошивает на ура, так что проблема не в нем.
Чуть не забыл, программирую внутри схемы, на линиях к программатору ничего нет и плата чистая, никакого флюса и мусора.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 22:00:35
vanyap1
us5caa писал(а):Подскажите, пожалуйста команду для работы с матричной клавиатурой (Getkbd()), что бы код кнопки выбирался не при нажатии, а при отпускании кнопки.... т.е. надо проверку на отпускание кнопки, как это сделать?
Раньше по теме описывали. При нажатии на кнопку отправить в подпрограмму, где проверять - не отпустили ли кнопку. И если отпустили, выполнить ... ну, что там надо.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт дек 23, 2011 19:34:35
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
В архиве полный текст и протеус-проект
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт дек 23, 2011 23:58:57
raf65
посмотрите как в этой программе реализован переход в сервис, и попробуйте так же.
офф. кстати для прота есть энкодер
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб дек 24, 2011 00:07:42
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 Чё-то не нашел энкодера

Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб дек 24, 2011 00:46:59
raf65
я так понял, второе долгое нажатие должно включить блок, а он не включает? или что то другое
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб дек 24, 2011 11:38:53
vanyap1
vanyap1 писал(а):Атмега8515, несколько последних попыток прошивать закончились крахом. Стер микросхему и прошил нормально, после чего заработал. Теперь включил в программе таймер для генерации ШИМ, прошил и мой МК больше не подавал признаков жизни. Конфигурацию фузов не менял, настроен на внешний кварц - 10 МГц.
Проблема решена. Как оказалось, при стирании - черт знает как установились новые фюзы, от и все дела.
Микросхема включилась на внешний тактирующий сигнал, а на схеме установлен кварц.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 01:56:28
vitalkalm
raf65 писал(а):я так понял, второе долгое нажатие должно включить блок, а он не включает? или что то другое
Оба варианта в Протеусе работают корректно. Когда прошивка залита в контроллер, то при длинном нажатии ничего не происходит вообще. Ни выключает, ни включает.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 02:10:09
vitalkalm
vanyap1 писал(а):vanyap1 писал(а):Атмега8515, несколько последних попыток прошивать закончились крахом. Стер микросхему и прошил нормально, после чего заработал. Теперь включил в программе таймер для генерации ШИМ, прошил и мой МК больше не подавал признаков жизни. Конфигурацию фузов не менял, настроен на внешний кварц - 10 МГц.
Проблема решена. Как оказалось, при стирании - черт знает как установились новые фюзы, от и все дела.
Микросхема включилась на внешний тактирующий сигнал, а на схеме установлен кварц.
Может не прошла идентификация чипа, а Вы при этом нажали "Program". Вообще я приучился от других програм при программировании сначала ститывать фузы, а затем зашивать программу(был горький опыт поначалу...).
Кстате, как-то попадался на подобное - чип запрограммировал от внешнего тактирования по неопытности. Но понял я это после того, как удалось его считать, но каким образом! Вместо установленного согласно схемы кварца на 16 Мгц, вставил на несколько сот килогерц. Проц завелся!
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 02:48:05
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
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 13:27:32
vitalkalm
Так отключится порт до следующего цикла, но если отпусить кнопку, то порт снова включится?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 13:51:36
edm2007
Мда... Что же Вы имели ввиду под "порт отключится" и "порт снова включится"?

А в предыдущем примере вообще ерунда. Нужно по факту нажатия сидеть на жопе и щупать вывод кнопки. И до тех пор пока кнопка удерживается, увеличивать значение счетчика. И уже от значения этого счетчика плясать. А в том примере вообще получится подсчет нажатий и не более того...
Посмотрите в сторону While .. Wend, на этой конструкции можно легко сделать проверку на удержание кнопки.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 15:09:46
raf65
edm2007 писал(а):Мда... Что же Вы имели ввиду под "порт отключится" и "порт снова включится"?

А в предыдущем примере вообще ерунда. Нужно по факту нажатия сидеть на жопе и щупать вывод кнопки. И до тех пор пока кнопка удерживается, увеличивать значение счетчика. И уже от значения этого счетчика плясать. А в том примере вообще получится подсчет нажатий и не более того...
Посмотрите в сторону While .. Wend, на этой конструкции можно легко сделать проверку на удержание кнопки.
там кусок кода программы работающей в непрерывном цикле, и пока нажата кнопка увеличивается значение переменной Nlock1
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 15:18:37
edm2007
raf65 писал(а):там кусок кода программы работающей в непрерывном цикле
Лично я вижу не кусок кода а законченую подпрограмму Knoblong, о чем явно говорит Sub. Покажите мне вызов этой подпрограммы. Проверка If .. Then позволяет проверить условие только в один проход. Это же не While .. Wend, которое проверяет "до тех пор пока..."
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 15:20:33
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
В архиве полный текст и протеус-проект
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 15:57:23
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)? Я и спрашиваю...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 16:11:05
raf65
вот так она и вызывается
Код: Выделить всё
.....
Do
Call Knoblong
Call U_i_metr
Call Diapason 'вычисление номера реле
Call Akseler
'подпрограмма коэф ускорения енкод
Call Knob
Call U_i_set
Call Isobra ' вывод изображения
Loop
End
....
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 16:21:21
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 с), включаем зеленый светодиод. Ну а если уж отпустили раньше, то включаем красный.
Код конечно может быть оптимизирован еще, но и в этом состоянии работоспособен вполне. И в протеусе и в железе. В протеусе проект привязываю, а в железе проверил лично. Видео снять?
Удержание кнопки
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс дек 25, 2011 16:24:42
raf65
все хорошо, но в программе , в другой подпрограмме, эта кнопка выполняет и другую функцию