Страница 50 из 304

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

Добавлено: Вт дек 21, 2010 14:11:28
Kesha
После Case x надо ставить двоеточие

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

Case 0 :

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

Добавлено: Вт дек 21, 2010 14:19:12
TRIOD
Тотже эфект. И самое главное переключение происходит до таго как я отпущю кнопку.
Хотя в обработке написано ожидание отпуска кнопки.

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

Добавлено: Вт дек 21, 2010 14:41:33
TRIOD
всё разобрался сам.
Надо было так.

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

$regfile = "m8def.dat "
$crystal = 1000000


Ddrb = &B000111
Config Portd.3 = Input
Config Int0 = Low Level
Ds Alias Portb.0
Sh_cd Alias Portb.1
St_cp Alias Portb.2
Buton Alias Pind.2

On Int0 Butonp
Enable Interrupts
Enable Int0

Declare Sub 74hc595(byval Pin As Integer)


Dim Led As Integer
Dim Ifect As Byte
Led = 0
Ifect = 0

Do

Call 74hc595(led)
Rotate Led , Right , 1
Waitms 800

Loop

End

Sub 74hc595(byval Pin As Integer)                           'Ïðîöåäóðà çàãðóçêè äàíûõ âðåãèñòð

Shiftout Ds , Sh_cd , Pin , 3 , 16
Set St_cp
Waitms 1
Reset St_cp

End Sub


Butonp:                                                     'Îáðàáîòêà íàæàòèÿ êíîïêè
 Waitms 30
 While Buton = 0                                            'Îæèäàíèå îòïóñêàíèÿ êíîïêè
 Wend
 Ifect = Ifect + 1                                          'Âûáð ýôåêòà
 If Ifect = 5 Then
 Ifect = 0
 End If
Select Case Ifect
Case 1 :
Led = &B0111111111111111
Case 2 :
Led = &B1000000000000000
Case 3 :
Led = &B1010101010101010
Case 4 :
Led = &B0011001100110011
Case 0 :
Led = &B1001100011100001
End Select
Gifr = 64
Waitms 1
Return

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

Добавлено: Вт дек 21, 2010 17:36:04
edm2007
user2007 писал(а):ШИМ работает так...
Тут самым оптимальным вариантом наверное будет настроить таймер в режим PWM и просто по нажатию кнопки увеличивать или уменьшать переменную, загружая в регистр сравнения compare cоответствующее значение из массива градаций яркости по этой самой переменной. Сделать ступеней 10, например...

Когда ковырялся с плавным зажиганием / гашением лампы, то делал просто:

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

For Count = 0 To 255                               ' шагая, увеличиваем счетчик яркости

Compare1a = Count                                ' грузим счетчик в регистр сравнения ШИМ

Waitms 20                                               ' задержка смены яркости

Next
Для кнопки же 255 шагов слишком много будет. :) Я вот только ничего особо ловкого не придумал, в плане автоповтора... Ну при каждом нажатии яркость менять это понятно, а вот чтобы нажали, и яркость плавно увеличивается / уменьшается... Отпустили и остановились на этом уровне... Разве что в обработчике кнопки увеличив яркость, проверять, нажата ли кнопка до сих пор, и если это так то никуда не уходить а еще на один шаг увеличить... Ну и так далее... Просто в PIC Basic Pro при работе с кнопкой вроде есть такая штука как автоповтор...

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

Добавлено: Вт дек 21, 2010 18:57:37
TRIOD
Подскажите как отследить нажатие кнопки.

Суть втом что использую контролер Attiny85. Осталось свободными только два контакта, на одном который INT0 есть кнопка и она обрабатывается в прирывании. И нужно ещё одну повесить на PORTB0. В основном цыкле обработать не получается иза больших задержек до 700ms в другом месте. Получается что кнопку надо долго держать. Как ещё можно обработать нажатие кнопки?

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

Добавлено: Вт дек 21, 2010 20:22:25
Kesha
Вот пример реализации шим - http://bascomavr.3bb.ru/viewtopic.php?id=123
Или вот, подправлял для себя, так проще разобраться будет:

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

$regfile = "m8def.dat"
$crystal = 8000000

Config Portd.6 = Output
Config Pind.2 = Input
Config Pind.3 = Input

Shim_up Alias Pind.3
Shim_down Alias Pind.2


Dim X As Byte , Tik As Byte

Config Timer2 = Timer , Prescale = 1

