Библиотека для семисегментного индикатора

Введение

Написал новый драйвер семисегментного индикатора. Он имеет следующие особенности:

- предназначен для микроконтроллеров AVR,
- легко интегрируется в готовый проект, 
- может использоваться с компиляторами IAR, GCC, CodeVision,
- поддерживает подключение индикаторов через сдвиговые регистры,
- поддерживает подключение индикаторов через различные буферы,
- поддерживает индикаторы с общим катодом и с общим анодом,
- предоставляет возможность посегментной или поразрядной развертки,
- позволяет выводить на один индикатор несколько переменных,
- при стандартном подключении позволяет работать с 8-ю разрядами,
- при подключении через сдвиговые регистры - с 16 разрядами.

Состав драйвера

indicator.h - настройки параметров, прототипы функций
indicator.c - реализация функционала
compiler.h - файл обеспечивающий совместимость с несколькими компиляторами
spi.h, spi.c - драйвер spi, требуется только в случае использования соответствующего подключения. 

Подключение к проекту

1. Копируем все файлы драйвера в папку проекта. 
2. Подключаем файлы indicator.c, spi.c к проекту внутри среды разработки.
3. Инклюдим заголовочный файл indicator.h к сишному файлу, в котором будут использоваться функции для работы с индикатором. 
4. Настраиваем заголовочный файл indicator.h 
5. Прописываем в код вызов пользовательских функций 

Настройка конфигурации

   Настройка конфигурации включает в себя следующие шаги:

Установка количества разрядов семисегментного индикатора

#define IND_AMOUNT_NUM 8


   Для стандартной схемы включения и схемы с двумя сдвиговыми регистрами может принимать значение от 1 до 8. Для схемы с тремя сдвиговыми регистрами от 1 до 16.


Установка типа подключения семисегментного индикатора

#define IND_SPI_CONNECTION


   Если используется подключение через сдвиговые регистры с управлением по SPI, то этот макрос трогать не нужно. Если используется стандартное подключение (без SPI), макрос нужно закомментировать.

Установка типа развертки

#define IND_SCAN_SEGMENT


   Традиционно для вывода информации на семисегментный индикатор используется динамический метод, при котором каждый разряд или сегмент индикатора засвечивается на определенный промежуток времени с частотой незаметной для человеческого глаза.
   Можно реализовать динамическую индикацию двумя способами - поочередно засвечивая разряды индикатора или поочередно засвечивая один из сегментов всех разрядов сразу. Первый метод реализуется более простым кодом, однако при большом количестве разрядов, требует высокой частоты смены разрядов и, соответственно, высокого тока засветки. Второй метод всегда будет иметь одну и ту же частоту обновления, поскольку количество сегментов индикатора остается одинаковым вне зависимости от количества его разрядов. Второй метод предпочтительней использовать при количестве разрядов в индикаторе больше 8.
   Если закомментировать данный макрос, будет реализована поразрядная индикация, если оставить, то посегментная.

Выбор активного уровня сегментов

#define IND_ACTIVE_LEVEL_SEG 0


   Это логический уровень, который нужно выставить на выводе микроконтроллера (или сдвигового регистра), чтобы один сегмент индикатора засветился. В зависимости от типа семисегментного индикатора (общий катод, общий анод) и схемы его включения (прямая, через инвертирующий буфер), уровень напряжения, требуемый для засветки одного сегмента, может быть или нулем или единицей.

Выбор активного уровня разрядов

#define IND_ACTIVE_LEVEL_DIG 0


   Это логический уровень, который нужно выставить на выводе микроконтроллера (или сдвигового регистра), чтобы один разряд индикатора засветился. В зависимости от типа семисегментного индикатора (общий катод, общий анод) и схемы его включения (прямая, через инвертирующий буфер), уровень напряжения, требуемый для засветки одного разряда, может быть или нулем, или единицей.

   Например, для зажигания сегментов индикатора с общим катодом, нужно на выводы сегментов подать единицу, а на вывод разряда логический ноль. Сегменты обычно подключают напрямую к микроконтроллеру, поэтому активный уровень сегментов будет 1. Разряды индикатора обычно подключают через транзистор, открывающийся при подаче логической единицы на базу. Таким образом, активный уровень разрядов будет тоже 1. (Если разряд индикатора подключить к микроконтроллеру напрямую, то активный уровень разряда будет 0.)

