Тоже об этом подумываю. Ща заведу еще одну переменную. Посмотрим, что выйдетpavel1979 писал(а):может в цикле считать число нажатий?после выхода из цикла делаем условия...
BASCOM AVR в вопросах и ответах
Re: BASCOM AVR в вопросах и ответах
- Реклама
Re: BASCOM AVR в вопросах и ответах
Вроде работает, но криво и имеются косяки:
1. надо нажать 8 раз на кнопку (вместо 4ех), чтобы загорелся светик, а Click у меня равен 4. т.е. получается 4ре двойных нажатий
2. Click по прошествии времени не обнуляется
В моем случае, нажали 2 раза и Click не обнуляется через 2 секунды.
Товарищи коты, скажите, где ошибка
А только что появилась мысль, включать одной кнопкой 3 светика:
Подал питание - светики не горят.
Нажимаем на кнопку 1 раз - идет отсчет времени 2 сек. Если следующего нажатия не было, то включаем LED1 и обнуляем Click.
Нажимаем на кнопку 2 раза подряд - идет отсчет времени 2 сек. Если следующего нажатия не было, то включаем LED2 и обнуляем Click.
Нажимаем на кнопку 3 раза подряд - идет отсчет времени 2 сек. Если следующего нажатия не было, то включаем LED3.
Если было 4ое нажатие, то обнуляем Click и выключаем все светики.
По-моему, паяльные станции аттен потакому принципу работают.
Поднимаешь температуру н., до 300 градусов и, если в теч. энного времени не было следующего нажатия, то паяльник разогревается до установленного значения.
1. надо нажать 8 раз на кнопку (вместо 4ех), чтобы загорелся светик, а Click у меня равен 4. т.е. получается 4ре двойных нажатий
2. Click по прошествии времени не обнуляется
В моем случае, нажали 2 раза и Click не обнуляется через 2 секунды.
Код: Выделить всё
Do
'knopka
Debounce Pinb.4 , 0 , Fmh , Sub
If Click = 4 Then
Set Portb.0 'включаем
Wait 2
Reset Portb.0 'выключаем
Click = 0
End If
Loop
Fmh:
Label1:
Waitms 10
If Pinb.4 = 0 Then Goto Label1
For Count = 0 To 200
Waitms 10
If Pinb.4 = 0 Then
Incr Click
Goto Ext
End If
'End If
Next Count
Reset Portb.0
Ext:
Return
А только что появилась мысль, включать одной кнопкой 3 светика:
Подал питание - светики не горят.
Нажимаем на кнопку 1 раз - идет отсчет времени 2 сек. Если следующего нажатия не было, то включаем LED1 и обнуляем Click.
Нажимаем на кнопку 2 раза подряд - идет отсчет времени 2 сек. Если следующего нажатия не было, то включаем LED2 и обнуляем Click.
Нажимаем на кнопку 3 раза подряд - идет отсчет времени 2 сек. Если следующего нажатия не было, то включаем LED3.
Если было 4ое нажатие, то обнуляем Click и выключаем все светики.
По-моему, паяльные станции аттен потакому принципу работают.
Поднимаешь температуру н., до 300 градусов и, если в теч. энного времени не было следующего нажатия, то паяльник разогревается до установленного значения.
-
pavel1979
- Мучитель микросхем
- Сообщения: 494
- Зарегистрирован: Пн авг 12, 2013 19:07:47
- Откуда: башкирия мелеуз
Re: BASCOM AVR в вопросах и ответах
а если так
Do
'knopka
IF Pinb.4=0 THEN GOSUB Fmh
If Click = 4 Then
Set Portb.0 'включаем
Wait 2
Reset Portb.0 'выключаем
Click = 0
End If
Loop
Fmh:
Click = 0
Label1:
Waitms 1
If Pinb.4 = 0 Then Goto Label1
For Count = 0 To 200
Waitms 10
If Pinb.4 = 0 Then
Label2:
Waitms 1
If Pinb.4 = 0 Then Goto Label2
Incr Click
END IF
Next Count
Return
Do
'knopka
IF Pinb.4=0 THEN GOSUB Fmh
If Click = 4 Then
Set Portb.0 'включаем
Wait 2
Reset Portb.0 'выключаем
Click = 0
End If
Loop
Fmh:
Click = 0
Label1:
Waitms 1
If Pinb.4 = 0 Then Goto Label1
For Count = 0 To 200
Waitms 10
If Pinb.4 = 0 Then
Label2:
Waitms 1
If Pinb.4 = 0 Then Goto Label2
Incr Click
END IF
Next Count
Return
Re: BASCOM AVR в вопросах и ответах
Не пашетpavel1979 писал(а):а если так
Do
'knopka
IF Pinb.4=0 THEN GOSUB Fmh
If Click = 4 Then
Set Portb.0 'включаем
Wait 2
Reset Portb.0 'выключаем
Click = 0
End If
Loop
Fmh:
Click = 0
Label1:
Waitms 1
If Pinb.4 = 0 Then Goto Label1
For Count = 0 To 200
Waitms 10
If Pinb.4 = 0 Then
Label2:
Waitms 1
If Pinb.4 = 0 Then Goto Label2
Incr Click
END IF
Next Count
Return
Первое нажатие не инкрементирует Click, запускается 2 секундный цикл в теч. которого ждем второго нажатия.
А вот последующие нажатия инкрементируют Click с бешенным шагом - 20-30, но не по одному.
А это значение, естественно не попадает под условие в основном цикле If Click = 4 Then... включаем светик.
Переписал строчку Incr Click в Click = Click + 1, убрал цикл For/Next, даже проверку второго нажатия убрал - не хочет работать
Может как-то связать с отпусканием кнопки?
Т.е. нажатие кнопки инкрементирует переменную Click. После каждого опускания инкрементируем счетчик Count.
Прошли 2 сек., и кнопка не была нажата? Ок. Включаем LED с предыдущим значение Click.
Ну, как-то так Bitwait PINB.4, reset тут запускаем For/Next...
Как это будет в коде, ясно пока не вижу. Но по моему, истина где-то рядом
Н., нажали кнопку 3 раза подряд, следовательно Click = 3 и ждем 2 секунды..
Если следующего нажатия не было, то к условию If Click = 3 Then... приделываем свои операции... обнуляем Click и Count
выходим
___
Кстати, нажатий может быть и 3. Видимо шаг нарастания Click зависит от задержки Count.
Последний раз редактировалось KOTик Ср янв 29, 2014 15:32:39, всего редактировалось 1 раз.
-
pavel1979
- Мучитель микросхем
- Сообщения: 494
- Зарегистрирован: Пн авг 12, 2013 19:07:47
- Откуда: башкирия мелеуз
Re: BASCOM AVR в вопросах и ответах
Давай весь исходник и протеус,покумекаю... интересно стало
- Реклама
Re: BASCOM AVR в вопросах и ответах
pavel1979 писал(а):Давай весь исходник и протеус,покумекаю... интересно стало
- Dnepr_1186
- Потрогал лапой паяльник
- Сообщения: 398
- Зарегистрирован: Чт мар 26, 2009 20:53:27
- Откуда: Беларусь.Минская обл.
Re: BASCOM AVR в вопросах и ответах
Люди, кто нибудь работал с графическим ЖКИ на контроллере KS0108 и аналогах в Bascom? Может есть примеры и библиотеки?
- Moto_v3x
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Ср мар 31, 2010 11:45:58
- Откуда: Славянск
Re: BASCOM AVR в вопросах и ответах
Dnepr_1186 работали, а чем вас не устраивает встроенная библиотека и примеры с оф. сайта
http://www.mcselec.com/index.php?option ... &Itemid=57
http://www.mcselec.com/index.php?option ... &Itemid=57
http://www.mcselec.com/index.php?option ... &Itemid=57
http://www.mcselec.com/index.php?option ... &Itemid=57
Re: BASCOM AVR в вопросах и ответах
Только лапы добралисьpavel1979 писал(а):вот пробуй
Кстати, я тоже добавлял label2 для обработки последующих нажатий, но у меня че-то не пошло
Мррррр
Большое спасибо!
Самое то.
-
Shershnyov
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Чт фев 07, 2013 10:46:46
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Помогите пожалуйста оптимизировать код под tiny13. Ультразвуковое реле. Устройство работает по принципу - появилось препятствие реле замкнулось, и после выхода препятствия из зоны датчика, реле определенное время еще замкнуто. Необходимо реализовать задержку перед включением реле. То есть препятствие появилось прошло определенное время, реле замкнулось, препятствие вышло из зоны датчика, реле определенное время еще замкнуто. В коде реализована функция настройки ( что бы выставить расстояние срабатывания ). Я пробовал добавить еще одну конструкцию которая реализовывала б задержку, но компилятор пишет что мало памяти =(. Гуру программирования подскажите новичку как "малой кровью" реализовать данную задержку. Вот рабочий код без задержки перед включением:
Код: Выделить всё
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 0 ' default use 32 for the hardware stack
$swstack = 0 ' default use 10 for the SW stack
$framesize = 0
Config Portb.3 = Output 'выход для подключения ноги Trigger
Trigger Alias Portb.3
Trigger = 0
Config Portb.4 = Input 'вход для импульса Echo
Config Portb.0 = Output 'конфигурация для подключения светодиода
Led Alias Portb.0
Led = 0
Config Portb.1 = Output 'output control pin
Control Alias Portb.1
Control = 0
Config Portb.2 = Input 'вход для button
Dim A As Word , A2 As Word 'сюда копируется значение длины сигнала
Dim M As Word , Em As Eram Word
Dim I As Byte , T As Word , Tled As Byte
Const Toff = 750 '250=1min '500 'TIME to OFF
Const Tmax = 50000
Enable Interrupts 'enable global ints
Enable Pcint0 'we enable pcint0 as this has pcint0-pcint7
On Pcint0 Btn 'we jump to this label when one of the pins is changed
Pcmsk = &B00000100 'enable pcint2 (portb.2)
Config Watchdog = 1024 '8192 '2048
M = Em : T = Tmax : Tled = 0 : Control = 0 : Led = 0
Start Watchdog
Do
Reset Watchdog
Gosub Test
A2 = A
Waitms 100
Reset Watchdog
Gosub Test
Waitms 100
If A < M And A2 < M And A > 0 And A2 > 0 Then
T = 0 ': Led = 1
Else
Incr T ' : Led = 0
If T > Tmax Then T = Tmax
End If
If T < Toff Then
Control = 1
Else
Control = 0
End If
If T = 0 Then
If Tled < 9 Then : Led = 1 : Else : Led = 0 : End If ' on
Else
If T < Toff Then
If Tled < 5 Then : Led = 1 : Else : Led = 0 : End If ' last minute
Else
If Tled < 1 Then : Led = 1 : Else : Led = 0 : End If ' off
End If
End If
Incr Tled : If Tled > 10 Then Tled = 0
Loop
End
'------------------------------------------------------------------------------------
Btn:
For I = 1 To 50
Toggle Led : Waitms 200 : Reset Watchdog
Next
Gosub Test
'Gifr = 0
M = A : Shift M , Right , 3 : M = A -m : Em = M : T = Tmax
'Tled = 0 : Control = 0
Set Led ': Waitms 2000 : Reset Led : Waitms 1000
Do : Loop
Return
'-----------------------------------------------------------------------------------
Test:
Trigger = 1 'даем импульс на ногу Portd.4 длительностью 15 мкс
Waitus 15
Trigger = 0
Waitus 10
Pulsein A , Pinb , 4 , 1 'ловим импульс высокого уровня
Return
'-----------------------------------------------------------------------------------
Re: BASCOM AVR в вопросах и ответах
Можно примитивноShershnyov писал(а): ...
появилось препятствие реле замкнулось, и после выхода препятствия из зоны датчика, реле определенное время еще замкнуто. Необходимо реализовать задержку перед включением реле. То есть препятствие появилось прошло определенное время, реле замкнулось, препятствие вышло из зоны датчика, реле определенное время еще замкнуто.
...
Код: Выделить всё
Wait 1 'ждем 2 секунды Вот накидал приблизительный код
Код: Выделить всё
Dim Delay_off as Byte 'объявили переменную
'=============== НАСТРОЙКА ТАЙМЕРА ===============
Config Timer0 = Timer , Prescale = 1024
On Timer0 Delay_timer ' таймер задержки
Enable Interrupts
Enable Timer0
Start Timer0
'1024/9600000 * 255 = 0,0272мкс * 1000 = 27,2мс
Do
...
...
If Delay_off >= 73 Then 'задержка2 сек.
'1 сек. = 1000мс / 27,2 = 36,7 тактов * 2 сек = 73
' т.е. при определенном условии будет увеличиватся переменная Delay_off
'и по достижении 73 включится светик
Led = 1 'включаем условный светик
waitms 300
Led = 0 'выключаем условный светик
Delay_off = 0 'обнуляем переменную
End If 'конец условия
Loop
'/// ---> Delay_timer
Delay_timer: 'метка
If ... Then 'тут наше условие
Incr Delay_off 'инкрементируем переменную задержки выключения
End If 'конец условия
If Delay_off = 75 Then Delay_off = 0 'чтобы счетчик не считал много и долго, обнуляем значение Delay_off
Return
-
Shershnyov
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Чт фев 07, 2013 10:46:46
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
У меня получилось вот так, но этот код не могу откомпилировать т.к. Вылазит ошибка Error 344 Programm will overwrite bootloader Т.к. я новичек то и сам точно сказать не могу все ли верно я написал.
Код: Выделить всё
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 0 ' default use 32 for the hardware stack
$swstack = 0 ' default use 10 for the SW stack
$framesize = 0
Config Portb.3 = Output 'выход для подключения ноги Trigger
Trigger Alias Portb.3
Trigger = 0
Config Portb.4 = Input 'вход для импульса Echo
Config Portb.0 = Output 'конфигурация для подключения светодиода
Led Alias Portb.0
Led = 0
Config Portb.1 = Output 'output control pin
Control Alias Portb.1
Control = 0
Config Portb.2 = Input 'вход для button
Dim A As Word , A2 As Word 'сюда копируется значение длины сигнала
Dim M As Word , Em As Eram Word
Dim I As Byte , T As Word , Tled As Byte
Const Toff = 50 '250=1min '500 'TIME to OFF
Const Tmax = 50000
Const Ton = 50
Enable Interrupts 'enable global ints
Enable Pcint0 'we enable pcint0 as this has pcint0-pcint7
On Pcint0 Btn 'we jump to this label when one of the pins is changed
Pcmsk = &B00000100 'enable pcint2 (portb.2)
Config Watchdog = 1024 '8192 '2048
M = Em : T = Tmax : Tled = 0 : Control = 0 : Led = 0
Start Watchdog
Do
Reset Watchdog
Gosub Test
A2 = A
Waitms 100
Reset Watchdog
Gosub Test
Waitms 100
If A < M And A2 < M And A > 0 And A2 > 0 Then
T = 0 ': Led = 1
Else
Incr T ' : Led = 0
If T > Tmax Then T = Tmax
End If
If T > Ton Then
Control = 0
Else
Control = 1
End If
If T < Toff Then
Control = 1
Else
Control = 0
End If
If T > 50 Then
If Tled < 9 Then : Led = 1 : Else : Led = 0 : End If ' on
Else
If T < Toff Then
If Tled < 5 Then : Led = 1 : Else : Led = 0 : End If ' last minute
Else
If Tled < 1 Then : Led = 1 : Else : Led = 0 : End If ' off
End If
End If
Incr Tled : If Tled > 10 Then Tled = 0
Loop
End
'------------------------------------------------------------------------------------
Btn:
For I = 1 To 50
Toggle Led : Waitms 200 : Reset Watchdog
Next
Gosub Test
'Gifr = 0
M = A : Shift M , Right , 3 : M = A -m : Em = M : T = Tmax
'Tled = 0 : Control = 0
Set Led ': Waitms 2000 : Reset Led : Waitms 1000
Do : Loop
Return
'-----------------------------------------------------------------------------------
Test:
Trigger = 1 'даем импульс на ногу Portd.4 длительностью 15 мкс
Waitus 15
Trigger = 0
Waitus 10
Pulsein A , Pinb , 4 , 1 'ловим импульс высокого уровня
Return
Re: BASCOM AVR в вопросах и ответах
Вы не указали размеры стэка $hwstack = 0, $swstack = 0, $framesize = 0Shershnyov писал(а):У меня получилось вот так, но этот код не могу откомпилировать т.к. Вылазит ошибка Error 344 Programm will overwrite bootloader Т.к. я новичек то и сам точно сказать не могу все ли верно я написал.
Код: Выделить всё
$regfile = "attiny13.dat" $crystal = 9600000 $hwstack = 0 ' default use 32 for the hardware stack $swstack = 0 ' default use 10 for the SW stack $framesize = 0
т.е. это во вкладке баскома настраивается.
Сделайте так
Код: Выделить всё
$regfile = "attiny13.dat" 'specify the used micro
$crystal = 9600000 'used crystal frequency
$hwstack = 32 'default use 32 for the hardware stack
$swstack = 8 'default use 8 for the SW stack
$framesize = 16 'default use 40 for the frame space-
Shershnyov
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Чт фев 07, 2013 10:46:46
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Так две ошибкиСделайте так
Код: Выделить всё
$regfile = "attiny13.dat" 'specify the used micro $crystal = 9600000 'used crystal frequency $hwstack = 32 'default use 32 for the hardware stack $swstack = 8 'default use 8 for the SW stack $framesize = 16 'default use 40 for the frame space
Re: BASCOM AVR в вопросах и ответах
1. Ищите ошибки в кодеShershnyov писал(а):Так две ошибки22 Out of SRAM space и 36 Assigmet error
2. Оптимизруйте код или замените МК - об этом говорит ошибка Out of SRAM space
Просмотрел код из последнего Вашего поста.
Выше не активировали и не настроили таймер, не объявили переменную Delay_off
Re: BASCOM AVR в вопросах и ответах
Доброго времени!
Подскажите в какое направление копать. Хочу реализовать диммер на 8 каналов на основе Atmega8, диммировать нужно 220В 2-5А.
Благодарю за внимание.
Подскажите в какое направление копать. Хочу реализовать диммер на 8 каналов на основе Atmega8, диммировать нужно 220В 2-5А.
Благодарю за внимание.
Re: BASCOM AVR в вопросах и ответах
AlekseyV,
а сильно ли точно надо ? и нужен ли контроль перехода через 0 ?
я бы взял таймер и при переполнении дал бы разрешение на включение 8-ми оптопар (moc3063 с контролем нуля или другую без оного) + какой-нибудь bt139, а выключал бы в цикле по приблизительному сравнению
а сильно ли точно надо ? и нужен ли контроль перехода через 0 ?
я бы взял таймер и при переполнении дал бы разрешение на включение 8-ми оптопар (moc3063 с контролем нуля или другую без оного) + какой-нибудь bt139, а выключал бы в цикле по приблизительному сравнению
Спойлер
Код: Выделить всё
on ovf1 label
dim rasr as bit
do
if razr =1 then
razr=0
portb = &b11111111
end if
if tim0 >TIMER1 then portb.0 =0 ' переменные tim0-tim7 задают ширину ШИМ, на выходах порта B от 0 до 7 соответственно
if tim1 >TIMER1 then portb.1 =0
........
if tim7 >TIMER1 then portb.7 = 0
loop
label:
timer1 = 10000 ' настроить по-вкусу, определяет частоту ШИМ
razr=1
return
-
pavel1979
- Мучитель микросхем
- Сообщения: 494
- Зарегистрирован: Пн авг 12, 2013 19:07:47
- Откуда: башкирия мелеуз
Re: BASCOM AVR в вопросах и ответах
Скорее всего тут без этого не обойтись...иначе приемники и телеки рядом начнут глючить...
заводим переменные,8 штук по числу нагрузок,и вперед!!!
прерывние от сети=100 гц(заводим внешнее,как будто с кнопки дрыгаем лапой с частотой 100 гц)
пусть будет нагр1,нагр2,нагр3,...,нагр8
в основном цикле меняем переменную нагр1...8 как нам надо от 0 до 256(например нагр1=75-75 процентов,нагр2=20-20проц и т д),например кнопками
в прерывании,в которой увеличиваем переменную SRAB(срабатывание,так назвал переменную,можно и по другому,восьмиразрядная BYTE,как только SRAB>99 приравниваем ей 0) на 1(на один больше),и уходим на подпрограмму
IF нагр1>SRAB THEN SET PORT.... ELSE RESET PORT...
IF нагр2>SRAB THEN SET PORT.... ELSE RESET PORT...
...
IF нагр8>SRAB THEN SET PORT.... ELSE RESET PORT...
немного сегодня того-днюха,если что-поправьте
давайте схему,лучше в протеусе,напишем!
заводим переменные,8 штук по числу нагрузок,и вперед!!!
прерывние от сети=100 гц(заводим внешнее,как будто с кнопки дрыгаем лапой с частотой 100 гц)
пусть будет нагр1,нагр2,нагр3,...,нагр8
в основном цикле меняем переменную нагр1...8 как нам надо от 0 до 256(например нагр1=75-75 процентов,нагр2=20-20проц и т д),например кнопками
в прерывании,в которой увеличиваем переменную SRAB(срабатывание,так назвал переменную,можно и по другому,восьмиразрядная BYTE,как только SRAB>99 приравниваем ей 0) на 1(на один больше),и уходим на подпрограмму
IF нагр1>SRAB THEN SET PORT.... ELSE RESET PORT...
IF нагр2>SRAB THEN SET PORT.... ELSE RESET PORT...
...
IF нагр8>SRAB THEN SET PORT.... ELSE RESET PORT...
немного сегодня того-днюха,если что-поправьте
давайте схему,лучше в протеусе,напишем!
Re: BASCOM AVR в вопросах и ответах
pavel1979,
Думаю, мы предполагаем что-то вроде такого - http://avrproject.ru/publ/setevoj_dimme ... /4-1-0-140 ?
Другой вопрос, как сделать помимо 3-4 ШИМ, 8 ШИМ на Atmega8. Каждым управлять отдельно (энкодер, кнопка по порядку - это не вопрос). Схему в протеусе попробую сделать вечером (по этому примеру - файл подтянул к посту).
С праздником Вас!
Думаю, мы предполагаем что-то вроде такого - http://avrproject.ru/publ/setevoj_dimme ... /4-1-0-140 ?
Другой вопрос, как сделать помимо 3-4 ШИМ, 8 ШИМ на Atmega8. Каждым управлять отдельно (энкодер, кнопка по порядку - это не вопрос). Схему в протеусе попробую сделать вечером (по этому примеру - файл подтянул к посту).
С праздником Вас!


