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

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

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

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


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


объединить переменные

Сообщений 1 страница 16 из 16

1

Здравствуйте, прошу совета. Как объединить две двух байтные переменные типа word и получить Single.
Одно байтные командой Makeint, а вот с двух байтными не соображу как.   Заранее благодарю.

0

2

Правильно ли я понял, что из 2-х Word надо получить один DWord, а уже потом произвести замену типа? Если да, то можно так

Dim A as Dword
Dim A_low as Word At A Overlay
Dim A_high as Word At A Overlay + 2

Dim B as Single

A_low = 512
A_high = 5

B=A

Подробнее про Overlay читай хелп

+1

3

Спасибо за идею, буду пробовать. Работаю с модбус устройством, передаётся число типа float с плавающей запятой, принять надо контроллером.  Объединить надо два регистра модбус по 2 байта в одну переменную  4 байта и сделать из него single. Вот есть ещё мысль...   Объединение двух одно байтных переменных  выглядит так:   

Dim a as byte
dim b as byte
dim vout as word
vout = (256 * a) + b

а если решить так,
dim a as word
dim b as word
dim vout (512*a) + b

Правильно ли умножаю на 512? Более оптимальное решение overlay?

0

4

Да, как-то так.

Код:
Dim A As Dword
Dim A0 As Word At A Overlay + 0
Dim A2 As Word At A Overlay + 2
Dim B As Single
Dim C1 As Word
Dim C2 As Word

C1 = &h0123
C2 = &h0123
A0 = C1
A2 = C2
B = A

Но задание до конца не ясное.

+2

5

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

Правильно ли умножаю на 512? Более оптимальное решение overlay?

Делайте через оверлей, не забивайте голову лишними вычислениями.
У вас изначально неправильный синтаксис Баскома и нет переменной для работы с большими числами.
Нельзя напрямую писать в переменную Сингл, для этого надо хорошо знать её строение. А раз так, то придется через вычисления делать наполнение переменной и мучится с умножением (что работает медленнее в разы и легко ошибиться).

0

6

Спасибо всем откликнувшимся.

0

7

Здравствуйте, пробовал такой код, число 65536 перевожу в бинарный формат, объединяю переменные и в результате отправляет в uart число 0. Что я делаю нет так?

Код:


$regfile = "M8def.dat"                                      ' chip used
$crystal = 4000000                                          ' xtal used
$baud = 9600                                                ' baudrate N,8,1
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0


Dim A As Dword
Dim A0 As Word At A Overlay + 0
Dim A2 As Word At A Overlay + 2

Dim C1 As Word
Dim C2 As Word


Do

C1 = &B0000000000000001                                     ' старшие 2 байта
C2 = &B0000000000000000                                     ' Младшие 2 байта
A0 = C1
A2 = C2
Print A
Waitms 20
Loop
End

Отредактировано catalex (2019-07-03 23:04:20)

0

8

Код:
$regfile = "M8def.dat"                                      ' chip used
$crystal = 4000000                                          ' xtal used
$baud = 9600                                                ' baudrate N,8,1
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0


Dim A As Dword
Dim A0 As Word                                             
Dim A2 As Word                                              

Dim C1 As Word
Dim C2 As Word


Do

C1 = &B0000000000000001                                     ' старшие 2 байта
C2 = &B1110000001111000                                     ' Младшие 2 байта    число 123000


A = C1
Shift A , Left , 16
A = A + C2

A0 = C1
A2 = C2
Print A
Waitms 20
Loop
End


Сделал так, работает...  Но почему не получилось overlay, прошу помочь дойти до истины.

0

9

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

Что я делаю нет так?
Dim A As Dword
Dim A0 As Word At A Overlay + 0
Dim A2 As Word At A Overlay + 1

0

10

После исправления Overlay + 1 всё осталось также.

0

11

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

A = C1
Shift A , Left , 16
A = A + C2

Сделал так, работает...  Но почему не получилось overlay, прошу помочь дойти до истины.

Можно было сделать
A = C1 * 65535
A = A + C2

0

12

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

После исправления Overlay + 1 всё осталось также.

Я еще сам не "на все 100" разобрался с оверлеями...  :blush:
Посему - возможны ляпы... ;)

+1

13

Я в начале темы предполагал сделать смещение умножением, но меня участник форума RDW отговорил. Может завтра что-то посоветует по поводу overlay.     Очень хочется разобраться. Спасибо за советы.

0

14

Код:
Dim A_ As Dword
Dim A(2) As Word At A_Overlay

Попробуйте так.

0

15

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

но меня участник форума RDW отговорил

Да, всё правильно.

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

Dim A As Dword
Dim A0 As Word At A Overlay + 0
Dim A2 As Word At A Overlay + 2
Dim C1 As Word
Dim C2 As Word

C1 = &B0000000000000001 ' старшие 2 байта
C2 = &B0000000000000000 ' Младшие 2 байта
A0 = C1
A2 = C2
Print A

WORD - 16 bit переменная
DWORD - 32 bit переменная
"Overlay + 2" - всё правильно
Только вы неправильно синтексис пишите + непонятно зачем ради эксперимента так усложнять, можно же проще:

Код:
Dim A As Dword
Dim A0 As Word At A + 0 Overlay
Dim A2 As Word At A + 2 Overlay

A0 = &B0000_0000_0000_0000 ' МЛАДШИЕ 2 байта 
A2 = &B0000_0000_0000_0001 ' СТАРШИЕ 2 байта 
Print A

В переменной A должно выводится десятичное число 65536.
Знак подчеркивание стоит для того, чтобы не запутаться в нулях, допускается в использовании (в качестве разделителя).

+2

16

Спасибо огромное, всё получилось :cool:

0


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