Skip to content

igor-240340/HardwareCalculatorFromScratch

Repository files navigation

Hardware Calculator From Scratch

Страница проекта на Hackaday.

Этот репозиторий содержит полный код прошивки для калькулятора, построенного на базе микроконтроллера AVR ATmega328P.

Photo 1 Photo 2 Photo 3

video_1.mp4

Обзор

Калькулятор построен на основе двух кастомных библиотек:

  • float32avr.asm - Программная эмуляция плавающей точки.
  • lcd1602.asm - Библиотека для работы с ЖК-дисплеем LCD1602 на базе контроллера HD44780.

Репозиторий библиотеки float32avr.asm с документацией находится здесь.

Репозиторий библиотеки lcd1602.asm находится здесь.

Этот репозиторий содержит только копии последних версий указанных библиотек.

Архитектура и принцип работы

Ниже дана общая блок-схема:

Block Diagram

Ввод чисел

Энкодер считывает нажатые клавиши и выдает 4-битный код в диапазоне от 0x0 до 0xF. Таблица ASCII-кодов клавиш хранится в RAM. Младший полубайт адреса начала таблицы содержит ноль. Когда клавиша нажата, ее 4-битный код подставляется в младший полубайт адреса таблицы, давая доступ к ASCII-коду клавиши, хранящемуся по этому адресу.

Для предотвращения ввода некорректных числовых строк реализован конечный автомат для обработки нажатий клавиш. Диаграмма состояний представлена ниже:

State Diagram

Текущее состояние хранится в стеке как адрес метки, на которую программа должна перейти при следующем прерывании клавиатуры.

Конвертация операндов

После ввода первого операнда и нажатия клавиши оператора числовая строка преобразуется в формат с плавающей точкой одинарной точности. Арифметический оператор сохраняется как ASCII-код клавиши оператора.

После ввода второго операнда он также преобразуется в float, считывается первый операнд, анализируется оператор, и вызывается одна из четырех подпрограмм библиотеки эмуляции операций с плавающей точкой.

Результат нормализуется до одного значащего десятичного разряда перед запятой и преобразуется в строку в экспоненциальном формате.

Вывод на экран

Библиотека lcd1602.asm реализует самый простой режим взаимодействия с контроллером дисплея - 8-битная шина с синхронным ожиданием busy-флага. Также реализованы вспомогательные подпрограммы управления курсором и очистки экрана.

Ошибки вычислений

В отличие от коммерческих калькуляторов, числа в этом калькуляторе представлены вформате двоичной плавающей точки, а не в двоично-десятичном формате (BCD). Поэтому точность результата зависит не только от доступной разрядности.

Источники ошибок включают:

  • Особенности формата двоичной плавающей точки:
    • Не все десятичные числа можно точно представить в двоичном формате даже при бесконечной разрядной сетке. Классический пример - число 0.1. Проще говоря, если исходное десятичное число можно разложить в сумму степеней двойки и разрядности достаточно, то такое число будет представлено точно в двоичном виде (при условии, что алгоритм конвертации даёт в общем случае наилучшее приближение, т.е. сам не является источником ошибок). В остальных случаях мы получим только приближение к исходному десятичному числу.
    • При вычислениях, из-за ограниченной разрядной сетки, в общем случае, неизбежно происходит округление.
  • Конвертация десятичной числовой строки в формат бинарной плавающей точки: Поскольку алгоритм конвертации реализует наивную схему, которая не использует арифметику с произвольной точностью, а использует ту же самую плавающую точку одинарной точности, что и для арифметический действий, может произойти округление при промежуточных вычислениях во время конвертации, которое приводит к искажению исходного десятичного числа, введенного пользователем (даже если исходное число точно представимо в двоичном виде).
  • Конвертация числа в формате плавающей точки в десятичную строку: Хотя любое двоичное число в float может быть представлено точно в десятичном виде, в этом калькуляторе, также как и в случае преобразования строки в число, используется наивная схема, базирующаяся на бинарной плавающей точке одинарной точности, поэтому возможно округление при промежуточных вычислениях, которое приводит к искажению десятичного представления исходного двоичного числа.

Документация

Основной теоретический материал (заметки, доказательства) относящийся к разработке калькулятора и к плавающей точке в частности, находится здесь.

Детали по библиотеке программной эмуляции плавающей точки float32avr.asm находятся в её репозитории.

Проект включает полностью функционирующую симуляцию в Proteus, которую можно найти здесь:

Proteus Schematic

Если вы хотите самостоятельно изучить проект, здесь можно скачать все материалы, созданные в процессе разработки калькулятора. Там полная каша, но зато рассмотрены все нюансы и детали.

Для удобства я собрал основные заметки и включил их прямо в репозиторий: docs/Basic Research Notes.

Вот список программ для открытия файлов в этой папке по их расширениям:

  • .odt: LibreOffice Writer.
  • .ods: LibreOffice Calc. Эти таблицы содержат симуляцию разрядной сетки и макросы для двоичной арифметики, написанные на BASIC. Возможно, они будут работать в Excel, но я не проверял, поэтому рекомендую открывать таблицы в LibreOffice Calc.
  • .drt: Блок-схемы. Открывать в ИС Дракон. Это более удобная нотация взамен классическим блок-схемам. Программу ИС Дракон можно скачать здесь.
  • .xmind: Приложение Xmind для майнд-мэппинга.
  • .drawio: Открывать в draw.io.

Принципиальная схема

Photo 4

Сборка

Проект был разработан в устаревшей версии AVR Studio 4 и не проверялся в Microchip Studio for AVR.

Здесь можно скачать все архивные инструменты, необходимые для сборки.