#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-регистре есть другие биты.