Страница 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
все хорошо, но в программе , в другой подпрограмме, эта кнопка выполняет и другую функцию