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

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

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

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


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


Разделить 16 bit

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

1

Добрый день помогите пожалуйста в таком вопросе как разбить 16 бит на 2 байта т.е. преобразовать число 10001100_10010110 в 2 байта 1=10001100 а 2=10010110

0

2

Большое спасибо

0

3

А вот тогда тоже вопрос в тему. Допустим есть число из 6 цифр. Они могут быть любыми от 0 до 9. Как число из 6 цифр разделить на 6 байт? То есть чтоб каждая цифра была отдельным байтом а не целым числом из 6 цифр? Вроде просто но я не понимаю пока.

0

4

Брать остаток от деления на 10. Затем делить число на 10. и по кругу, пока не дошли до старшего разряда.

0

5

То есть число например 999999 делим на 10. Получаем самый младший разряд, и так далее? Не могли бы вы, если вам не трудно набросать пример?

0

6

Не. Тут что то не так... Элементарно калькулятором попробовал. Если например разделить 987654 на 10 то просто теряется 4. Не вижу смысла.

0

7

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

Брать остаток от деления на 10. Затем делить число на 10. и по кругу, пока не дошли до старшего разряда.

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

То есть число например 999999 делим на 10. Получаем самый младший разряд, и так далее? Не могли бы вы, если вам не трудно набросать пример?

 

Можно так

Dim Val_byte(6) As Byte

     Dim Val_long As Long
     Val_long = 987654

     Dim Val_long_1 As Long

      Val_long_1 = Val_long / 100000
      Val_byte(1) = Val_long_1

      Val_long_1 = Val_long Mod 100000
      Val_long_1 = Val_long_1 / 10000
      Val_byte(2) = Val_long_1

      Val_long_1 = Val_long Mod 10000
      Val_long_1 = Val_long_1 / 1000
      Val_byte(3) = Val_long_1

      Val_long_1 = Val_long Mod 1000
      Val_long_1 = Val_long_1 / 100
      Val_byte(4) = Val_long_1

      Val_long_1 = Val_long Mod 100
      Val_long_1 = Val_long_1 / 10
      Val_byte(5) = Val_long_1

      Val_long_1 = Val_long Mod 10
      Val_byte(6) = Val_long_1

Так быстрее ~ в 2 раза

Dim Цикл As Byte

  Dim Val_str As String * 6
  Dim Val_byte(6) As Byte At Val_str Overlay

  Dim Val_long As Long
  Val_long = 987654

  Val_str = Str(val_long)

  For Цикл = 1 To 6
      Val_byte(цикл) = Val_byte(цикл) - 48
  Next Цикл

или так, если нужны строковые значения

Dim Val_long As Long
  Val_long = 999999

  Dim Строка_str As String * 6
  Dim Строка_byte(6) As Byte At Строка_str Overlay

  Строка_str = Str(val_long)

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

Не. Тут что то не так... Элементарно калькулятором попробовал. Если например разделить 987654 на 10 то просто теряется 4. Не вижу смысла.

Читайте  здесь

Отредактировано sasha_1973 (2014-11-17 06:09:05)

+2

8

В бэйсике проще сделать через MID+STR и тому подобное. ^^

0

9

Ребят спасибо) будем экспериментировать) А то число 999999 занимает по сути 5 байт. Вот и надо с ними работать. То есть нужно иметь возможность, каждую цифру из 999999 например, обрабатывать в виде байта по отдельности. Вот по этому и стала такая задача.

0

10

RDW привет) Мне вот MID+STR и тому подобное как новичку ваще не понятно)))))) Лучше бы пример какой нибудь скинули)))))

0

11

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

Не. Тут что то не так... Элементарно калькулятором попробовал. Если например разделить 987654 на 10 то просто теряется 4.

Все так. Нужно после деления, брать остаток от деления (mod). На калькуляторе это делали?

Код:
Dim Val_byte(6) As Byte
Dim Val_long As Long
Dim I As Byte

Val_long = 987654

For I = 1 To 6
  Val_byte(i) = Val_long Mod 10
  Val_long = Val_long / 10
Next I
RDW написал(а):

В бэйсике проще сделать через MID+STR и тому подобное.

Не скажу что будет проще, а вот скорость работы и размер прошивки....

Отредактировано Пётр (2014-11-17 12:38:00)

0

12