Установка порта, к которому подключены сегменты индикатора

#define IND_PORT_SEG PORTC
#define IND_DDR_SEG DDRC


Если используется подключение через сдвиговые регистры, эти настройки игнорируются.

Установка порта, к которому подключены разряды индикатора

#define IND_PORT_DIG PORTD
#define IND_DDR_DIG DDRD


   Если используется подключение через сдвиговые регистры, эти настройки игнорируются.

Установка регистров к которым подключены сегменты и разряды индикатора

#define IND_SHIFT_REG_SEG 2
#define IND_SHIFT_REG_DIG1 1
#define IND_SHIFT_REG_DIG2 0


   Сдвиговый регистр, подключенный непосредственно к микроконтроллеру имеет следующие значение: при использовании двух регистров - 1, при использовании трех - 2. Сдвиговый регистр, подключенный последним каскадом всегда имеет значение - 0.

Установка выводов, к которым подключены разряды семисегментного индикатора

#define IND_NUM1 0
#define IND_NUM2 1
#define IND_NUM3 2
#define IND_NUM4 3
#define IND_NUM5 0
#define IND_NUM6 0
#define IND_NUM7 0
#define IND_NUM8 0

#define IND_NUM9 0
#define IND_NUM10 1
#define IND_NUM11 2
#define IND_NUM12 3
#define IND_NUM13 0
#define IND_NUM14 0
#define IND_NUM15 0
#define IND_NUM16 0


   Если используется традиционное подключение, номера соответствуют разрядам порта микроконтроллера и могут принимать значения от 0 до 7, при этом макросы IND_NUM9 - IND_NUM16 игнорируются. Если используется подключение через сдвиговые регистры, номера соответствуют выходам сдвигового регистра и могут принимать значения от 0 до 7.

Установка выводов, к которым подключены сегменты индикатора

#define IND_A 0
#define IND_B 1
#define IND_C 2
#define IND_D 3
#define IND_E 4
#define IND_F 5
#define IND_G 6
#define IND_COM 7


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

Использование драйвера

   Драйвер включает в себя четыре пользовательские функции.

void IND_Init(void) - функция инициализации. Настраивает порты ввода вывода, инициализирует внутренние переменные и SPI модуль микроконтроллера AVR, если он используется. Эта функция должна вызываться первой, например, в начале main`a.

void IND_Output(uint16_t value, uint8_t comma) - эта функция разделяет 16-и разрядное число на разряды, преобразует по таблице перекодировке и записывает в буфер. В дальнейшем его содержимое используется при обновлении данных на индикаторе. Число отображается на индикаторе, начиная с первого разряда.
Также эта функция принимает номер разряда, в котором будет гореть десятичная точка.

void IND_OutputFormat(uint16_t value, uint8_t comma, uint8_t position, uint8_t amount) - эта функция аналогична предыдущей, но может выводить числа в произвольные разряды семисегментного индикатора. Для этого функции передаются два параметра: position - начальный разряд и amount - количество отображаемых цифр. Минимальное значение обоих переменных - 1. Данная функция позволяет использовать один большой индикатор для отображения нескольких переменных.

void IND_Update(void) - функция обновляющая информацию на индикаторе. Эта функция должна периодически вызываться с частотой > 25* N. Где N - количество разрядов или сегментов индикатора, в зависимости от типа развертки. Вызов этой функции можно поместить в прерывание какого-нибудь таймера.

Тестовый проект

   Тестовые проекты написаны в IAR`е и AtmelStudio6. Для проверки кода использовалась макетная плата и проект в Proteus`e. В Proteus`e индикаторы подключены напрямую к микроконтроллеру и сдвиговым регистрам с целью упрощения схемы. Использовать такую схему в реальности нельзя. В зависимости от выбранной конфигурации драйвера в Proteus`e будет работать один из индикаторов. 

IND_driver_IAR.rar 
IND_driver_AS6.rar 
IND_driver_CV.rar
IND_driver_Proteus.rar
IND_driver.rar

У вас недостаточно прав для комментирования.