Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Работа в АБ с отрицательными числами |
Цитата |
|
Первоначально проблема состояла в том, чтобы "распознать" отрицательное число, получаемое микроконтроллером от акселерометра. Формат отрицательных чисел не расписан в даташит на акс. Отсюда и все спотыкачики. Смущало то, что Си без всяких подсказок селектировала числа на "+" и "-", а АБ упорно не хотел этого делать. Много времени ушло на то, чтобы понять, чем отличаются натуральные числа от отрицательных в представлении акселерометра. Задача вывода значений на UART в принципе не стояла, это была тестовая операция, необходимая только для контроля в процессе отладки кода. В реальном устройстве наличие "минуса" перед числом отображать не требуется, там анализируется модуль вектора ускорения, при этом положительные значения ускорений игнорируются.
Сейчас занимаюсь разработкой серии сервисных устройств для мотоциклов. Что-то типа "умный стробоскоп", умный стоп-сигнал", "умный поворотник", и т.д. В части из них стоят акселерометры, анализирующие положение байка в пространстве, и величины курсового и радиального (в повороте) ускорений. Вот поэтому и потребовалось разобраться в данном вопросе.
Если здесь есть любители езды на двух колесах с мотором, могу поделиться некоторыми идеями. )))
Первоначально проблема состояла в том, чтобы "распознать" отрицательное число, получаемое микроконтроллером от акселерометра. Формат отрицательных чисел не расписан в даташит на акс. Отсюда и все спотыкачики. Смущало то, что Си без всяких подсказок селектировала числа на "+" и "-", а АБ упорно не хотел этого делать. Много времени ушло на то, чтобы понять, чем отличаются натуральные числа от отрицательных в представлении акселерометра. Задача вывода значений на UART в принципе не стояла, это была тестовая операция, необходимая только для контроля в процессе отладки кода. В реальном устройстве наличие "минуса" перед числом отображать не требуется, там анализируется модуль вектора ускорения, при этом положительные значения ускорений игнорируются.
Сейчас занимаюсь разработкой серии сервисных устройств для мотоциклов. Что-то типа "умный стробоскоп", умный стоп-сигнал", "умный поворотник", и т.д. В части из них стоят акселерометры, анализирующие положение байка в пространстве, и величины курсового и радиального (в повороте) ускорений. Вот поэтому и потребовалось разобраться в данном вопросе.
Если здесь есть любители езды на двух колесах с мотором, могу поделиться некоторыми идеями. )))
|
|
|
 |
Добавлено: 18 июл 2019, 09:02 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Работа в АБ с отрицательными числами |
Цитата |
|
В, принципе, вы почти правильно решили проблему. Но, в общем это была не проблема восприятия отрицательных чисел МК - тут все нормально работает, а проблема вывода отрицательных чисел в UART (нужно просто правильно прописать эту процедуру).
Снимок.PNG [ 2.22 КБ | Просмотров: 18845 ]
В, принципе, вы почти правильно решили проблему. Но, в общем это была не проблема восприятия отрицательных чисел МК - тут все нормально работает, а проблема вывода отрицательных чисел в UART (нужно просто правильно прописать эту процедуру). [attachment=0]Снимок.PNG[/attachment]
|
|
|
 |
Добавлено: 15 июл 2019, 20:20 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Работа в АБ с отрицательными числами |
Цитата |
|
АБ, при выводе отрицательных значений в UART отображает прямой перевод двоичного значения в десятичное: -3,9 mg = bx11111111 11111110 = 65534. Для устранения этого, мне пришлось сделать следующим образом. Положим, данные от акселерометра сохранены в 16-битном регистре "Х" микроконтроллера: bx11111111 11111110 -> X; Если 11-й разряд Х.11 = 1, то пишем 1 в бит "Т" SREG, сохраняя знак числа, и затем выполняем побитную инверсию регистра Х: |X; - теперь содержимое Х такое: Х = bx1. А бит "Т" указывает, что число отрицательное.
В принципе, я решил задачу обработки отрицательных значений акселерометра, но как-то через задний проход... Нет ли более "правильного", или рационального способа?
АБ, при выводе отрицательных значений в UART отображает прямой перевод двоичного значения в десятичное: -3,9 mg = bx11111111 11111110 = 65534. Для устранения этого, мне пришлось сделать следующим образом. Положим, данные от акселерометра сохранены в 16-битном регистре "Х" микроконтроллера: bx11111111 11111110 -> X; Если 11-й разряд Х.11 = 1, то пишем 1 в бит "Т" SREG, сохраняя знак числа, и затем выполняем побитную инверсию регистра Х: |X; - теперь содержимое Х такое: Х = bx1. А бит "Т" указывает, что число отрицательное.
В принципе, я решил задачу обработки отрицательных значений акселерометра, но как-то через задний проход... Нет ли более "правильного", или рационального способа?
|
|
|
 |
