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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

Так вот теперь нужно, чтобы индицировалось не напряжение, а проценты заряда аккумулятора. Допустим, максимальное напряжение на полностью заряженном аккумуляторе - 7,53 В, а измеренное значение на клеммах, при отключенном источнике зарядного тока - 6.14 В. Ну, допустим, поставлю я на входе делитель, подсчитаю коэффициент, на который надо умножить переменную Result, а как в процентах подсчитать, чего-то до меня не доходит... Извиняюсь за тупость... :oops:
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

К слову, если Вы решили сохранять вручную регистры в обработке прерывания АЦП, то пропишите в метке NOSAVE. Иначе толку нет совсем никакого, без нее он и так все регистры в стеке сохраняет. Если без этих заморочек то обработка будет гораздо проще:

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

Adc_isr:

  Result = Getadc(ch)

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

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

Сообщение edm2007 »

edm2007 писал(а):Так вот теперь нужно, чтобы индицировалось не напряжение, а проценты заряда аккумулятора.


Так а что нужно, чтобы при отключеной от сети зарядке она показывала процент заряда аккумулятора а при подключении к сети напряжение? Или как? Или даже при зарядке надо показывать проценты?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

Нет, немного не так. Вот кусок кода, я добавил переменную Res1 и подсчет процентов (как мне казалось, правильно). 1500 миллисекунд - U, 1500 миллисекунд %. И так по кругу. Только вот показывает при тех же 4.76 В на входе, 10% заряда, хотя Umax выставлено всего 7.53 В. Что не так?

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

Do
Stop Timer0
Start Adc
Idle
Stop Adc
Start Timer0
Dp_flag1 = 0
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0

Result = Result * K
Result = Result / 1024
If Result >= 100 Then Chislo(3) = Result / 100 Else Chislo(3) = 11
Result = Result Mod 100
Chislo(2) = Result / 10
Chislo(1) = Result Mod 10
Chislo(4) = 12
Dp_flag3 = 1
If Result > Umax Then
   Dp_flag3 = 0
   Chislo(1) = 10
   Chislo(2) = 10
   Chislo(3) = 10
   Chislo(4) = 10
End If
Waitms 1500
Res1 = Result * 100
Res1 = Res1 / Umax
If Res1 >= 100 Then Chislo(3) = 1 Else Chislo(3) = 11
Res1 = Res1 Mod 100
Chislo(2) = Res1 / 10
Chislo(1) = Res1 Mod 10
Chislo(4) = 13
Dp_flag3 = 0
Dp_flag4 = 1
Waitms 1500
Loop

End
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

Все, сделал! Расчет перенес в начало, сразу после возврата из прерывания ADC. Теперь все правильно - показывает 53%.

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

Do
Stop Timer0
Start Adc
Idle
Stop Adc
Start Timer0
Dp_flag1 = 0
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
Res1 = Result * 5
Res1 = Res1 / 1024
Res1 = Res1 * 10000
Res1 = Res1 / Umax
Result = Result * K
Result = Result / 1024
If Result >= 100 Then Chislo(3) = Result / 100 Else Chislo(3) = 11
Result = Result Mod 100
Chislo(2) = Result / 10
Chislo(1) = Result Mod 10
Chislo(4) = 12
Dp_flag3 = 1
If Result > Umax Then
   Dp_flag3 = 0
   Chislo(1) = 10
   Chislo(2) = 10
   Chislo(3) = 10
   Chislo(4) = 10
End If
Waitms 1500

If Res1 >= 100 Then Chislo(3) = 1 Else Chislo(3) = 11
Res1 = Res1 Mod 100
Chislo(2) = Res1 / 10
Chislo(1) = Res1 Mod 10
Chislo(4) = 13
Dp_flag3 = 0
Dp_flag4 = 1
Waitms 1500
Loop

End
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

А, попеременно проценты и напряжение... :) Только измените обновление индикации. У Вас сейчас при кварце 8 МГц и прескаллере 8 индикация обновляется каждые 0,255 мс. Это неоправданно быстро. Ей же еще обработаться нужно, а у Вас расчеты в основном цикле... Если прескаллер настроить на 64, то обновление будет каждые 2,04 мс (это около 500 Гц). Что более чем достаточно, зато основной цикл вздохнет свободно.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

Вот весь проект полностью. Прескалер менять не стал - для Протеуса и так сойдет, потом в железе, конечно поменяю. Все файлы с индексом 2 относятся к тини26, остальные - к меге8.
Вложения
zaryad.rar
(61.72 КБ) 241 скачивание
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

