Перейти к содержанию

Кто силен в математике ?


carworker

Рекомендуемые сообщения

Надо число в HEX формате, например 810А000 (не ошибка) , разбить на старшие и младшие байты. Сразу предупреждаю формулы типа Hi_b=(N &7F8)/8 сдвиги передвиги не помогают. Вспомнил все что знал. Хотя кто знает может я где то ошибся. Весь день просидел. Как пример если подставить значения (в прогу с которой я работаю)  в HEX формате Hi_b = 40 ; Low_b = 08A дают результат 8120000 Это правильный результат. Так работает компилятор и девайс. Может кого то осенит как из результата получить искомые Hi Low байты

Ссылка на комментарий
Поделиться на другие сайты

В 29.12.2022 в 01:15, carworker сказал:

Hi_b=(N &7F8)/8 

A разве это работает с байтами? Как бы сдвиг проводится побитно.

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, 11den11 сказал:

A разве это работает с байтами? Как бы сдвиг проводится побитно.

Єто пример для 11 бит. Плиз здвиньте мое число. 29 бит 0х810А000  ID CAN full и запишите полученный результат в HI/ Low в HEX формате. 

11 bit.png

 

4 часа назад, Dok сказал:

Если это прога, загляни внутрь и увидиш алгоритм)

Абалдеть ! Как до меня сразу не доперло. Аху-ный план Dok. Дякую.

Ссылка на комментарий
Поделиться на другие сайты

Вот число 0х810А000 в бинарнике.

  1        2      3        4      5        6       7       

1000 0001 0000 1010 0000 0000 0000

Опиши что ты подразумеваешь под - " разбить на старшие и младшие байты". Не клеится тут такая формулировка. Не вписываешься в байт

В 29.12.2022 в 01:15, carworker сказал:

HEX формате Hi_b = 40 ; Low_b = 08A дают результат 8120000 Это правильный результат.

А это точно правильный в HEX?

Я понял... тебе нужен реверсный пересчет результата в исходные данные... так?

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

Ссылка на комментарий
Поделиться на другие сайты

Да Я не правильно перевел. Преобразовать. Вот из хелпа учебной программы. 

Converting from 11-bit to 8-bit values 

The two bytes are laid out as follows. The 8 Most Significant Bits (the first 8) of the ID are put into the High byte. The 3 Least Significant Bits (the final 3 bits) are put into the Low byte - but in the 3 Most Significant Bit positions (i.e. the first 3)

The maths for converting from the full ID to the two High and Low bytes is:

HighByte = (ID AND 0x7F8) / 8

LowByte = (ID AND 0x007) * 0x20

Это одни из кучи формул Все они сводятся к одному - разобрать число в любом формате на старшие и младшие разряды. В моем случае CAN ID Full это адрес  для 32 бит систем который применительно к 8 бит систем надо преобразовать как старшие и младшие биты. А 29 бит CAN ID Full уже слепит сам контролер. Вернее компилятор

Еще пример методом тыка - Hi_b = 0x40 Low_b =0x8C   ID Full=0x8100000  При том можно записать  Low_b =0x08C результат один 0x8100000 Это метод сдвига и умножения на 2-4-8-16-32 Не могу вкурить. В этой же учебной программе можно записать  ID Full  0x8100000 и она выдаст Stanlart ID 11 bit 0x204  Extendet ID 0x0 что совсем с толку сбивает.

Hi_b = 0x40 Low_b =08C я загоняю в прошивку и сразу вижу что выдает контролер по сети CAN

Ссылка на комментарий
Поделиться на другие сайты

Нужно еще поиграться для примеров. Пока я вижу что 

Hi_b = 0x40  это последние четыре нуля ID Full=0x8100000а  Low_b =08C это ID Full=0x8100000,

Hi_b = 0x40  это последние четыре нуля ID Full=0x8120000а  Low_b =08A это ID Full=0x8120000,

.... т.е A = 12, B = 11, C = 10.....

.... 40 это 4х0.....

Нужны еще примеры где Hi_b с другими значениями ( Hi_b = 0x31, Hi_b = 0x32, Hi_b = 0x3А.... корче не 0х40)