Ну сейчас компилятор стал по умнее, некоторые повторы, если в настройках разрешить, то оптимизирует (пихает в одну подпрограмму или данные по несколько раз не генерит).

Пример кода, думаю как-то так:

Код:
Const Nums = 6                                   
Dim F As Byte
Dim Col_nums As Byte
Dim Out_counter As Byte
Dim A As Dword
Dim Text As String * Nums
Dim Text_tmp As String * 1
Dim O(nums) As Byte

A = 999999
Text = Str(a)
Col_nums = Len(text)
Out_counter = 1
For F = 1 To Col_nums
   Text_tmp = Mid(text , F , 1)
   O(out_counter) = Val(text_tmp)
   Incr Out_counter
Next F

End

Исследуемое число в "А" (4 байта).
Массив "О" - на выходе имеет каждую цифру в байте (отдельно).
Это без защиты от дурака, алгоритм не учитывает размер "А", может быть как одна или шесть цифр в числе, но массив будет заполнятся всегда с первой ячейки (т.е. нет заполнение массива нулями или отметки конца массива).

0

13

Думаю начать с простейшего.

    Dim Val_byte(6) As Byte

         Dim Val_long As Long
         Val_long = 987654

         Dim Val_long_1 As Long

          Val_long_1 = Val_long / 100000
          Val_byte(1) = Val_long_1

          Val_long_1 = Val_long Mod 100000
          Val_long_1 = Val_long_1 / 10000
          Val_byte(2) = Val_long_1

          Val_long_1 = Val_long Mod 10000
          Val_long_1 = Val_long_1 / 1000
          Val_byte(3) = Val_long_1

          Val_long_1 = Val_long Mod 1000
          Val_long_1 = Val_long_1 / 100
          Val_byte(4) = Val_long_1

          Val_long_1 = Val_long Mod 100
          Val_long_1 = Val_long_1 / 10
          Val_byte(5) = Val_long_1

          Val_long_1 = Val_long Mod 10
          Val_byte(6) = Val_long_1

Код не комментирован, но вроде совсем простой.
Попробую разобраться.

Этот пример как я понял разбирает число элементарно.
Важно получать все 6 цифр в виде байтов.
Даже если байт будет равен в бинаре 0000 то он должен быть как не крути)))
Тут вроде все так. Сейчас и попробуем)

Отредактировано Atmel (2014-11-18 08:24:39)

0

14

Код отлично работает))) Можно пробовать работать с числами!)))

Во кстати ребят!) Надо после обработки же все байты обратно в число сложить!))) Вот заморочки) надо будет подумать как это делать. Может все так же, только с умножением?))) Подскажите?)))

Отредактировано Atmel (2014-11-18 08:50:59)

0

15

Так будет в 2 раза быстрее

  Dim Цикл As Byte

  Dim Val_str As String * 6
  Dim Val_byte(6) As Byte At Val_str Overlay

  Dim Val_long As Long
  Val_long = 987654

  Val_str = Str(val_long)

  For Цикл = 1 To 6
      Val_byte(цикл) = Val_byte(цикл) - 48
  Next Цикл

+1

16

Спасибо Саш! Как всегда выручаешь новичка)))) Это понятно. Но мне удобнее использовать первый способ. Теперь надо придумать как обратно собирать полученные байты в число. Тут все должно быть проще. Пока не придумал как но уверен что код должен быть совсем простой)

0

17

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

Теперь надо придумать как обратно собирать полученные байты в число. Тут все должно быть проще. Пока не придумал как но уверен что код должен быть совсем простой)

  Dim Цикл As Byte

  Dim Output_val_long As Long

  Dim Output_val_byte(6) As Byte
  Dim Output_val_str As String * 6 At Output_val_byte(1) Overlay

  Dim Input_Val_str As String * 6
  Dim Input_val_byte(6) As Byte At Input_Val_str Overlay

  Dim Input_val_long As Long

  Input_val_long = 987654

  Input_Val_str = Str(Input_val_long)

  For Цикл = 1 To 6
      Input_val_byte(цикл) = Input_val_byte(цикл) - 48
  Next Цикл

'  В массиве  Input_Val_byte(6)  --  получаете каждую цифру в своём байте

'  Что-то делаете

' Загоняем данные назад в переменную  "Val_long"
  Output_val_str = ""

  For Цикл = 1 To 6
      Output_val_byte(цикл) = Input_val_byte(цикл) + 48
  Next Цикл

  Output_Val_long = Val(Output_val_str)

  Val_long = Output_val_long

