Хранитель Атлантиды
Решил поставить в проект в качестве внешних часов DS1307 — просто самое дешевое, что было из доступного в местном «Чип-и-Дипе». Лишний раз подивился, до чего дошла современная электроника: из внешних устройств микросхеме нужен только кварц и батарейка, все остальное она делает сама, общаясь с внешним миром по I2C, а заодно и синхроимпульсы выдавая на отдельную ножку. В строгом соответствии законам Мерфи, при макетировании не пропаялась именно ножка, идущая на батарейку.
Также случайно обнаружил, что применительно к часам двоично-десятичные коды без всяких преобразований годятся для непосредственного вывода при представлении результата в шестнадцатеричном виде. Например, у нас есть упакованное число 36, которое в BCD записывается как 00110110. При прямом преобразовании в десятичное мы получим 54, что не соответствует действительности, а вот 16-ричная запись, внезапно, дает нам искомые 36. Происходит это из-за того, что у часов значения не выходят за пределы 60, поэтому если программе не требуется производить какие-то вычисления, то можно хранить и выводить BCD вообще без всякой обработки, что довольно удобно.
Ну а компилятор, при очередной попытке перехитрить его, вновь оказался умнее, заменив умножение на 10 несколькими последовательными сложениями, уложившись в пять ассемблерных строчек. Моя реализация с представлением умножения как суммы двух битовых сдвигов оказалась на одну инструкцию длиннее — видимо, поэтому он ее и не принял, заменив своей.
Также случайно обнаружил, что применительно к часам двоично-десятичные коды без всяких преобразований годятся для непосредственного вывода при представлении результата в шестнадцатеричном виде. Например, у нас есть упакованное число 36, которое в BCD записывается как 00110110. При прямом преобразовании в десятичное мы получим 54, что не соответствует действительности, а вот 16-ричная запись, внезапно, дает нам искомые 36. Происходит это из-за того, что у часов значения не выходят за пределы 60, поэтому если программе не требуется производить какие-то вычисления, то можно хранить и выводить BCD вообще без всякой обработки, что довольно удобно.
Ну а компилятор, при очередной попытке перехитрить его, вновь оказался умнее, заменив умножение на 10 несколькими последовательными сложениями, уложившись в пять ассемблерных строчек. Моя реализация с представлением умножения как суммы двух битовых сдвигов оказалась на одну инструкцию длиннее — видимо, поэтому он ее и не принял, заменив своей.