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

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

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

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


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


Разделить 16 bit

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

31

Не. Не могу разобраться. Луче попробую переделать первый способ, перемножением. Может что то получиться. Сложновато для меня всё это пока...

0

32

Читай личку

0

33

Да всё уже. разобрался. Всё решила простейшая математическая операция умножения и сложения. Как для новичка, это вполне нормальный вариант. А главное что все просто и наглядно. Спасибо всем тем, кто помогал)))

Короче... Мне еще учиться, учиться и еще раз учиться...

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

0

34

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

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

Зачем такие сложности? :O  :O
Я же предложил тоже самое но проще, работающее быстрее и занимающее меньше памяти. Разделить 16 bit

0

35

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

Я же предложил тоже самое но проще, работающее быстрее и занимающее меньше памяти


Вы уверены, что вариант рабочий?

0

36

А что с ним не так?
Применяю этот метод на компе и МК и все работает.

0

37

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

А что с ним не так?
Применяю этот метод на компе и МК и все работает.


http://sa.uploads.ru/t/AmHRh.jpg http://sa.uploads.ru/t/JmLGH.jpg

Отредактировано sasha_1973 (2014-11-18 12:27:10)

+3

38

http://sa.uploads.ru/t/B8hVN.jpg

+1

39

Вот это поворот. А если бы я попробовал такой пример. Я был через пару месяцев разобрался конечно что не так :D

0

40

Пример рабочий и корректный. Это Марк постарался. Как вы думаете в какой последовательности выполняется эта строка?

Код:
Val_byte(i) = Val_long Mod 10

Логично предположить что берется остаток от деления на десять переменной Val_long и помещается в массив Val_byte. Но Марк думает иначе. В его реализации, содержимое переменой Val_long копируется в массив и уже из содержимого массива извлекается остаток от деления. Думаю не нужно объяснять что произойдет если скопировать 4 байтную переменную в однобайтную? Зачем так тупо сделано не понятно. Можно было ведь переменную Val_long скопировать в регистры или в крайнем случае в стек или фрейм, но нет, Марк посчитал что с граблями программировать куда интереснее. :O  o.O
Рабочий вариант с учетом граблей Марка.

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

Val_long = 987654

For I = 1 To 6
  Tmp = Val_long Mod 10
  Val_byte(i) = Tmp
  Val_long = Val_long / 10
Next I

http://s019.radikal.ru/i639/1411/30/92ab938d9a59t.jpg

На компе такой проблемы нет.

http://s008.radikal.ru/i306/1411/e0/55335f8a4cb0.png

+3

41

А вот такой вариант очень даже рабочий, и по ходу, самый быстрый, а если его ещё переложить на ASM, будет совсем "кошерно"!

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

Марк посчитал что с граблями программировать куда интереснее


Прям всё, как у нас, через ж...!



Пётр, 20 баллов по 5-ти бальной шкале!


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

0

42

--- "ну вы блин даёте!"  (Алексей Булдаков)

0

43

Каримов написал(а):

--- "ну вы блин даёте!"  (Алексей Булдаков)

А-то, "Век живи, век учись, всё равно дураком помрёшь!"  (Народная Мудрость)

0

44

А нуля то нету. :D
Попробуйте число 101010, как его выведет.

Отредактировано RDW (2014-11-18 15:58:25)

0

45

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

А чем не нравится "STR2DIGITS"?

Необходимо переменную типа Long преобразовывать в строку.

RDW, нормально работает.

http://s017.radikal.ru/i426/1411/f5/adbb16506a04t.jpg

Отредактировано Пётр (2014-11-18 16:49:44)

0

46

через точку после переменной и номер бита. как бы пересобрать одну переменную 16 бит в две переменные 8 бит.

0

47

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

А вот такой вариант очень даже рабочий, и по ходу, самый быстрый, а если его ещё переложить на ASM, будет совсем "кошерно"!

В поисках решения своей проблемы, набрёл на старую тему.
Как ни странно, этот вариант не самый быстрый. Не знаю, если этот вопрос решался , то ткните носом. По сути вопроса. Скорость нам нужна именно в раскидывании числа по разрядам. Именно в этот момент мы останавливаем таймер, что бы не было засвета. И тут именно нужна скорость. Как ни странно, но "STR2DIGITS" работает в разы быстрее.

0

48

А если так:

Код:
Dim W As Word '- 16 бит
Dim BL As Byte
Dim BH As Byte

BL=Low(W)
BH=High(W)


Или вот так:

Код:
Dim W As Word '- 16 бит
Dim BL As Byte AT W Overlay
Dim BH As Byte AT W+1 Overlay


И тогда переменные Bl и Bh будут всегда равны байтам W
В название буквы L и H добавил так если чего, для названия (BL-нижний байт, BH-верхний байт).

Для LONG - где 4 байта типа уже через LOWW и HIGHW - но они для переменных WORD, после надо их через Low и High.

Кстати, чего-то мало вижу в коде на форуме переменные типа Dim X As Dword :flirt:

Отредактировано Ev3658 (2018-01-08 23:49:27)

0

49

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

А если так:
...
Или вот так:

Тут изначально была другая задача - разделить 16-битное число на отдельные цифры без потерь.
Например:
- имеем 123456
- получаем 1, 2, 3, 4, 5, 6

В дальнейшем цифры выводятся куда-то, визуально ряд выглядит, как единое число.

0

50

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

...- имеем 123456
- получаем 1, 2, 3, 4, 5, 6

Это да, тут либо просто и тормознуто либо заумно и быстро )))
Я делал типа так:
X / 10000
x / 1000
x/ 100
x/10
x MOD 10
- как-то так, но вот запятую ... блин, эта запятая вечно мешает всё ))))
Её можно ограничить: Config Single = Scientific , Digits = 1

0

51

ну вот я и пишу, при индикации на 7-seg индикатор нужно быстро. Все эти вычисления занимают кучу времени, что отражается на индикаторе. А "STR2DIGITS" проще не куда. Между остановкой и запуском таймера, всего пять строчек ассемблера. А при только "word=word/10" - 11 строчек, столько же на "mod", плюс цикл, перевод с WORD в Byte. итого 46 строк.
Я столкнулся, с этим, когда тестил прошивку, и решил просто вывести секундомер на дисплей. Секунды считал тот же таймер, что и индикация. Так вот с "МОD" он уже не считал, просто не успевал.
Не спрашивайте зачем, просто решил протестить, и наткнулся на такую фигню

0

52

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

...Так вот с "МОD" он уже не считал, просто не успевал....

Так если вывод динамичной индикации сделать по таймеру, но значения менять в программе?

0

53

Так и есть . Но что бы не было засвета, в момент, когда загружаешь  данные  в Cifra(1), Cifra(2) ... и т.д. нужно останавливать таймер. И таймер начинает тормозить на длину вычислений.

0


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