Добавлено: 14 июл 2019, 12:30 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Работа в АБ с отрицательными числами |
Цитата |
|
Выходные данные акселерометра по каждой оси хранятся в двух 8-разрядных регистрах (допустим, по оси Х это - DATAX0, DATAX1). Но формат данных может быть 10-, 11-, 12- или 13-разрядным. Он задается программно. Я использую 10-разрядный формат, при котором устройство может измерять ускорение от -2g до +2g. При положительных ускорениях, его значение в регистрах данных может принимать величину от 0 до 512 (LSB = 3,9 mg). И здесь все понятно, и просто и в двоичном виде выглядят так: 0 mg = bx0; 3,9 mg = bx1; 7,8 mg = bx10, ... 19968 mg = bx1 00000000. Десятичные значения соответствуют их прямому представлению (1; 2; ... 512). Но при изменении знака ускорения формат данных изменяется, и значения отрицательной шкалы выводятся уже в таком виде: -3,9 mg = bx11111111 11111110. При этом используются ВСЕ биты старшего регистра, а не только 2 младших, как при положительных ускорениях. Следующие величины отрицательных ускорений представляются так: -7,8 mg = bx11111111 11111101; ... -19967 mg = bx11111100 00000000. (Здесь я могу ошибаться на единицу младшего разряда). Программный код, написанный на Си, автоматически транспонирует отрицательные значения, и при выводе их по UART в монитор порта, представляет эти значения в десятичном виде как: -3,9 mg = -3,9 (mg); -7,8 mg, и т.д., т.е. Си автоматически понимает, какой знак имеет выводимая величина ускорения.
Выходные данные акселерометра по каждой оси хранятся в двух 8-разрядных регистрах (допустим, по оси Х это - DATAX0, DATAX1). Но формат данных может быть 10-, 11-, 12- или 13-разрядным. Он задается программно. Я использую 10-разрядный формат, при котором устройство может измерять ускорение от -2g до +2g. При положительных ускорениях, его значение в регистрах данных может принимать величину от 0 до 512 (LSB = 3,9 mg). И здесь все понятно, и просто и в двоичном виде выглядят так: 0 mg = bx0; 3,9 mg = bx1; 7,8 mg = bx10, ... 19968 mg = bx1 00000000. Десятичные значения соответствуют их прямому представлению (1; 2; ... 512). Но при изменении знака ускорения формат данных изменяется, и значения отрицательной шкалы выводятся уже в таком виде: -3,9 mg = bx11111111 11111110. При этом используются ВСЕ биты старшего регистра, а не только 2 младших, как при положительных ускорениях. Следующие величины отрицательных ускорений представляются так: -7,8 mg = bx11111111 11111101; ... -19967 mg = bx11111100 00000000. (Здесь я могу ошибаться на единицу младшего разряда). Программный код, написанный на Си, автоматически транспонирует отрицательные значения, и при выводе их по UART в монитор порта, представляет эти значения в десятичном виде как: -3,9 mg = -3,9 (mg); -7,8 mg, и т.д., т.е. Си автоматически понимает, какой знак имеет выводимая величина ускорения.
|
|
|
 |
Добавлено: 14 июл 2019, 12:29 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Работа в АБ с отрицательными числами |
Цитата |
|
Отрицательное число в микроконтроллере представляется в дополнительном коде. Что это такое хорошо объясняется в википедии. https://ru.wikipedia.org/wiki/%D0%94%D0 ... 0%BE%D0%B4Сверьтесь с даташитом на акселерометр, так как формат выдаваемых данных может быть сложней. Если данные в обычном дополнительном коде тогда проблем не должно быть.
Отрицательное число в микроконтроллере представляется в дополнительном коде. Что это такое хорошо объясняется в википедии. https://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4
Сверьтесь с даташитом на акселерометр, так как формат выдаваемых данных может быть сложней. Если данные в обычном дополнительном коде тогда проблем не должно быть.
|
|
|
 |
Добавлено: 14 июл 2019, 00:06 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Работа в АБ с отрицательными числами |
Цитата |
|
Конкретнее, не могу понять, как интерпретировать ДВОИЧНЫЕ отрицательные числа. С вводимыми десятичными отрицательными все очевидно, и работает.
Конкретнее, не могу понять, как интерпретировать ДВОИЧНЫЕ отрицательные числа. С вводимыми десятичными отрицательными все очевидно, и работает.
|
|
|
 |
Добавлено: 13 июл 2019, 12:53 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Работа в АБ с отрицательными числами |
Цитата |
|
Можете дать ссылку на такой пример?
Пытаюсь написать прогу для работы с акселерометром ADXL345 в АВ. Там при отрицательных ускорениях по осям, из регистров акселерометра должны извлекаться отрицательные числа. В коде, написанном на Си, так и происходит. Тот же код, транслированный в АВ, работает не правильно. После долгих поисков ошибки, пришел в выводу, что АВ не правильно интерпретирует отрицательное число, считанное из регистра акселерометра. Может быть, где-то есть пример работы с ADXL345 в АВ?
Можете дать ссылку на такой пример?
Пытаюсь написать прогу для работы с акселерометром ADXL345 в АВ. Там при отрицательных ускорениях по осям, из регистров акселерометра должны извлекаться отрицательные числа. В коде, написанном на Си, так и происходит. Тот же код, транслированный в АВ, работает не правильно. После долгих поисков ошибки, пришел в выводу, что АВ не правильно интерпретирует отрицательное число, считанное из регистра акселерометра. Может быть, где-то есть пример работы с ADXL345 в АВ?
|
|
|
 |
Добавлено: 13 июл 2019, 12:51 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Работа в АБ с отрицательными числами |
Цитата |
|
вот так -25 --> r16
также есть условия с отриательными числами (посмотрите в шаблонах)
вот так -25 --> r16
также есть условия с отриательными числами (посмотрите в шаблонах)
|
|
|
 |
Добавлено: 11 июл 2019, 19:42 |
|
|
 |
|
|
Заголовок сообщения: |
Работа в АБ с отрицательными числами |
Цитата |
|
Подскажите, как в АБ работать с отрицательными числами? В мануале Громова не нашел ничего на эту тему.
Подскажите, как в АБ работать с отрицательными числами? В мануале Громова не нашел ничего на эту тему.
|
|
|
 |
Добавлено: 11 июл 2019, 10:50 |
|
|
 |
|