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

Обсуждаем контроллеры компании Atmel.
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

Как в коде сообразить такое приравнивание: например есть переменное значение 1 - 1024, то как например выделить из него диапазон от 500 до 755 и выдать в процентах (0-100)?
Значение можно просто поделить на 2,55 и видать результат, но как извлечь этот диапазон?
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

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

Сообщение raf65 »

можно попробовать из исходной переменной отнять 12, далее сдвинуть вправо на 1 разряд и выделить младший байт. получится однобайтовая переменная от 0 до 255 находящаяся в этом диапазане


.....
U = U_r - 12
Shift U , right , 1
Us = low(u)
.....
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

Я ничего не понял :dont_know:
Что за результат?

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

u = 100;
u - 12 = 88
u >> 1 = 44
low(u) = 44
Или попробуем наоборот:

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

 u = 1;
u << 1 = 2;
u + 12 = 13
Что это?

Если быстродействие и размер кода не важны, можно хотя бы в лоб (если я правильно задачу понял :dont_know:)

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

 u16 a;
if ( (a > 499)  && (a < 756) )
{
    a = a - 500;
    a =  a / 2.55F;
}
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

День добрый.

Можно просто проверить через Select Case:

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

Select Case Temp         ' проверяем значение переменной Temp

Case 500 To 755:         ' если значение находится в указанном диапазоне
' тут нужные расчеты

End Select                   ' конец проверки


Такой вариант еще удобен тем, что можно в любой момент добавить проверку значения (например Case 50:). Или добавить исполнение кода при иных значениях (Case Else:).
Последний раз редактировалось edm2007 Чт дек 15, 2011 11:36:14, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

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

Сообщение raf65 »

BerZerK-ku писал(а):Я ничего не понял :dont_know:
Что за результат?

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

u = 100;
u - 12 = 88
u >> 1 = 44
low(u) = 44
Или попробуем наоборот:

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

 u = 1;
u << 1 = 2;
u + 12 = 13
Что это?
[/code]


вопрошающему нужен результат в процентах от 500 до 755, а получившийся байт делим на 2,55 и получаем результат в процентах в заданном диапазоне, ну несомненно это вычисление нужно поставить в условие выполнения, иначе игнорируем
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

BerZerK-ku писал(а):Я ничего не понял :dont_know:
Что за результат?

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

u = 100;
u - 12 = 88
u >> 1 = 44
low(u) = 44
Или попробуем наоборот:

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

 u = 1;
u << 1 = 2;
u + 12 = 13
Что это?

Если быстродействие и размер кода не важны, можно хотя бы в лоб (если я правильно задачу понял :dont_know:)

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

 u16 a;
if ( (a > 499)  && (a < 756) )
{
    a = a - 500;
    a =  a / 2.55F;
}



А в баскоме как написать этот код правильно -

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

if a > 499 > 755
a = a / 2,55
end if
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

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

Сообщение raf65 »

EDM2007 предложил
.....
Select Case U_r
Case 500 To 755:

U = U_r - 12
Shift U , right , 1
Us = Low(u)
...
...

End Select
.......

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

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

Сообщение edm2007 »

raf65, вроде как можно проще и понятнее:

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

Select Case Temp

Case 500 To 755:
Percent = Temp - 500
Percent = Percent / 2,55

End Select
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

Спасибо, буду экспериментировать..
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

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

Сообщение raf65 »

edm2007 писал(а):raf65, вроде как можно проще и понятнее:


ну да
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

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

Case 500 to 755
Хочу такое же в Си (.
raf65 писал(а):вопрошающему нужен результат в процентах от 500 до 755, а получившийся байт делим на 2,55 и получаем результат в процентах в заданном диапазоне, ну несомненно это вычисление нужно поставить в условие выполнения, иначе игнорируем
А можно еще подробнее? Вот допустим берем число 500. 500 - 12 = 488 -> 488 >> 1 = 244 -> 244 / 2.55 ну ни как не 0. В чем подвох?
Аватара пользователя
raf65
Встал на лапы
Сообщения: 87
Зарегистрирован: Вс сен 27, 2009 20:49:06
Откуда: Советск

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

Сообщение raf65 »

каюсь ошибки бывают

Select Case E
Case 500 To 755:

U = E + 12
P = Low(u)
A = P / 2.55

End Select

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

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

Сообщение TRIOD »

Доброе время суток.

Народ подскажите что я неправильно делаю, надо чтоб с частотой 62500 происходило прерывание и вызов подпрограммы обработки, но что то не пашет.
Может я неправильно конфигурирую таймер?

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

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 32
$framesize = 48

Config Timer2 = Timer , Prescale = 1 , Compare = Disconnect , Clear Timer = 1
Compare1a = 128                                             'частота 62500
On Compare1a Algorithm
Enable Compare2
Enable Interrupts
Start Timer2

Do
'код программы
Loop

Algorithm:

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

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

Сообщение Igor_67 »

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

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

Сообщение edm2007 »

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

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

Сообщение Igor_67 »

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

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

Сообщение edm2007 »

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

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

Сообщение TRIOD »

Да не заметил, но как сконфигурировать второй таймер на срабатывание по произвольной частоте. Баском недаёт присвоит значение OC2.

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

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 32
$framesize = 48

Config Timer2 = Timer , Prescale = 1 , Compare = Disconnect , Clear Timer = 1
On oc2 Pulse
Enable oc2
Enable Interrupts
Enable Timer2

Do

Loop
End


Pulse:
   
Return


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

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

Сообщение Igor_67 »

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

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

Сообщение TRIOD »

Igor_67 Я уже в предыдущем сообщении написал что нашол.

Возник ещё один вопрос. Как привести значения выдаваемые АЦП к нормальным десятичным значениям?
Только абсолютная пустота бездны принесёт мне покой.
Ответить

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