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

Обсуждаем контроллеры компании Atmel.
Kesha
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вс мар 04, 2007 14:38:49

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

Сообщение Kesha »

После Case x надо ставить двоеточие

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

Case 0 :
Аватара пользователя
TRIOD
Вымогатель припоя
Сообщения: 693
Зарегистрирован: Вт сен 15, 2009 16:23:06
Откуда: Москва

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

Сообщение TRIOD »

Тотже эфект. И самое главное переключение происходит до таго как я отпущю кнопку.
Хотя в обработке написано ожидание отпуска кнопки.
Только абсолютная пустота бездны принесёт мне покой.
Аватара пользователя
TRIOD
Вымогатель припоя
Сообщения: 693
Зарегистрирован: Вт сен 15, 2009 16:23:06
Откуда: Москва

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

Сообщение 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
Только абсолютная пустота бездны принесёт мне покой.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

user2007 писал(а):ШИМ работает так...


Тут самым оптимальным вариантом наверное будет настроить таймер в режим PWM и просто по нажатию кнопки увеличивать или уменьшать переменную, загружая в регистр сравнения compare cоответствующее значение из массива градаций яркости по этой самой переменной. Сделать ступеней 10, например...

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

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

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

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

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

Next


Для кнопки же 255 шагов слишком много будет. :) Я вот только ничего особо ловкого не придумал, в плане автоповтора... Ну при каждом нажатии яркость менять это понятно, а вот чтобы нажали, и яркость плавно увеличивается / уменьшается... Отпустили и остановились на этом уровне... Разве что в обработчике кнопки увеличив яркость, проверять, нажата ли кнопка до сих пор, и если это так то никуда не уходить а еще на один шаг увеличить... Ну и так далее... Просто в PIC Basic Pro при работе с кнопкой вроде есть такая штука как автоповтор...
Последний раз редактировалось edm2007 Вт дек 21, 2010 20:07:40, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
TRIOD
Вымогатель припоя
Сообщения: 693
Зарегистрирован: Вт сен 15, 2009 16:23:06
Откуда: Москва

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

Сообщение TRIOD »

Подскажите как отследить нажатие кнопки.

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

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

Сообщение 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
Аватара пользователя
Alex_Megavolt_79
Грызет канифоль
Сообщения: 262
Зарегистрирован: Пт окт 30, 2009 22:33:56
Откуда: Санкт-Петербург

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

Сообщение Alex_Megavolt_79 »

Очень хороший вариант многоканального ШИМ - http://radiokot.ru/circuit/light/run/22/
Аватара пользователя
Секретный кот
Поставщик валерьянки для Кота
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки
Контактная информация:

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

Сообщение Секретный кот »

Согласен. Очень полезный исходник.
Даже остановленные часы два раза в сутки показывают правильное время.
user2007
Открыл глаза
Сообщения: 66
Зарегистрирован: Пт дек 10, 2010 18:29:26

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

Сообщение 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 :)
Последний раз редактировалось user2007 Пн дек 27, 2010 14:24:56, всего редактировалось 2 раза.
Аватара пользователя
TRIOD
Вымогатель припоя
Сообщения: 693
Зарегистрирован: Вт сен 15, 2009 16:23:06
Откуда: Москва

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

Сообщение 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%
Только абсолютная пустота бездны принесёт мне покой.
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

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

Сообщение kip96 »

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

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

Сообщение edm2007 »

TRIOD писал(а):А то я попыталя сделать через DEBOUNCE, но вобще не работает...


Я что-то не совсем понял, а как в данном случае опрос кнопки-то работает?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
TRIOD
Вымогатель припоя
Сообщения: 693
Зарегистрирован: Вт сен 15, 2009 16:23:06
Откуда: Москва

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

Сообщение TRIOD »

edm2007 писал(а):
TRIOD писал(а):А то я попыталя сделать через DEBOUNCE, но вобще не работает...


Я что-то не совсем понял, а как в данном случае опрос кнопки-то работает?


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

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

Сообщение edm2007 »

TRIOD писал(а):Ну вроде на сколько я понимаю. При нажатии кнопки на порту PB0 появляется 0 и програма должна прыгнуть на метку Butonp.
да только чтото не переходит, что с SUB что без SUB.


Так опрос же ДО замкнутого цикла. Как туда программа попадет, чтобы кнопку опросить?
Последний раз редактировалось edm2007 Сб фев 26, 2011 19:48:07, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
TRIOD
Вымогатель припоя
Сообщения: 693
Зарегистрирован: Вт сен 15, 2009 16:23:06
Откуда: Москва

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

Сообщение TRIOD »

А разву debounce надо вставлять в основной цикл? Если я правильно пинимаю даная функция вроде должна активировать прирывание по таймеру с проверкой состояния указоного порта и спереходом на нужную метку. Вроде так внутри компилятора организована Debounce.
Только абсолютная пустота бездны принесёт мне покой.
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

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

Сообщение kip96 »

aleksandr-zh писал(а):
kip96 писал(а):Ещё заметил что при пустом индикаторе и и сильной контрастности только 8 квадратиков темнеют :shock: .

так и должно быть

попробуйте в настройках ЖКИ указать большее количество символов в строке и только одну строку
Например, 20х1 или 40х1

вот писал я тут про индикатор 1601. ни как не выходит одной строчкой 16 символов написать. И на что я обратил внимание-
Как бы я не писал Config Lcd = 16 * 1 или Config Lcd = 40 * 4, в HEX файле ни чего не меняяется. На кой тогда вообще эта строчка?
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

TRIOD писал(а):А разву debounce надо вставлять в основной цикл? Если я правильно пинимаю даная функция вроде должна активировать прирывание по таймеру с проверкой состояния указоного порта и спереходом на нужную метку. Вроде так внутри компилятора организована Debounce.


Эх, было бы здорово. :) Но это просто опрос состояния бита порта с устранением дребезга. И если условие не выполнено (кнопка не нажата), программа переходит к следующей строке. По сути, тот же IF Button = 0 THEN (GOTO / GOSUB), только без мороки с дребезгом. Ну сменить задержку антидребезга еще можно, например - CONFIG DEBOUNCE = 50 (по умолчанию 25 мс).
Последний раз редактировалось edm2007 Ср дек 22, 2010 22:45:51, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

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.


Хоть слово про таймер есть?
Аватара пользователя
TRIOD
Вымогатель припоя
Сообщения: 693
Зарегистрирован: Вт сен 15, 2009 16:23:06
Откуда: Москва

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

Сообщение TRIOD »

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

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

Сообщение edm2007 »

aleksandr-zh писал(а):
kip96 писал(а):Ещё заметил что при пустом индикаторе и и сильной контрастности только 8 квадратиков темнеют :shock: .

так и должно быть


Угу.
Последний раз редактировалось edm2007 Сб фев 26, 2011 19:47:02, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ответить

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