Enable Timer2
On Timer2 Pwms

Start Timer2
Enable Interrupts

X = 7
Do
If Shim_up = 0 Then
Waitms 70
If Shim_up = 0 Then Incr X
End If
If X > 14 Then X = 14

If Shim_down = 0 Then
Waitms 70
If Shim_down = 0 Then Decr X
End If
If X < 1 Then X = 1


Loop
End
Pwms:
Incr Tik

If Tik = 16 Then
 Tik = 0
Reset Portd.6
 End If
If Tik > X Then Set Portd.6
Return

End

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

Добавлено: Вт дек 21, 2010 22:41:51
Alex_Megavolt_79
Очень хороший вариант многоканального ШИМ - http://radiokot.ru/circuit/light/run/22/

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

Добавлено: Ср дек 22, 2010 11:26:05
Секретный кот
Согласен. Очень полезный исходник.

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

Добавлено: Ср дек 22, 2010 19:51:57
user2007
TRIOD писал(а):Подскажите как отследить нажатие кнопки.

Суть втом что использую контролер Attiny85. Осталось свободными только два контакта, на одном который INT0 есть кнопка и она обрабатывается в прирывании. И нужно ещё одну повесить на PORTB0. В основном цыкле обработать не получается иза больших задержек до 700ms в другом месте. Получается что кнопку надо долго держать. Как ещё можно обработать нажатие кнопки?
По прерыванию по времени,например.Для этого нужно организовать прерывания от TIMERX каждые ,например '20 мс и следить за нажатием кнопки.
Config PinB.0=Input
Dim A As Bit
......
Config TimerX = Timer.....
Enable Interrupts
Enable TimerX
On TimerX Label1 'прерывание по переполнению таймера TimerX(X=0..2)
START TIMER0
..................

Label1: 'настройки в Config TimerX на каждые,например, 20 мс
A=Pinb.0
If A=1 Then
(действие)
End if

....
RETURN :)

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

Добавлено: Ср дек 22, 2010 20:17:17
TRIOD
user2007 Спасибо за совет.
А то я попыталя сделать через DEBOUNCE, но вобще не работает.
Может кто подскажет в чём дело.

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

$regfile = "m8def.dat "
$crystal = 1000000

Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.3 = Output
Config Portb.2 = Output
Config Portb.4 = Output
Config Debounce = 30
Ds Alias Portb.2
Sh_cd Alias Portb.3
St_cp Alias Portb.4
Buton Alias Pinb.0
Speedb Alias Pinb.1

Declare Sub 74hc595(byval Pin As Word)

Dim Led As Word                                             ' Ýôåêò
Dim Ifect As Byte                                           'Íîìåð ýôåêòà
Dim Speed As Word                                           'Ñêîðîñòü
Led = 32768
Ifect = 0
Speed = 300
Restore Ifecti

Debounce Buton , 0 , Butonp
Do

Call 74hc595(led)
Rotate Led , Right , 1
Waitms Speed
Loop
End

Sub 74hc595(byval Pin As Word)                              'Ïðîöåäóðà çàãðóçêè äàíûõ âðåãèñòð

Shiftout Ds , Sh_cd , Pin , 3 , 16
Set St_cp
Waitms 1
Reset St_cp
End Sub

Butonp:                                                     'Îáðàáîòêà íàæàòèÿ êíîïêè
 Ifect = Ifect + 1                                          'Âûáð ýôåêòà
 If Ifect = 4 Then
 Ifect = 0
 Restore Ifecti
 End If
Read Led
Waitms 1
Return

Ifecti:
Data 32767% , 43690% , 28086%

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

Добавлено: Ср дек 22, 2010 20:27:08
kip96
В этой строчке Debounce Buton , 0 , Butonp нужно добавить sub, если обращаетесь к подпрограме Debounce Buton , 0 , Butonp,sub

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

Добавлено: Ср дек 22, 2010 20:35:37
edm2007
TRIOD писал(а): А то я попыталя сделать через DEBOUNCE, но вобще не работает...
Я что-то не совсем понял, а как в данном случае опрос кнопки-то работает?

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

Добавлено: Ср дек 22, 2010 20:40:57
TRIOD
edm2007 писал(а):
TRIOD писал(а): А то я попыталя сделать через DEBOUNCE, но вобще не работает...
Я что-то не совсем понял, а как в данном случае опрос кнопки-то работает?
Ну вроде на сколько я понимаю. При нажатии кнопки на порту PB0 появляется 0 и програма должна прыгнуть на метку Butonp.
да только чтото не переходит, что с SUB что без SUB.

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

