carworker 456 Опубликовано 28 декабря, 2022 Поделиться Опубликовано 28 декабря, 2022 Надо число в HEX формате, например 810А000 (не ошибка) , разбить на старшие и младшие байты. Сразу предупреждаю формулы типа Hi_b=(N &7F8)/8 сдвиги передвиги не помогают. Вспомнил все что знал. Хотя кто знает может я где то ошибся. Весь день просидел. Как пример если подставить значения (в прогу с которой я работаю) в HEX формате Hi_b = 40 ; Low_b = 08A дают результат 8120000 Это правильный результат. Так работает компилятор и девайс. Может кого то осенит как из результата получить искомые Hi Low байты Ссылка на комментарий Поделиться на другие сайты Поделиться
11den11 281 Опубликовано 30 декабря, 2022 Поделиться Опубликовано 30 декабря, 2022 В 29.12.2022 в 01:15, carworker сказал: Hi_b=(N &7F8)/8 A разве это работает с байтами? Как бы сдвиг проводится побитно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Dok 822 Опубликовано 30 декабря, 2022 Поделиться Опубликовано 30 декабря, 2022 Если это прога, загляни внутрь и увидиш алгоритм) Ссылка на комментарий Поделиться на другие сайты Поделиться
carworker 456 Опубликовано 30 декабря, 2022 Автор Поделиться Опубликовано 30 декабря, 2022 4 часа назад, 11den11 сказал: A разве это работает с байтами? Как бы сдвиг проводится побитно. Єто пример для 11 бит. Плиз здвиньте мое число. 29 бит 0х810А000 ID CAN full и запишите полученный результат в HI/ Low в HEX формате. 4 часа назад, Dok сказал: Если это прога, загляни внутрь и увидиш алгоритм) Абалдеть ! Как до меня сразу не доперло. Аху-ный план Dok. Дякую. Ссылка на комментарий Поделиться на другие сайты Поделиться
11den11 281 Опубликовано 31 декабря, 2022 Поделиться Опубликовано 31 декабря, 2022 Вот число 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? Я понял... тебе нужен реверсный пересчет результата в исходные данные... так? Если так, то давай больше (с десяток) разных правильных примеров. Ссылка на комментарий Поделиться на другие сайты Поделиться
carworker 456 Опубликовано 31 декабря, 2022 Автор Поделиться Опубликовано 31 декабря, 2022 Да Я не правильно перевел. Преобразовать. Вот из хелпа учебной программы. 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
11den11 281 Опубликовано 31 декабря, 2022 Поделиться Опубликовано 31 декабря, 2022 Нужно еще поиграться для примеров. Пока я вижу что 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-ми битовую... так? Хммм... Ссылка на комментарий Поделиться на другие сайты Поделиться
11den11 281 Опубликовано 31 декабря, 2022 Поделиться Опубликовано 31 декабря, 2022 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 перемещением Ссылка на комментарий Поделиться на другие сайты Поделиться
carworker 456 Опубликовано 31 декабря, 2022 Автор Поделиться Опубликовано 31 декабря, 2022 Спасибо дружище ! Мне еще вот так ни кто не разжевывал. Просто супер. Да я так делал с 11 бит адресами только переводил все в десятичные. Потом назад в 16ричные. Примеры будут. Я кажется нашел способ. Но для этого мне понадобится спаять дополнительную макетку. Сча вспомнил где то читал. CAN ID Full разбит на групы типа масивов. Но это не масивы в прямом смысле. Возможно адресация составления масивов ? Надо проверить А сейчас С Новым Годом ! Мирного нам неба и мирной земли ! Ссылка на комментарий Поделиться на другие сайты Поделиться
11den11 281 Опубликовано 31 декабря, 2022 Поделиться Опубликовано 31 декабря, 2022 1 минуту назад, carworker сказал: А сейчас С Новым Годом ! Мирного нам неба и мирной земли ! И тебе также, и твоим родным, и всему украинскому народу! Мира всем! Ссылка на комментарий Поделиться на другие сайты Поделиться
GENNA 11 Опубликовано 1 января, 2023 Поделиться Опубликовано 1 января, 2023 Ну CAN- ов два. Старый и новый. Это все го лишь протокол обмена данными. В старом в шину выбрасывался приоритет и шел опрос в новом просто флаг и приоритет определяется по алгоритму ведущего устройства. По старому если три четыре устройства выкинут приоритет и и всё затык. цпу в ступоре. По новому приоритеты опроса зарыты в цпу и , флаги то все равно выкидывают, причем с адресами, что очень важно и приоритет опроса определяет цпу. А это. Что Вы вообще хотите сделать? Ссылка на комментарий Поделиться на другие сайты Поделиться
carworker 456 Опубликовано 2 января, 2023 Автор Поделиться Опубликовано 2 января, 2023 19 часов назад, GENNA сказал: Что Вы вообще хотите сделать? С успехом делал и делаю эмуляторы. А с Full ID возник затык. Ссылка на комментарий Поделиться на другие сайты Поделиться
carworker 456 Опубликовано 2 января, 2023 Автор Поделиться Опубликовано 2 января, 2023 Аху_ть !! Я получил результат ! В более свежей версии уч. прог. есть "Передача длинніх ИД" И скромненько так в сторонке Ulong. Если не знать что такое Ulong то..... 810A000 =135307264 и получаешь СИ макрос с нужным по длине адресом. Я макрос пока не разбирал. Просто подсунул библиотеке. Но как идет пересчет пока загадка. Одно понятно - играть надо десятичными числами. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти