pavel1979 писал(а):
вот это и не могу сообразить,а variable постоянно должен изменяться если ручка резистора не в среднем положении,то есть чуть повернул ручку и убрал руку с ручки,variable меняется с шагом пропорциональным повороту ручки,повернули ручку сильнее и отпустили руку-variable меняется быстрее,повернули ручку в среднее положение-variable не меняется,ручки с небольшой фиксацией в середине,используется в автомагнитолах старых на "балансе"
Повторюсь... Вижу только 2 выхода:
1. Разбить значение АЦП на 2 части и измерить время пребывания в каждой части, затем увеличивать степ от времени пребывания в этом диапазоне ЦАП
Пример: крутанули ручку вправо и не важно насколько, идет инкремент переменной с шагом 5, параллельно идет отсчет времени, если засиделись "тут" надолго, то другая переменная увеличивает степ в 2 раза);
или
2. Разбить значение АЦП не на 4, а на 5 или 10 частей и присваивать каждому значению (пределу) АЦП свой степ инкрементирования/декрементирования.
В таком случае не нужно подсчитывать время нахождения в данном пределе (значении ЦАП).
pavel1979 писал(а):
...
использовать в данном случае энкодер не удобно-variable должен меняться от0 до 65535 с шагом 1,долго крутить
С энкодерами не работал.
Можно как-то умножить значение, как-то выставить множитель "поворота" ручки, чтобы долго не крутить
Кстати, можно попробовать многооборотный потенциометр
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт сен 26, 2013 10:14:04
pavel1979
попробовал,но както глючно работает,буду дальше мучать
еще вопрос-хотел подключить к тини2313 тюнер по и2с,но у тини есть только SDA,а SCL нету,значит тини в и2с не работает?или можно назначить любые другие порты?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт сен 26, 2013 12:22:24
kip96
В Баскоме, любые порты можно на и2с назначить.
Идея с резистором понравилась. Я бы ещё доработал бы его, что бы на "0"(центр) возвращался сам.
Програмно вообще сделал бы так-
нужно изменять переменную А
измеряем ацп, х=512-ацп, a=а+х. Шаг можно уменьшить, если 512 много, делением на 10 например., тогда максимальный шаг будет 5, или делить на 5-макс. шаг=10.Ну и т. д.
Код существенно сократится, и плавность шага можно регулировать вплоть до 512-ти шагов.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт сен 26, 2013 13:00:32
pavel1979
в том то и дело что надо как-то корректно контролировать угол поворота ручки,тогда и проще,и дешевле
никак не получается и2с,вот пример управление с пульта NEC для атмега8 работает,а эта же упрощенная-переделанная с тини2313 не хочет,порты sda=d.5,scl=d.4
Спойлер'*******************************************************************************
$regfile = "m8def.dat"
$crystal = 8000000 '?????????? ?????????
Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.1 , Db7 = Portb.0
'*****************************настройка пульта**************************************************
Config Pind.2 = Input 'вход с пульта
'Config Portc.2 = Output
Config Timer0 = Timer , Prescale = 256 '8000000/256=31250 Hz
Config Int0 = Falling '
Stop Timer0 '
Enable Timer0 '
Enable Int0 '
Enable Interrupts '
On Timer0 Tikers '?????? ?? ???????
On Int0 Infrared '?????? ?? ??????????
Dim Tik As Word '??????? ????? ???????
Dim Byt As Byte '??????? ???????? ???
Dim Repeat_flag As Bit '???? ???????
Dim Start_flag As Bit '???? ?????????? ???????
Dim Address As Byte '???? ??????
Dim Command As Byte '???? ???????
Dim Address_1 As Byte '?????? ???? ??????
Dim Command_1 As Byte '?????? ???? ???????
Dim Address_0 As Byte '????????? ???? ??????
Dim Command_0 As Byte '????????? ???? ???????
Dim Summa As Word
'*****************************настройка перемнных и портов**************************************************
Config Portd = Input ' подтяжки
Config Sda = Portc.4 '???????????? ?????? I2c
Config Scl = Portc.5
Config I2cdelay = 10
Config Watchdog = 2048
Dim F As Long ' частота
Dim X As Byte 'объявление переменной для for-to
Dim Fh As Integer 'ШАГ
Dim Ch As Byte 'объявление переменных .канал номер
Dim Chkopi As Byte 'объявление переменных .канал номер
Dim K As Long ' коэф деления
Dim Kkopi As Long ' коэф деления копия
Dim Ka As Long ' коэф деления
Dim Kb As Long ' коэф деления
Dim Pam(32) As Eram Long 'ПАМЯТЬ КАНАЛОВ 32 ШТУК,мне доступно 1-30 каналы,32-дежурная для запоминания частоты при вкл-выкл приемника
'Dim Fkopi As Long ' частота копия
Dim Band As Byte 'диапазон
'Dim Pst As String * 6
Mem Alias Pind.4
Ex Alias Pind.5
Plus Alias Pind.6
Minus Alias Pind.7
'*****************************константы**************************************************
Const K0 = 3770 'определение констант частота пч
Const Kmin = 1514 'определение констант минимальный делитель 38 мгц
Const Kmax = 17754 'определение констант максимальный делитель 170 мгц
Const__gainoff Alias &B10001000
Const__gainon Alias &B10001001 ' Weak Signal Booster On
Const__loband Alias &B00000001
Const__miband Alias &B00000010
Const__hiband Alias &B00001100
'*****************************подпрограммы**************************************************
Declare Sub Knopki
Declare Sub Hag
Declare Sub Tuner
Declare Sub Vpamjat
Declare Sub Vvod
Declare Sub Pamjat
'********************************настройка при включении***********************************************
Pam(32) = 2776
K = Pam(32) 'дежурная частота
Ch = 0
Pam(1) = 2660
Pam(2) = 2720
Pam(3) = 2734
Pam(4) = 2746
Pam(5) = 2758
Pam(6) = 2766
Pam(7) = 2776
Pam(8) = 2804
Pam(9) = 2886
Pam(10) = 2896
Call Tuner
Locate 1 , 1
Lcd "M-45-RC5"
Waitms 500
For X = 1 To 8
Locate 1 , X
Lcd " "
Waitms 100
Next X
'********************************основная программа***********************************************
Cls
Cursor Off
Do
'???????? ????
Label1:
Start Watchdog
Chkopi = Ch
If Command = 98 Then Ch = 1
If Command = 34 Then Ch = 2
If Command = 64 Then Ch = 3
If Command = 162 Then Ch = 4
If Command = 224 Then Ch = 5
If Command = 96 Then Ch = 6
If Command = 210 Then Ch = 7
If Command = 82 Then Ch = 8
If Command = 160 Then Ch = 9
If Command = 18 Then Ch = 10
If Command = 80 Then Call Vpamjat
If Command = 208 Then
Label2:
If Command = 0 Then Ch = Ch + 1 Else Goto Label2
End If
If Command = 50 Then
Label3:
If Command = 0 Then Ch = Ch - 1 Else Goto Label3
End If
If Command = 144 Then
K = K + 1
Ch = 30
Pam(ch) = K
Call Tuner
End If
If Command = 242 Then
K = K - 1
Ch = 30
Pam(32) = K
Pam(ch) = K
Call Tuner
End If
Reset Watchdog
'If Command = 249 Then
'Stop Watchdog
If Command = 66 Then
Stop Watchdog
Cls
Wait 1
Idle
End If
If Chkopi <> Ch Then Call Pamjat 'Else Goto Label1 '???????? ???
If Command = 178 Then
Call Vvod
Ka = K
F = F + 3770
K = F / 5
Ch = 30
Pam(32) = K
Pam(30) = K
Call Tuner
Wait 1
End If
'????????? ??????
F = K * 5
F = F - 3770
If Tik >= 139 And Tik < 150 Then '???? ????????? ?? 139 ?? 150 ????? - "?????"
Address = 1
Repeat_flag = 0
Start_flag = 1
Address_1 = 0
Command_1 = 0
Address_0 = 0
Command_0 = 0
End If
If Tik >= 116 And Tik < 139 Then '???? ????????? ?? 116 ?? 138 ????? - "??????"
Address = 2
Repeat_flag = 1
Start_flag = 0
End If
If Tik >= 22 And Tik < 116 And Start_flag = 1 Then '???? ????????? ?? 22 ?? 115 ????? - ??????? "1"
Incr Byt
If Byt < 9 Then
Shift Address_1 , Left
Address_1 = Address_1 + 1
End If
If Byt >= 9 And Byt < 17 Then
Shift Address_0 , Left
Address_0 = Address_0 + 1
End If
If Byt >= 17 And Byt < 25 Then
Shift Command_1 , Left
Command_1 = Command_1 + 1
End If
If Byt >= 25 Then
Shift Command_0 , Left
Command_0 = Command_0 + 1
End If
End If
If Tik >= 10 And Tik < 22 And Start_flag = 1 Then '???? ????????? ?? 10 ?? 21 ???? - ??????? "0"
Incr Byt
If Byt < 9 Then
Shift Address_1 , Left
End If
If Byt >= 9 And Byt < 17 Then
Shift Address_0 , Left
End If
If Byt >= 17 And Byt < 25 Then
Shift Command_1 , Left
End If
If Byt >= 25 Then
Shift Command_0 , Left
End If
End If
Tik = 0
If Byt = 32 Then '???? ??????? 4 ?????, ????????? ???????????? ?????? ???????
'???? ????? ??? ??????? 16-??????, ???????? ?? ????????, ??????? ????????????????
'Summa = Address_0 + Address_1
'If Summa = 255 Then
Address = Address_1
'Else
'Address = 0
'End If
'Summa = Command_0 + Command_1
'If Summa = 255 Then
Command = Command_1
'Else
'Command = 0
'End If
Byt = 0
Repeat_flag = 0
Start_flag = 0
Stop Timer0 '????????????? ??????
End If
'Waitms 100
Return
'****************************передача по и2с***************************************************
'------вот тот кусок который и отвечает за и2с,никак в тини2313 не заработает,проверяю в железе-----------
Sub Tuner
Band = Const__loband
If K > 3664 Then Band = Const__miband
If K > 9554 Then Band = Const__hiband
'Frcvwork = 98300 '
Ka = K / 256
Kkopi = Ka * 256
Kb = K - Kkopi
I2cstart
I2cwbyte &B11000000 'Tuner Address
I2cwbyte Ka
I2cwbyte Kb
I2cwbyte Const__gainon ' Const__gainon : Const__gainoff);
I2cwbyte Band
I2cstop
End Sub
'****************************вызов из памяти***************************************************
Sub Pamjat
If Ch > 30 Then Ch = 1
If Ch < 1 Then Ch = 30
K = Pam(ch)
If K < Kmin Then
K = Kmax
Pam(ch) = K
End If
If K > Kmax Then
K = Kmin
Pam(ch) = K
End If
Call Tuner
Goto Label1
End Sub
'Lcd Chr() ; Chr() ; Chr() ; Chr() ; Chr() ; Chr() ; Chr();
'*****************************запись в память**************************************************
Sub Vpamjat
Cls
Locate 1 , 1
Lcd "M-E-H-U!"
Waitms 300
Do
Reset Watchdog
'Start Watchdog
Locate 1 , 1
Lcd "F=" ; F ; " "
Locate 2 , 1
Lcd "CH=" ; Ch ; " "
' If Command = 208 Then
'Label2:
'If Command = 208 Then
' Waitms 10
' Label6:
If Command = 208 Then
Ch = Ch + 1
Command = 0
Waitms 200
End If
'If Command = 50 Then
'Label3:
'If Command = 50 Then
' Waitms 10
'Label7:
If Command = 50 Then
Ch = Ch - 1 'Else Goto Label7
Command = 0
Waitms 200
End If
If Command = 144 Then
Command = 0
K = K + 1
'Ch = 30
Pam(32) = K
' Call Tuner
Waitms 75
End If
If Command = 242 Then
Command = 0
K = K - 1
'Ch = 30
Pam(32) = K
'
'
Waitms 75
End If
If Ch > 30 Then Ch = 30
If Ch < 1 Then Ch = 1
If K > Kmax Then K = Kmin
If K < Kmin Then K = Kmax
F = K * 5
F = F - 3770
Call Tuner
If Command = 178 Then
Waitms 100
If Command = 178 Then
Pam(ch) = K
Cls
Locate 1 , 1
Lcd "coxp OK!" ; " "
Locate 2 , 1
Lcd F ; "=>" ; Ch ; " "
Wait 1
'Until Command = 0
End If
End If
If Command = 114 Then
Waitms 100
If Command = 114 Then
Cls
Locate 1 , 1
Lcd "OTMEHA!!"
Wait 1
Cls
Goto Label1
End If
End If
'Stop Watchdog
Reset Watchdog
'If Command <> 0 Then Goto Label4
Loop
End Sub
'*****************************ввод частоты **************************************************
Sub Vvod
Cls
F = 0
Locate 1 , 1
Lcd "F=" ; F ; " "
For K = 1 To 5
Label4:
X = 0
If Command = 98 Then X = 1
If Command = 34 Then X = 2
If Command = 64 Then X = 3
If Command = 162 Then X = 4
If Command = 224 Then X = 5
If Command = 96 Then X = 6
If Command = 210 Then X = 7
If Command = 82 Then X = 8
If Command = 160 Then X = 9
If Command = 18 Then X = 10
Reset Watchdog
If X = 0 Then Goto Label4
If K = 1 And X <> 10 Then
F = X
Locate 1 , 1
Lcd "F=" ; F ; "____ "
End If
If K = 1 And X = 10 Then
F = 0
Locate 1 , 1
Lcd "F=" ; F ; "____ "
End If
If K = 2 And X <> 10 Then
F = F * 10
F = F + X
Locate 1 , 1
Lcd "F=" ; F ; " "
End If
If K = 2 And X = 10 Then
F = F * 10
'F = F + X
Locate 1 , 1
Lcd "F=" ; F ; " "
End If
If K = 3 And X <> 10 Then
F = F * 10
F = F + X
Locate 1 , 1
Lcd "F=" ; F ; " "
End If
If K = 3 And X = 10 Then
F = F * 10
'F = F + X
Locate 1 , 1
Lcd "F=" ; F ; " "
End If
If K = 4 And X <> 10 Then
F = F * 10
F = F + X
Locate 1 , 1
Lcd "F=" ; F ; " "
End If
If K = 4 And X = 10 Then
F = F * 10
'F = F + X
Locate 1 , 1
Lcd "F=" ; F ; " "
End If
If K = 5 And X <> 10 Then
F = F * 10
F = F + X
Locate 1 , 1
Lcd "F=" ; F ; " "
End If
If K = 5 And X = 10 Then
F = F * 10
'F = F + X
Locate 1 , 1
Lcd "F=" ; F ; " "
End If
Label5:
Waitms 75
If Command > 0 Then Goto Label5
Next K
If F < 3800 Then F = 3800
If F > 85000 Then F = 85000
Locate 1 , 1
Lcd "F=" ; F ; " "
Locate 2 , 1
Lcd "--OK!-- "
End Sub
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт сен 26, 2013 13:19:58
pavel1979
ну и само железо"
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт сен 26, 2013 14:01:31
pavel1979
ну и сам проект тини2313-управление по и2с,частота задана в упор 101,1 мгц,что может быть не так?sda и scl переключил на B.5 и B.7 соответственно
Спойлер$regfile = "attiny2313a.dat" 'íàñòðîéêè
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$regfile = "m8def.dat"
$crystal = 8000000
'Wait 3
$hwstack = 40
$swstack = 60
$framesize = 40
Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.2 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'конфигурация АЦП
Dim A As Long
Dim X As Long
Dim W As Word
Dim Times As Word
Cursor Off Noblink
Do
W = Getadc(3)
If W > 542 Then Incr A
If W < 478 Then Decr A
X = 512 - W
'W = X
X = Abs(x)
Times = X
Times = 600 - Times
Cls
Lcd A
Waitms Times
Loop
End
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт сен 26, 2013 19:26:10
Dnepr_1186
Товарищи, помогите округлить число в баском. Выдает такое 4,56535341 а хотелось бы оставить только 4,6. Каким оператором это сделать?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт сен 26, 2013 20:01:17
pavel1979
kip96 вау,спасибо!а все никак не мог понять-как это изменять время!!! попробую
Dnepr_1186
x=4,56535341
x=x*10
x=int(x)
x=x/10
Dim Any As Single
Dim Ccc As String * 4
.....
Any = Chvar_3 / 6.0176
Any = Fusing(any , "#.#")
Ccc = Str(any)
Ccc = Ccc + "V "
Посмотрите, может что не так? Вывожу потом на экран нокия 3310
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт сен 27, 2013 20:40:01
Adagumer
Может так лучше будет
Ссс = Fusing(any , "#.#")
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт сен 27, 2013 21:54:07
Dnepr_1186
Спасибо, заработало!
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт сен 27, 2013 22:11:31
Dnepr_1186
pavel1979 писал(а):kip96 вау,спасибо!а все никак не мог понять-как это изменять время!!! попробую
Dnepr_1186
x=4,56535341
x=x*10
x=int(x)
x=x/10
спасибо, оригинальный способ
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб сен 28, 2013 08:30:27
KOTик
pavel1979, вот видел, получилось
А вы переживали
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс сен 29, 2013 15:48:43
pavel1979
KOTик писал(а):pavel1979А вы переживали
да уж,теперь новые проблемы-решил задействовать часы на PCF8583,часы-мин-сек я извлек без проьлем,а вот дату-год-день недели какая-то абра-кадабра получается,пример http://www.pomorska-sola.si/elektro/Izd ... CF8583.htm
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 00:11:51
KOTик
уважаемые коты! Как реализовать двойное нажатие?
- нажал на кнопку - лед не горит.
- если нажал еще раз в теч. эНННго времени (например, повторное нажатие в теч. 3 сек.) - то загорелась.
- если в теч. 3сек. повторного нажатия не было, обнуляем счетчик и выходим из обработчика. Ждем следующего первого нажатия и т.д.
Пытался сделать примитивней через Waitms - работает, но не то
А вот так, че-то не пашет
...
Debounce PINB.4 , 1, Double_click, Sub
....
Double_click:
Waitms 50
If Pinb.4 = 1 Then
Waitms 50
For Wtime = 0 To 3
Incr Wtime
If Wtime = 3 Then 'время ожидания второго нажатия
'Waitms 50
Led = 1 'включили
Else
Led = 0 'выключили
Wtime = 0 'если в теч. 3сек. повторного нажатия не было, обнуляем
Next
End If
End If
Gifr = 64
Waitms 50
Return
....
Скажите, где что не так.
Может у кого примерчик с комментариями имеется - для разбора самое то.
Буду признателен
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 04:46:13
vem566
Переменная Wtime увеличивается, но ничем не управляет. Или не весь код.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 30, 2013 08:58:01
KOTик
vem566 писал(а):Переменная Wtime увеличивается, но ничем не управляет. Или не весь код.