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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

pavel1979 писал(а):может в цикле считать число нажатий?после выхода из цикла делаем условия...

Тоже об этом подумываю. Ща заведу еще одну переменную. Посмотрим, что выйдет
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

Вроде работает, но криво и имеются косяки:
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 в вопросах и ответах

Сообщение 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
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

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


Не пашет :( Погонял в протеусе OBJ файл.
Первое нажатие не инкрементирует Click, запускается 2 секундный цикл в теч. которого ждем второго нажатия.
А вот последующие нажатия инкрементируют Click с бешенным шагом - 20-30, но не по одному.
А это значение, естественно не попадает под условие в основном цикле If Click = 4 Then... включаем светик.
Переписал строчку Incr Click в Click = Click + 1, убрал цикл For/Next, даже проверку второго нажатия убрал - не хочет работать :kill:
Может как-то связать с отпусканием кнопки?
Т.е. нажатие кнопки инкрементирует переменную 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 в вопросах и ответах

Сообщение pavel1979 »

Давай весь исходник и протеус,покумекаю... интересно стало
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

pavel1979 писал(а):Давай весь исходник и протеус,покумекаю... интересно стало

triple_click.zip
тройное нажатие
(21.3 КБ) 211 скачиваний
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

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

Сообщение pavel1979 »

вот пробуй
Вложения
triple_click1.rar
(705 байт) 238 скачиваний
Аватара пользователя
Dnepr_1186
Потрогал лапой паяльник
Сообщения: 398
Зарегистрирован: Чт мар 26, 2009 20:53:27
Откуда: Беларусь.Минская обл.

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

Сообщение Dnepr_1186 »

Люди, кто нибудь работал с графическим ЖКИ на контроллере KS0108 и аналогах в Bascom? Может есть примеры и библиотеки?
Аватара пользователя
Moto_v3x
Потрогал лапой паяльник
Сообщения: 307
Зарегистрирован: Ср мар 31, 2010 11:45:58
Откуда: Славянск

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

Сообщение Moto_v3x »

Dnepr_1186 работали, а чем вас не устраивает встроенная библиотека и примеры с оф. сайта

http://www.mcselec.com/index.php?option ... &Itemid=57
http://www.mcselec.com/index.php?option ... &Itemid=57
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

pavel1979 писал(а):вот пробуй

Только лапы добрались :)
Кстати, я тоже добавлял label2 для обработки последующих нажатий, но у меня че-то не пошло
Мррррр
Большое спасибо! :))
Самое то.
Shershnyov
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Чт фев 07, 2013 10:46:46
Контактная информация:

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

Сообщение Shershnyov »

Помогите пожалуйста оптимизировать код под 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
'----------
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

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 в вопросах и ответах

Сообщение Shershnyov »

У меня получилось вот так, но этот код не могу откомпилировать т.к. Вылазит ошибка 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
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

Shershnyov писал(а):У меня получилось вот так, но этот код не могу откомпилировать т.к. Вылазит ошибка 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


Вы не указали размеры стэка $hwstack = 0, $swstack = 0, $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 в вопросах и ответах

Сообщение Shershnyov »

Сделайте так

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

$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


Так две ошибки :)) 22 Out of SRAM space и 36 Assigmet error
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

Сообщение KOTик »

Shershnyov писал(а):
Так две ошибки :)) 22 Out of SRAM space и 36 Assigmet error

1. Ищите ошибки в коде
2. Оптимизруйте код или замените МК - об этом говорит ошибка Out of SRAM space

Просмотрел код из последнего Вашего поста.
Выше не активировали и не настроили таймер, не объявили переменную Delay_off
AlekseyV
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

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

Сообщение AlekseyV »

Доброго времени!
Подскажите в какое направление копать. Хочу реализовать диммер на 8 каналов на основе Atmega8, диммировать нужно 220В 2-5А.
Благодарю за внимание.
_Vasilij_
Встал на лапы
Сообщения: 124
Зарегистрирован: Пт янв 25, 2013 02:48:32

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

Сообщение _Vasilij_ »

AlekseyV,
а сильно ли точно надо ? и нужен ли контроль перехода через 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 в вопросах и ответах

Сообщение pavel1979 »

Скорее всего тут без этого не обойтись...иначе приемники и телеки рядом начнут глючить...

заводим переменные,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...
немного сегодня того-днюха,если что-поправьте
давайте схему,лучше в протеусе,напишем!
AlekseyV
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

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

Сообщение AlekseyV »

pavel1979,
Думаю, мы предполагаем что-то вроде такого - http://avrproject.ru/publ/setevoj_dimme ... /4-1-0-140 ?
Другой вопрос, как сделать помимо 3-4 ШИМ, 8 ШИМ на Atmega8. Каждым управлять отдельно (энкодер, кнопка по порядку - это не вопрос). Схему в протеусе попробую сделать вечером (по этому примеру - файл подтянул к посту).
С праздником Вас!
dimmer.zip
(65.53 КБ) 207 скачиваний
Ответить

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