Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Работа с байтами многобайтовой переменной


Работа с байтами многобайтовой переменной

Сообщений 31 страница 47 из 47

31

sasha_1973 написал(а):

Совпадают по выводам и корпусам:
Atmega8 (8 кб) = Atmega168P, PA (16 кб) = Atmega328P (32 кб)

Уговорили :-) Закажу, а пока помучаю 8-ую Мегу.

sasha_1973 написал(а):

а так быстрее, 4 такта:...

Прогоню и это.
Спасибо!

0

32

Перечитал всю тему, ничего не понял. Или это не мой случай. Пытаюсь две переменные as Byte сложить в одну as Word. Ничего не получается. Одна переменная, к примеру, &H01, вторая &H3C. Нужно получить &H013C.

Код:
Dim Число as Word , Число_1 as Byte , Число_2 as Byte
Число_1 = &H01 : Число_2 = &H3C
Число = Число_1 * 100            ' по идее должно получиться &H0100
Число = Число + Число_2         ' &H0100 + &H3C = &H013C
Stroka = Str(Число)

В калькуляторе Виндовс получается &H13С, что мне и нужно. Но это только в калькуляторе. В реальности на индикатор выводится число 160, вместо 316. 1 это &H01, а 60 это &H3C. То есть сложения не происходит. Как правильно сложить два байтовых числа в одно двухбайтовое.

0

33

Andrusha написал(а):

Число = Число_1 * 100            ' по идее должно получиться &H0100

Система счисления шестнадцатеричная, а не десятичная и умножать нужно на 255, а лучше сдвинуть влево на 8. Это быстрее и требует меньше кода.
Или можно воспользоваться функцией Makeint. https://avrhelp.mcselec.com/makeint.htm

+1

34

Пётр написал(а):

а лучше сдвинуть влево на 8. Это быстрее и требует меньше кода.

+1
Пример для получения одного байта из двух (применено тут Использование R-TouchPad) :

Rotate pozx, Left, 4                                     ' Сдвигаем координату X в старший ниббл
'     0000 0001 - для X = 1
'     0001 0000 - после сдвига
poz = pozy + pozx                                         ' Формируем числовое значение позиции
'     0000 0001 (для Y = 1) + 0001 0000 (см. выше)
'     Получаем 17 (DEC) = 0001 0001 - позиция нижней левой "кнопки"

Пётр написал(а):

Или можно воспользоваться функцией Makeint. https://avrhelp.mcselec.com/makeint.htm

На выходе получим Integer, а нужен Word... ;)

Отредактировано Nord (2019-03-26 08:44:05)

+1

35

Nord написал(а):

На выходе получим Integer, а нужен Word

Compact two bytes into a word or integer.

Разница между Integer и Word только в интерпретации старшего бита (признак положительного/отрицательного числа или нет).

0

36

Пётр написал(а):

Разница между Integer и Word только в интерпретации старшего бита (признак положительного/отрицательного числа или нет).

Еще и в диапазоне значений... ;)
У одного -32767...+32767, а у другого - от 0 до 65535...

Тут уж пусть Andrusha сам выбирает... ;)
Ему со значениями работать.

0

37

Не проще ли  использовать Overlay? Вообще ничего складывать не надо. Одна переменная как старший байт, вторая как младший. Объединяющая их третья как Word ну или сразу как строка размерностью 2 - по факту она будет в памяти занимать три байта - тогда не нужна функция STR. Гуглить AN193 ну или во встроенном хелпе.

Отредактировано pchela5 (2019-03-26 16:00:16)

+1

38

pchela5 написал(а):

Не проще ли  использовать Overlay?
Гуглить AN193

Даже без гуглов, все понятно разложено - MODBUS ;)

А по способу реализации - каждый выбирает удобный и понятный ему с учетом необходимого быстродействия... ;)

0

39

Nord написал(а):

Даже без гуглов, все понятно разложено - MODBUS

Как я недавно для себя выяснил, описание оверлея есть во встроенном хелпе - невероятно удобная вещь.

>>> Пример для получения одного байта из двух (применено тут Использование R-TouchPad) :
В данном случае я бы сразу присваивал значению pozx следующий ряд: 16, 32, 48, 64 и т.д. - тем самым не надо сдвигать ничего.

+1

40

pchela5 написал(а):

Как я недавно для себя выяснил ... - невероятно удобная вещь.

Плюсуюсь.
Но сам пользуюсь крайне редко ввиду отсутствия необходимости... ;)
Я про оверлей, а не про хелп... ;)

pchela5 написал(а):

>>> Пример для получения одного байта из двух (применено тут Использование R-TouchPad) : В данном случае я бы сразу присваивал значению pozx следующий ряд: 16, 32, 48, 64 и т.д. - тем самым не надо сдвигать ничего.

В конечном варианте (проект еще в разработке) так и сделано.
Там (в примере) сделано сдвигом для понимания процесса расчета позиции.

Отредактировано Nord (2019-03-26 16:35:09)

0

41

Nord написал(а):

Еще и в диапазоне значений

Я писал про отличие на бинарном уровне.

+1

42

Огромное спасибо за помощь. Overlay помог.

Код:
Dim Число as Word 
Dim Число_2 as Byte At Число Overlay
Dim Число_1 as Byte At Число + 1 Overlay
Число_1 = &H01 : Число_2 = &H3C
Stroka = Str(Число)

На индикаторе 316.

Nord написал(а):

У одного -32767...+32767, а у другого - от 0 до 65535...

Числа только положительные от 0 до 3000. Здесь бы и Integer хватило за глаза, но... И Word и Integer занимают в памяти по два байта, но Word пишется короче. 8-)
Изучаю DFPlayer_mini. Делаю mp3 плеер. Там номер трека и общее количество треков отдается двумя байтами, а на индикатор нужно вывести одно число. Отсюда эта катавасия получилась. Еще раз огромное спасибо всем за помощь.

+1

43

Andrusha написал(а):

...но Word пишется короче

Интересный подход к выбору типов... ;)
&H - еще короче... ;)

0

44

Ну вот так. :dontknow:

0

45

Вообще тема с оверлеями обсуждалась мюльон раз. :)

0

46

Каюсь, мой косяк. Обсуждения видел, читал, разбирался и ... успешно забыл.  :dontknow:

0

47

x_word = Makeint(x1_byte , x2_byte)  ' собираем в одну переменную два байта
http://s7.uploads.ru/t/DTF7V.png

Отредактировано Sega12 (2019-05-23 10:51:48)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Работа с байтами многобайтовой переменной