Все исходники есть, схема есть, осталось добавить делитель, дописать коэффициент и статья готова. Кто желает, можете пользоваться (в смысле, писать статью). Получается контроллер зарядного устройства для свинцовых гелевых аккумуляторов. В качестве источника зарядного тока можно использовать LM317. Только при измерении, LM317 надо отключать от аккумулятора. Это кто как желает. Можно использовать оставшийся в тини26 свободный порт. С мегой8 вообще проблем не будет - там свободных портов ваще завались... :)) 8)
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Нет уж. :)) Марафет надо наводить. Например, точки у Вас только в первом и во втором разряде. Значит нет нужды прописывать включение для третьего и четвертого разряда... :tea:
Последний раз редактировалось edm2007 Сб апр 16, 2011 12:59:11, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

Согласен, две точки лишние. Но так ведь и статью не я буду писать. Вот кто будет, тот и доработает. И прескалер лучше поставить 256 - развертка будет около 120 Гц - самое оно!
Кстати, убрать точки простым комментирование не удалось. Все гораздо сложнее. Или все горят или ни одной. О, как!
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Ну в принципе да, 100 - 500 Гц самое оно. Я бы 64 выставил. Золотая середина и для индикации и для расчетов. :) А кто это статью писать будет? Чья конструкция-то? :))
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

edm2007 писал(а):Кстати, убрать точки простым комментирование не удалось. Все гораздо сложнее. Или все горят или ни одной. О, как!


Разумеется. Раньше точка гасилась при включении разряда принудительно (Else Set Dp), потому как флаг был в 0. А тут мы комментируем это выключение, включаем точку и она переносится на другие разряды. Где теперь гашения нет. Можно так сделать:

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

' гасим разряды и точку до кучи
Reset Razr1 : Reset Razr2 : Reset Razr3 : Reset Razr4 : Set Dp
........
Select Case W
Case 1 : Set Razr1
Case 2 : Set Razr2
Case 3:
If Dp_flag3 = 1 Then Reset Dp
Set Razr3
Case 4:
If Dp_flag4 = 1 Then Reset Dp
Set Razr4
End Select
........     
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

edm2007 писал(а): А кто это статью писать будет? Чья конструкция-то? :))

Конструкция моя. Надо мне было контроллер заряда такой. Код, практически твой ну и чуть-чуть мой. Короче соавторство. Хочешь, статью можешь сам написать, мне просто некогда. Надо же все дорабатывать, оформлять как положено. Короче, в лом мне это дело. :)
Вот полностью исправленный код для ATtiny26:

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

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

'********************************************************************
Ddrb = &B01111111 : Portb = 0
Ddra = &B11110111 : Porta = 0
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer0 = Timer , Prescale = 256
Config Watchdog = 1024
'********************************************************************
'********************************************************************
Razr1 Alias Porta.1 : Razr2 Alias Porta.2
Razr3 Alias Porta.4 : Razr4 Alias Porta.5
A Alias Portb.0 : B Alias Portb.1 : C Alias Portb.2 : D Alias Portb.3
E Alias Portb.4 : F Alias Portb.5 : G Alias Portb.6 : Dp Alias Porta.7
Lm317 Alias Porta.6
'*********************************************************************
Dim Result As Long , Res1 As Word
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte
Dim Chislo(8) As Integer
Dim Dp_flag3 As Bit , Dp_flag4 As Bit
'*********************************************************************
Const K = 500
Const Umax = 753
'*********************************************************************
On Adc Adc_isr Nosave
On Timer0 Pulse
Enable Adc
Enable Timer0
Enable Interrupts
'*********************************************************************

Do
Reset Lm317
Waitms 50
Stop Timer0

Start Adc
Idle
Stop Adc

Set Lm317
Start Timer0
Dp_flag3 = 0
Dp_flag4 = 0
Res1 = Result * 5
Res1 = Res1 / 1024
Res1 = Res1 * 10e3
Res1 = Res1 / Umax
Result = Result * K
Result = Result / 1024
If Result >= 100 Then Chislo(3) = Result / 100 Else Chislo(3) = 11
Result = Result Mod 100
Chislo(2) = Result / 10
Chislo(1) = Result Mod 10
Chislo(4) = 12
Dp_flag3 = 1
If Result > Umax Then
   Dp_flag3 = 0
   Chislo(1) = 10
   Chislo(2) = 10
   Chislo(3) = 10
   Chislo(4) = 10
End If
Waitms 1500

If Res1 >= 100 Then Chislo(3) = 1 Else Chislo(3) = 11
Res1 = Res1 Mod 100
Chislo(2) = Res1 / 10
Chislo(1) = Res1 Mod 10
Chislo(4) = 13
Dp_flag3 = 0
Dp_flag4 = 1
Waitms 1500
Loop