Тут пересчет математически - логический или массивный, так как 56 битовое (7-ми байтовое) нужно перевести всего лишь в 16 битовое (2-ух байтовое) .... так что давай примеры реальные.

Не исключено, что Hi и Lo это координаты массива.

1 час назад, carworker сказал:

Это одни из кучи формул Все они сводятся к одному - разобрать число в любом формате на старшие и младшие разряды. В моем случае CAN ID Full это адрес  для 32 бит систем который применительно к 8 бит систем надо преобразовать как старшие и младшие биты. А 29 бит CAN ID Full уже слепит сам контролер. Вернее компилятор

Не путай bin с bit.....!

Еще раз внимательно перечитал и понял так - ты хочешь алгоритм работы 32-битовой системы перенести на 8-ми битовую... так? Хммм...

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, carworker сказал:

В этой же учебной программе можно записать  ID Full  0x8100000 и она выдаст Stanlart ID 11 bit 0x204  Extendet ID 0x0 что совсем с толку сбивает.

Объясню на пальцах (да простят меня профы) -  ты скармливаешь 12-ти битному кальку 32-ух битное число -

твое число (HEX)8100000 =(BIN)(0000 1000 0001 0000 0000 0000 0000 0000).... чуешь разницу? Твое число должно быть 0111 1111 1111 (первый слева бит кальк откидывает, так как сам по себе кальк 11-ти битный. А что кальк делает с 32-ух битным числом... одному Богу и создателю калька известно.

функцией & 0x7F8 (0111 1111 1000) выделяет The 8 Most Significant Bits (the first) of the ID.  (первые восемь из 11 а не 12) .

Если 11-ти битовое число (HEX)6D8 = (BIN)0110 1101 1000 

                0110 1101 1000 

&0x7F8   0111 1111 1000

=              0110 1101 1000  

т.е получается (BIN)1101 1011 = (HEX)6D8 

Так же и с (ID AND 0x007) - 0111 выделяет последние три бита The 3 Least Significant Bits (the final 3 bits) 

                0110 1101 1000 

&0x7F8   0000 0000 0111

=             0000 0000 0000   

т.е получается (BIN)000 = (HEX)0 

А дальше уже вычисления - c перемещением

Ссылка на комментарий
Поделиться на другие сайты

Спасибо дружище ! Мне еще вот так ни кто не разжевывал. Просто супер. Да я так делал с 11 бит адресами только переводил все в десятичные. Потом назад в 16ричные. Примеры будут. Я кажется нашел способ. Но для этого мне понадобится спаять дополнительную макетку. Сча вспомнил где то читал.  CAN ID Full разбит на групы типа масивов. Но это не масивы в прямом смысле. Возможно адресация составления масивов ? Надо проверить

А сейчас С Новым Годом ! Мирного нам неба и мирной земли !

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, carworker сказал:

А сейчас С Новым Годом ! Мирного нам неба и мирной земли !

И тебе также, и твоим родным, и всему украинскому народу! Мира всем!

Ссылка на комментарий
Поделиться на другие сайты

Ну CAN- ов два. Старый и новый. Это все го лишь протокол обмена данными.  В старом в шину выбрасывался приоритет и шел опрос в новом просто флаг и приоритет определяется по алгоритму  ведущего устройства.

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

 

А это. 

Что Вы вообще хотите сделать?

 

Ссылка на комментарий
Поделиться на другие сайты

19 часов назад, GENNA сказал:

Что Вы вообще хотите сделать?

С успехом делал и делаю эмуляторы. А с Full ID возник затык. 

Ссылка на комментарий
Поделиться на другие сайты

Аху_ть !! Я получил результат ! В более свежей версии уч. прог.  есть "Передача длинніх ИД" И скромненько так в сторонке Ulong. Если не знать что такое Ulong то..... 810A000 =135307264 и получаешь СИ макрос с нужным по длине адресом. Я макрос пока не разбирал. Просто подсунул библиотеке. Но как идет пересчет пока загадка. Одно понятно - играть надо десятичными числами.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
  • Создать...