Отредактировано sasha_1973 (2014-11-18 09:04:16)

0

18

Смысл в чём, делаете из цифровой переменной строковую, а затем из строковой раскладываете по байтикам.

Обратно собираем наоборот.

Из байтиков делаете строковые значения, затем собираете всё, что получили в одну строку, потом делаете цифровую переменную (цифровая переменная = Val ( строковая переменная))

+1

19

Саш спасибо еще раз)))))) Блин а я решил приколоться и сделал так))))
A1 = Makeint(val_byte(1) , Val_byte(2) , Val_byte(3) , Val_byte(4) , Val_byte(5) , Val_byte(6) )
В итоге получил просто сумму чисел))))))
Но тоже полезное знание, чем больше знаю тем лучше))))))

Сейчас попробую обратно получить число. Пока код не понятен, но буду изучать.

Отредактировано Atmel (2014-11-18 09:11:02)

0

20

Команда "Makeint"  -  сливает разряды переменной в одно целое

почитать можно  --  здесь

Отредактировано sasha_1973 (2014-11-18 09:13:36)

0

21

Что это будет, зачем такие сложности?

0

22

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

Сейчас попробую обратно получить число. Пока код не понятен, но буду изучать.


Что именно непонятно?

0

23

Да всё просто. Есть значение из шести цифр, нужно иметь возможность каждую цифру обрабатывать по отдельности, изменять, делать с ней элементарные арифметические операции. После чего нужно собрать число и вывести на индикацию.
Это пока эксперимент. Если все пойдет как надо, можно будет и об устройстве написать в отдельной теме, выложить и схему и исходники.

0

24

Способ индикации?

0

25

Непонятно что это за "цикл". Компилятор ругается на эту надпись. Пока пытаюсь врубиться. Мало того надо еще прописать переменные, чего я не сделал.

ругается на эти две строки

Output_val_str = ""

For Цикл = 1 To 6

Отредактировано Atmel (2014-11-18 09:23:02)

0

26

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

Непонятно что это за "цикл". Компилятор ругается на эту надпись. Пока пытаюсь врубиться. Мало того надо еще прописать переменные, чего я не сделал.

ругается на эти две строки

Output_val_str = ""   -   переменную не забыли объявить  (dim Output_val_str as string * 6)

For Цикл = 1 To 6     -   переменную не забыли объявить  (dim цикл as byte)

Отредактировано Atmel (Сегодня 08:23:02)

0

27

Напишите mail в личку, скину рабочий исходник

0

28

А сюда написать нельзя? Исходник сверх секретный?)))

0

29

Чего тут секретного, просто через мыло проще.

Исходник

$map       ' Получаем карту распределения памяти в отчёте компиляции
  $regfile = "m328pdef.dat"       ' Используемый контроллер
  $crystal = 7372800       ' Частота работы контроллера
  $framesize = 100       ' Размер области используемой для преобразований
  $hwstack = 100       ' Размер аппаратного стека
  $swstack = 100       ' Размер программного стека
  $baud = 115200       ' Скорость трансляции по USART

  Dim Цикл As Byte

  Dim Output_val_long As Long

  Dim Output_val_byte(6) As Byte
  Dim Output_val_str As String * 6 At Output_val_byte(1) Overlay

  Dim Input_Val_str As String * 6
  Dim Input_val_byte(6) As Byte At Input_Val_str Overlay

  Dim Input_val_long As Long

  Input_val_long = 987654

  Input_Val_str = Str(Input_val_long)

  For Цикл = 1 To 6
      Input_val_byte(цикл) = Input_val_byte(цикл) - 48
  Next Цикл

'  В массиве  Val_byte(6)  --  получаете каждую цифру в своём байте

'  Что-то делаете

' Загоняем данные назад в переменную  "Val_long"
  Output_val_str = ""

  For Цикл = 1 To 6
      Output_val_byte(цикл) = Input_val_byte(цикл) + 48
  Next Цикл

  Output_Val_long = Val(Output_val_str)

  Val_long = Output_val_long

Симуляцию Вы не захотели.

0

30

Да а смысл симуляцию качать? Я в своём коде работаю и это очень удобно. Естественно в протеусе все проверяю)

0


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