Страница проекта на Hackaday.
Этот репозиторий содержит полный код прошивки для калькулятора, построенного на базе микроконтроллера AVR ATmega328P.
video_1.mp4
Калькулятор построен на основе двух кастомных библиотек:
- float32avr.asm - Программная эмуляция плавающей точки.
- lcd1602.asm - Библиотека для работы с ЖК-дисплеем LCD1602 на базе контроллера HD44780.
Репозиторий библиотеки float32avr.asm
с документацией находится здесь.
Репозиторий библиотеки lcd1602.asm
находится здесь.
Этот репозиторий содержит только копии последних версий указанных библиотек.
Ниже дана общая блок-схема:
Энкодер считывает нажатые клавиши и выдает 4-битный код в диапазоне от 0x0 до 0xF. Таблица ASCII-кодов клавиш хранится в RAM. Младший полубайт адреса начала таблицы содержит ноль. Когда клавиша нажата, ее 4-битный код подставляется в младший полубайт адреса таблицы, давая доступ к ASCII-коду клавиши, хранящемуся по этому адресу.
Для предотвращения ввода некорректных числовых строк реализован конечный автомат для обработки нажатий клавиш. Диаграмма состояний представлена ниже:
Текущее состояние хранится в стеке как адрес метки, на которую программа должна перейти при следующем прерывании клавиатуры.
После ввода первого операнда и нажатия клавиши оператора числовая строка преобразуется в формат с плавающей точкой одинарной точности. Арифметический оператор сохраняется как ASCII-код клавиши оператора.
После ввода второго операнда он также преобразуется в float
, считывается первый операнд, анализируется оператор, и вызывается одна из четырех подпрограмм библиотеки эмуляции операций с плавающей точкой.
Результат нормализуется до одного значащего десятичного разряда перед запятой и преобразуется в строку в экспоненциальном формате.
Библиотека lcd1602.asm
реализует самый простой режим взаимодействия с контроллером дисплея - 8-битная шина с синхронным ожиданием busy-флага. Также реализованы вспомогательные подпрограммы управления курсором и очистки экрана.
В отличие от коммерческих калькуляторов, числа в этом калькуляторе представлены вформате двоичной плавающей точки, а не в двоично-десятичном формате (BCD). Поэтому точность результата зависит не только от доступной разрядности.
Источники ошибок включают:
- Особенности формата двоичной плавающей точки:
- Не все десятичные числа можно точно представить в двоичном формате даже при бесконечной разрядной сетке. Классический пример - число 0.1. Проще говоря, если исходное десятичное число можно разложить в сумму степеней двойки и разрядности достаточно, то такое число будет представлено точно в двоичном виде (при условии, что алгоритм конвертации даёт в общем случае наилучшее приближение, т.е. сам не является источником ошибок). В остальных случаях мы получим только приближение к исходному десятичному числу.
- При вычислениях, из-за ограниченной разрядной сетки, в общем случае, неизбежно происходит округление.
- Конвертация десятичной числовой строки в формат бинарной плавающей точки: Поскольку алгоритм конвертации реализует наивную схему, которая не использует арифметику с произвольной точностью, а использует ту же самую плавающую точку одинарной точности, что и для арифметический действий, может произойти округление при промежуточных вычислениях во время конвертации, которое приводит к искажению исходного десятичного числа, введенного пользователем (даже если исходное число точно представимо в двоичном виде).
- Конвертация числа в формате плавающей точки в десятичную строку: Хотя любое двоичное число в
float
может быть представлено точно в десятичном виде, в этом калькуляторе, также как и в случае преобразования строки в число, используется наивная схема, базирующаяся на бинарной плавающей точке одинарной точности, поэтому возможно округление при промежуточных вычислениях, которое приводит к искажению десятичного представления исходного двоичного числа.
Основной теоретический материал (заметки, доказательства) относящийся к разработке калькулятора и к плавающей точке в частности, находится здесь.
Детали по библиотеке программной эмуляции плавающей точки float32avr.asm
находятся в её репозитории.
Проект включает полностью функционирующую симуляцию в Proteus, которую можно найти здесь:
Если вы хотите самостоятельно изучить проект, здесь можно скачать все материалы, созданные в процессе разработки калькулятора. Там полная каша, но зато рассмотрены все нюансы и детали.
Для удобства я собрал основные заметки и включил их прямо в репозиторий: docs/Basic Research Notes.
Вот список программ для открытия файлов в этой папке по их расширениям:
- .odt: LibreOffice Writer.
- .ods: LibreOffice Calc. Эти таблицы содержат симуляцию разрядной сетки и макросы для двоичной арифметики, написанные на BASIC. Возможно, они будут работать в Excel, но я не проверял, поэтому рекомендую открывать таблицы в LibreOffice Calc.
- .drt: Блок-схемы. Открывать в ИС Дракон. Это более удобная нотация взамен классическим блок-схемам. Программу ИС Дракон можно скачать здесь.
- .xmind: Приложение Xmind для майнд-мэппинга.
- .drawio: Открывать в draw.io.
Проект был разработан в устаревшей версии AVR Studio 4 и не проверялся в Microchip Studio for AVR.
Здесь можно скачать все архивные инструменты, необходимые для сборки.