Добавлено: Ср дек 22, 2010 20:43:49
edm2007
TRIOD писал(а): Ну вроде на сколько я понимаю. При нажатии кнопки на порту PB0 появляется 0 и програма должна прыгнуть на метку Butonp.
да только чтото не переходит, что с SUB что без SUB.
Так опрос же ДО замкнутого цикла. Как туда программа попадет, чтобы кнопку опросить?

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

Добавлено: Ср дек 22, 2010 20:49:29
TRIOD
А разву debounce надо вставлять в основной цикл? Если я правильно пинимаю даная функция вроде должна активировать прирывание по таймеру с проверкой состояния указоного порта и спереходом на нужную метку. Вроде так внутри компилятора организована Debounce.

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

Добавлено: Ср дек 22, 2010 22:08:43
kip96
aleksandr-zh писал(а):
kip96 писал(а):Ещё заметил что при пустом индикаторе и и сильной контрастности только 8 квадратиков темнеют :shock: .
так и должно быть

попробуйте в настройках ЖКИ указать большее количество символов в строке и только одну строку
Например, 20х1 или 40х1
вот писал я тут про индикатор 1601. ни как не выходит одной строчкой 16 символов написать. И на что я обратил внимание-
Как бы я не писал Config Lcd = 16 * 1 или Config Lcd = 40 * 4, в HEX файле ни чего не меняяется. На кой тогда вообще эта строчка?

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

Добавлено: Ср дек 22, 2010 22:24:06
edm2007
TRIOD писал(а):А разву debounce надо вставлять в основной цикл? Если я правильно пинимаю даная функция вроде должна активировать прирывание по таймеру с проверкой состояния указоного порта и спереходом на нужную метку. Вроде так внутри компилятора организована Debounce.
Эх, было бы здорово. :) Но это просто опрос состояния бита порта с устранением дребезга. И если условие не выполнено (кнопка не нажата), программа переходит к следующей строке. По сути, тот же IF Button = 0 THEN (GOTO / GOSUB), только без мороки с дребезгом. Ну сменить задержку антидребезга еще можно, например - CONFIG DEBOUNCE = 50 (по умолчанию 25 мс).

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

Добавлено: Ср дек 22, 2010 22:36:25
Мурик
TRIOD писал(а):Если я правильно пинимаю даная функция вроде должна активировать прирывание по таймеру с проверкой состояния указоного порта и спереходом на нужную метку. Вроде так внутри компилятора организована Debounce.
Mark Alberts (разработчик BASCOM) с вами не согласен!
Вот что написано в справке.
When you specify the optional parameter SUB, a GOSUB to label is performed instead of a GOTO.
The DEBOUNCE statement tests the condition of the specified pin and if true there will be a delay for 25 mS and the condition will be checked again. (eliminating bounce of a switch)
When the condition is still true and there was no branch before, it branches to specified the label.
When the condition is not true, or the logic level on the pin is not of the specified level, the code on the next line will be executed.
When DEBOUNCE is executed again, the state of the switch must have gone back in the original position before it can perform another branch. So if you are waiting for a pin to go low, and the pin goes low, the pin must change to high, before a new low level will result in another branch.
Each DEBOUNCE statement, which uses a different port, uses 1 BIT of the internal memory to hold its state. And as the bits are stored in SRAM, it means that even while you use only 1 pin/bit, a byte is used for storage of the bit.
DEBOUNCE will not wait for the input value to met the specified condition. You need to use BITWAIT if you want to wait until a bit will have a certain value.
So DEBOUNCE will not halt your program while a BITWAIT can halt your program if the bit will never have the specified value. You can combine BITWAIT and DEBOUNCE statements by preceding a DEBOUNCE with a BITWAIT statement.
Хоть слово про таймер есть?

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

Добавлено: Чт дек 23, 2010 00:12:33
TRIOD
Спасибо за подсказку. теперь я понимаю что Debounce мне не подходит. Поскольку мне нужен вариант который не будет зависить от задержек в основном цикле програмы. Получается только через таимеры.

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

Добавлено: Чт дек 23, 2010 09:08:29
edm2007
aleksandr-zh писал(а):
kip96 писал(а):Ещё заметил что при пустом индикаторе и и сильной контрастности только 8 квадратиков темнеют :shock: .
так и должно быть
Угу.