End

Pulse:
Reset Watchdog
Stop Timer0

Reset Razr1 : Reset Razr2 : Reset Razr3 : Reset Razr4 : Set Dp
Incr W : If W > 4 Then W = 1
Y = 0
Gosub Look : A = Z
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z

Select Case W
Case 1 : Set Razr1
Case 2 : Set Razr2
Case 3:
If Dp_flag3 = 1 Then Reset Dp
Set Razr3
Case 4:
If Dp_flag4 = 1 Then Reset Dp
Set Razr4
End Select

Start Timer0
Return

Adc_isr:
Result = Getadc(0)
Return

Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z                               ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3...9,
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)
Return                                                      'возвращаемся на место откуда сюда прислали

Cifri:
'       |Chislo(i)                           |           # Символа |
Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '0
Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '1
Data 0 , 0 , 1 , 0 , 0 , 1 , 0                              '2
Data 0 , 0 , 0 , 0 , 1 , 1 , 0                              '3
Data 1 , 0 , 0 , 1 , 1 , 0 , 0                              '4
Data 0 , 1 , 0 , 0 , 1 , 0 , 0                              '5
Data 0 , 1 , 0 , 0 , 0 , 0 , 0                              '6
Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '7
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '8
Data 0 , 0 , 0 , 0 , 1 , 0 , 0                              '9
Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '10           "-"
Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '11           "" пусто
Data 1 , 0 , 0 , 0 , 0 , 0 , 1                              '12            U
Data 0 , 0 , 1 , 1 , 0 , 0 , 0                              '13            P
'*******************************************************************************
Лишние точки погашены, предделитель = 256
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Не, я бы немного иначе сделал. :) Допилю ради интереса и выложу. Тоже дел хватает. :) А там посмотрим...

Запутал я Вас, похоже... :) Если пишется Nosave то надо в обработке вручную сохранять регистры, иначе могут быть проблемы. Либо так и оставить но убрать Nosave. В этом случае он сам сохранит все в стек.

И при отображении напряжения я думаю ноль гасить не надо, это гашение для примера было, для процентов как раз нужно. А вот для напряжения наоборот вредно. Вдруг надо будет отобразить 0,9 В, например. И получится у нас U .90 Так что пусть 0 будет всегда...

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

Chislo(3) = Result / 100
Result = Result Mod 100
Chislo(2) = Result / 10
Chislo(1) = Result Mod 10
Chislo(4) = 12


Тогда будет U0.90 и все довольны. :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

Поставил делитель 1:3. А вот коэффициенты рассчитать не получается. Если просто после всех преобразований, Result * 3, то выходит всякая белиберда. Проценты показывают 100, а напряжение вообще зашкаливает, пишет прочерки, как и положено при зашкаливании. А гашение нуля я так и сделал. Проценты - без нуля, напряжение - с нулем. И при "зашкаливании" добавил мигающую точку в 4 разряде, т.е. в самом левом (это у меня так) для привлечения внимания.
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

To edm2007:С процентами справился, а вот с напряжением незадача! Просмотри, пожалуйста весь код. Где что не так?
Вложения
code2.rar
(1.38 КБ) 209 скачиваний
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Для начала давайте разберемся с разносом. Вот зачем так:

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

If Result <= 750 Then
   Result = Result / 100
   If Result >= 100 Then Chislo(3) = Result / 100 Else Chislo(3) = 0


Вы же два раз делите переменную Result !!! И еще, нет необходимости загружать туда 0, он и так там появится. Делаем так:

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

If Result <= 750 Then
      Chislo(3) = Result / 100
      Result = Result Mod 100
      Chislo(2) = Result / 10
      Chislo(1) = Result Mod 10
      Chislo(4) = 12


Допустим Result = 62. 62/100 = 0.62. Переменная целая, потому в Chislo(3) загрузится 0. Ничего дополнительно делать не нужно.

Далее, зачем Result = Result * 3 ? Я так понимаю Вы делитель уже поставили на вход? Давайте тогда проект.

P.S. Про P = Result * 7.5 отдельный разговор. У Вас P - Long. Она не работает с точкой.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

И ради Бога, сделайте:

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

On Adc Adc_isr ' БЕЗ NOSAVE
.....................

Adc_isr:
  Result = Getadc(0)
Return


Проблем и так хватает, чтобы еще вылавливать какие регистры сохранять надо... Лично я не уверен что в стеке сохраняются именно нужные регистры. Не смотрел...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

Весь проект в архиве.
Вложения
Project2.rar
(38.49 КБ) 236 скачиваний
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Для начала, канал АЦП0 (PORTA.0) настроен на выход:

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

Ddra = &B11110111 
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ответить

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