Как преобразовать десятичную дробь в шестнадцатеричную в библиотеке Arduino

#arduino

#arduino

Вопрос:

Мне нужно добавить преобразование из десятичной дроби в шестнадцатеричную в этой функции, но не удалось.

     void AB1805::set_minute(const uint8_t value)
{
  _minute = value % MAX_MINUTE;
  write_rtc_register(MINUTE_REGISTER, _minute);
}
 

Я пытался

 void AB1805::set_minute(const uint8_t value)
{
  _minute = value % MAX_MINUTE;
  write_rtc_register(MINUTE_REGISTER, dec_hex(_minute,2));
}

uint8_t AB1805::dec_hex(uint8_t tens, uint8_t digits)
{
  uint8_t ret;
  ret = (tens<<4)   digits;
  return ret;
}
 

Комментарии:

1. Похоже, вы пытаетесь использовать BCD. Уточните результаты, которые вы хотите. Если вы это сделаете, решение, скорее всего, станет очевидным. В частности, что вы подразумеваете под «шестнадцатеричным»?

Ответ №1:

Шестнадцатеричная и десятичная система счисления — это всего лишь два разных способа выражения одного и того же значения.

set_minute(255); это то же самое, set_minute(0xFF); что и или set_minute(0b11111111);

Вам нужно только указать формат, если вы хотите получить строковое представление этого числа в определенном формате. Нет, если вы хотите просто использовать это значение в своем коде.

Ответ №2:

Обычно RTCS хранят данные в формате BCD

 uint8_t toBCD(uint8_t val) {  // expects a value 0 .. 99 
  return (val amp; 0x0F) | (val/10 << 4); // returns 0x00 .. 0x99
}
 

Нет проверки ошибок, как обычно в мире Arduino.

Комментарии:

1. спасибо, что вы имеете в виду без проверки ошибок и как бы вы это улучшили?

2. Что, если значение val не находится в диапазоне 0 .. 99? Некоторым значениям разрешено быть только 0 ..59 или даже меньше, потому что в RTC-регистре есть другие биты.