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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Single > перевод в byte для записи в память.


Single > перевод в byte для записи в память.

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

1

Кто знает, помогите.
Работа с SHT21, получили температуру, как здесь выделить ее знак и полученные данные перевести для записи в ячейки памяти 24Схх?

'****************
…….
Dim T As Single
………
'****************
……….
Datat = Data1
Shift Datat , Left , 8                                     
Datat = Datat + Data2
T = Datat * 175.72
T = T / 65536
T = T - 46.85
Print Fusing(t , "#.#") ; "C "
………..
Xx = Fusing(t , "#.")  ???? переменную Т не могу расчленить.

0

2

Можно так:

Код:
'Описываем переменные
Dim Num As Single
Dim Adress As Long
Dim B(4) As Byte
Dim I As Byte
'Пример числа (сохраняется в 4-х байтах)
Num = 123.456
'Получаем его адрес (старший байт)
Adress = Varptr(Num)
'В цикле читаем все 4 байта и переносим их в массив В
For I = 1 To 4
 B(i) = Inp(adress)
 Incr Adress
Next

Затем эти 4 байта сохраняем в памяти. Обратное преобразование аналогично. Читаем из памяти 4 байта и объединяем их в Single. Примерно так:

Код:
'.....
'Тут поместим код для чтения из памяти, а затем...
'.....
Adress=Varptr(B(1))
Num=Adress

Отредактировано sva-don (2012-03-17 19:53:27)

+1

3

Спасибо.
Видел это у тебя в проэкте. (конкурс)
Пробовал, но что-то не пошло.
Разбираюсь. Пока не могу въехать в это.
Как я понял вариантов других нет?

0

4

Да, другого не дано.
Почему не пошло? Single число состоит всегда из 4 байт.
Например 23 AF B1 12.
Когда мы используем функцию Varptr то в переменной (в моем примере Adress) сохраняется адрес первого байта, т.е. адрес байта с значением 23.
Естественно, если инкрементировать переменную Adress, то он будет указывать на следующий байт, т.е AF и т.д всего 4 раза.
Функцией INP(Adress) мы берем непосредственное значение, расположенное по указанному адресу. Все просто.
После выполнения 4-х циклов в массиве будет Single число разбитое по байтам.
Обратное преобразование еще проще. Если функцией Varptr указать начальный адрес первого элемента массива, то присвоение значения по этому адресу переменной типа Single приведет к тому, что будет считана это значение, т.е. все 4 байта.

0

5

Первая часть понятна.
По ней, массив:
************
B(i) = Inp(adress)
Incr Adress
Next
А1=B1
A2=B2 ,,,,,        получил 79,E9,F6,42 (твой пример 123,456)      (почему? Что-то не понял)

А вот вторая часть и не получается.
На входе 116 вместо 123,456

Ладно, завтра в железе попробую.

http://uploads.ru/t/s/k/5/sk5hq.jpg

Вроде все видно.
http://uploads.ru/t/1/b/d/1bdcn.jpg

Вот, не выдержал и в симе глянул.
Массив правельный, а тут же собрать не может.

Отредактировано Aleks (2012-03-20 00:20:52)

0

6

Посмотри http://www.mcselec.com/index.php?option … ;Itemid=57 - Examples for using OVERLAY with Bascom-AVR - должно помочь

0

7

Да, чуток лоханулся. Вот 100% работающий код.

Код:
$regfile = "m128def.dat"                                   
$crystal = 8000000
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 24                                             ' default use 24 for the frame space
'Описываем переменные
Dim S1 as Single
Dim S2 as Single
Dim A(4) as Byte
Dim i as Byte
Dim Adress as Word
'Разложение на байты
S1 = 123.456
Adress = Varptr(S1)
 For i = 1 To 4
  A(i) = Inp(Adress)
  Incr Adress
 Next
'Обратная сборка
 Adress = Varptr(S2)
 For i = 1 To 4
   Out Adress , A(i)
   Incr Adress
 Next

Отредактировано sva-don (2012-03-20 20:47:29)

0

8

Спасибо.
Сейчас буду пробовать.

Вот этой строки и не хватала:  Out Adress , A(i)
Пробовал так:
Adress=Varptr(B(1))
For i = 1 To 4
Num=Adress
Incr Adress
Next
Конечно лажа.

Отредактировано Aleks (2012-03-20 19:16:28)

0

9

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

http://www.mcselec.com/index.php?option … ;Itemid=57 - Examples for using OVERLAY with Bascom-AVR


Если внимательно почитать указанную выше ссылку, то можно понять, что никакие танцы с бубнами в виде разложения будут не нужны

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Single > перевод в byte для записи в память.