An open API service indexing awesome lists of open source software.

https://github.com/igor-240340/hardwarecalculatorfromscratch

Calculator on AVR MCU ATmega328P
https://github.com/igor-240340/hardwarecalculatorfromscratch

assembly-language atmega328p avr binary-arithmetic calculator diy floating-point hardware hd44780 homebrew-calculator ieee-754 keypad-matrix lcd-library lcd1602 mm74c922

Last synced: 2 months ago
JSON representation

Calculator on AVR MCU ATmega328P

Awesome Lists containing this project

README

        

# Hardware Calculator From Scratch
English version is located in [en](https://github.com/igor-240340/HardwareCalculatorFromScratch/tree/en) branch.

[Страница](https://hackaday.io/project/197623-hardware-calculator-from-scratch) проекта на Hackaday.

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

![Photo 1](docs/photo_1.jpg)
![Photo 2](docs/photo_2.jpg)
![Photo 3](docs/photo_3.jpg)

https://github.com/user-attachments/assets/c9621d69-dfed-499c-8f88-36c1198a2822

## Обзор

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

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

Репозиторий библиотеки `float32avr.asm` с документацией находится [здесь](https://github.com/igor-240340/Float32AVR).

Репозиторий библиотеки `lcd1602.asm` находится [здесь](https://github.com/igor-240340/LCD1602-HD44780-AVR).

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

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

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

![Block Diagram](docs/block_diagram.png)

### Ввод чисел

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

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

![State Diagram](docs/state_diagram.png)

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

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

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

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

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

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

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

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

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

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

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

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

Основной теоретический материал (заметки, доказательства) относящийся к разработке калькулятора и к плавающей точке в частности, находится [здесь](docs/HardwareCalculatorFromScratch.%20Research.odt).

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

Проект включает полностью функционирующую симуляцию в Proteus, которую можно найти [здесь](docs/HardwareCalculatorFromScratch.pdsprj):

![Proteus Schematic](docs/proteus_schematic.png)

Если вы хотите самостоятельно изучить проект, здесь можно [скачать](https://drive.google.com/file/d/1reeEPcQ95P3t-i-bTYWgDMNL65eEh_6R/view?usp=drive_fs) все материалы, созданные в процессе разработки калькулятора. Там полная каша, но зато рассмотрены все нюансы и детали.

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

Вот список программ для открытия файлов в этой папке по их расширениям:
- **.odt**: LibreOffice Writer.
- **.ods**: LibreOffice Calc. Эти таблицы содержат симуляцию разрядной сетки и макросы для двоичной арифметики, написанные на BASIC. Возможно, они будут работать в Excel, но я не проверял, поэтому рекомендую открывать таблицы в LibreOffice Calc.
- **.drt**: Блок-схемы. Открывать в ИС Дракон. Это более удобная нотация взамен классическим блок-схемам. Программу ИС Дракон можно скачать [здесь](https://cloud.mail.ru/public/ecbde70c784a/%D0%98%D0%A1%20%D0%94%D1%80%D0%B0%D0%BA%D0%BE%D0%BD).
- **.xmind**: Приложение Xmind для майнд-мэппинга.
- **.drawio**: Открывать в draw.io.

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

![Photo 4](docs/schematic.png)

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

[Здесь](https://drive.google.com/open?id=1ui3sfd_ny48FvYHLp-04rkHGDCnqHrAI&usp=drive_fs) можно скачать все архивные инструменты, необходимые для сборки.