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

13/03/2013 - 16:36

Введение

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

- предназначен для микроконтроллеров 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

Комментарии   

# Pyku_He_oTTyda 15.03.2013 12:36
Спасибо!
Ответить | Ответить с цитатой | Цитировать
# Pashgan 15.03.2013 23:54
Пожалуйста.
Ответить | Ответить с цитатой | Цитировать
# DimasS01 15.04.2014 16:06
Хочу сказать ОГРОМНОЕ СПАСИБО за Вашу работу. Многому научился по Вашим статьям. НО многому еще предстоит научиться :) Использовал Ваш драйвер в своей разработке. Но мне не хватает функций драйвера. Подскажите как реализовать чтобы можно было зажечь любой произвольный светодиод ( у меня один из разрядов это 8 светодиодов состояния) а также вывод текста на индикатор. Буду благодарен за помощь в данном вопросе. Спасибо
Ответить | Ответить с цитатой | Цитировать
# Pashgan 16.04.2014 01:37
В новой версии этой библиотеки это можно реализовать ничего не меняя, но там пока нет поддержки подключения через сдвиговые регистры.
Ответить | Ответить с цитатой | Цитировать
# Melandr 04.02.2015 07:22
Добрый день Пытаюсь использовать Вашу библиотеку для часов. И столкнулся с такой проблемой. При выводе времени 05:06 на индикаторе отображается 5 6 . Хотелось бы иметь возможность выбора вывода нуля в старший разряд. Не подскажите, что нужно изменить в библиотеке. Так как при использовании в часах вывод нуля в старший разряд нужна, а при использовании при выводе данных на индикатор, необходимо тушить ноль в старших разрядах. Заранее благодарен за ответ.
Ответить | Ответить с цитатой | Цитировать
# frolikum 18.03.2013 07:15
Весьма неплохо! Хотел сам родить, что-то подобное, но опередили! Только убедился что при ограниченном размере флеша, всё равно приходится пользоваться не драйверами, хотя это ОЧЕНЬ удобно, а рукописями под конкретное решение вопроса. Т.к. в приложенном архиве хекс для протеуса уже больше 2к а по сути, там пока кроме дривера, ничего! Но время идёт и, кажется, что не за горами время когда в МК будут флеши и по несколько мегабайт так что об этом запариваться уже никто не будет.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 18.03.2013 08:44
Конечно, код, написанный под конкретное устройство, всегда будет короче драйвера, потому что последний подразумевает универсальность и значит избыточность.
Но данный код драйвера на самом деле не 2 кБ, а ~800 байт. Покрутите оптимизацию в проектах (она сейчас там минимальная) и увидите. IAR даже на самом низком уровне оптимизации дает 800 байт, AS6 при низкой оптимизации генерит порядка 2 кБ.
И по хексу нельзя судить о размере кода, в нем помимо прошивки содержаться служебные символы, адреса и контрольные суммы.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 18.03.2013 08:46
И почему ничего нет. Два драйвера (indicator.c, spi.c), инициализация (startup.c) и main. Нормально..
Ответить | Ответить с цитатой | Цитировать
# frolikum 19.03.2013 05:37
Да конечно нормально, это скорее не критика была, а так, мысли вслух, про светлое будущее МК. Сам планирую следующий проект делать с использованием именно универсальных драйверов для "приучивания "себя к более широкому подходу а не к конкретики.
Ответить | Ответить с цитатой | Цитировать
# bchserg 19.03.2013 08:53
Очень полезная тема!
Поразрядная, - на 24 разряда, даже супер яркие индикаторы, и током до 30мА сегмента, светят плохо!
Посегментную я искал, искал…, нужно было на 24 разряда. Нашел только в одном месте рабочий пример, на основании которого написал по свое. Опробовал. Индикаторы, даже при токе 3,6мА на сегмент (резистор 820 Ом) светят достаточно прилично!
Здесь: SPI_ShiftReg.c/ #define F_CPU 80000000UL/ похож нолик лишний.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 19.03.2013 09:21
Да, лишний нолик.
Ответить | Ответить с цитатой | Цитировать
# hawk 19.03.2013 18:47
Огромное Спасибо!
Ответить | Ответить с цитатой | Цитировать
# frolikum 20.03.2013 09:44
Опробовал драйвер и обнаружил:
1) При подключении индикатора к МК непосредственно и при поразрядной индикации число выводится задом на перёд по разрядам.
А вот точка правильно.
2) При определённых комбинациях в заголовочном файле и передаваемых параметрах функции, точка не горит а помаргивает.
Может я что напутал или просто недочет?!
Ответить | Ответить с цитатой | Цитировать
# Pashgan 20.03.2013 10:32
1)Такое возможно в случае неправильного подключения разрядов. Нумерация начинается справа налево. Крайний правый разряд индикатора - это младший разряд числа и в драйвере он обозначается как IND_NUM1.
2)Не знаю. Надо проверять. У меня таких эффектов не наблюдалось. Что за комбинации и параметры?
Ответить | Ответить с цитатой | Цитировать
# frolikum 20.03.2013 12:41
Так то понятно просто по моей логике IND_NUM1 это старший разряд отображаемого числа.
А по поводу точки то обратил внимание что в PROTEUSE этот порт в отличии от других сегментов горит не красным и синим а красным и серым. Видимо что то в инициализации порта но я использовал IND_Init.
Ответить | Ответить с цитатой | Цитировать
# frolikum 20.03.2013 12:48
И я так понял что номер разряда точки тоже отсчитывать справа нужно.
Ответить | Ответить с цитатой | Цитировать
# frolikum 20.03.2013 12:53
Ага а про точку то забыл:
Код:
void IND_Init(void)
{
uint8_t i;
#ifndef IND_SPI_CONNECTION
IND_PORT_SEG = (1<<IND_A)|(1<<IND_B)|(1<<IND_C)|(1<<IND_D)|(1<<IND_E)|(1<<IND_F)|(1<<IND_G);
IND_DDR_SEG = (1<<IND_A)|(1<<IND_B)|(1<<IND_C)|(1<<IND_D)|(1<<IND_E)|(1<<IND_F)|(1<<IND_G);

Ответить | Ответить с цитатой | Цитировать
# BBird 20.03.2013 12:54
))))))))
Тоже самое писал, но коммент обрезался :(
Ответить | Ответить с цитатой | Цитировать
# Pashgan 20.03.2013 13:11
Исправим.
Ответить | Ответить с цитатой | Цитировать
# BBird 20.03.2013 12:53
Добрый вечер.
У вас в библиотеке ошибка, исправьте.
В строках 120 и 121 нужно добавить "|(1
Ответить | Ответить с цитатой | Цитировать
# BBird 20.03.2013 13:00
Коммент обрезался.
Такой вопрос у меня: Возможно ли отключить вывод первых нулей, чтоб не выводилось 001. Ну и регистры все-таки слева направо наверное нужно выводить.
Ответить | Ответить с цитатой | Цитировать
# frolikum 20.03.2013 13:13
Да подсветка более старших разрядов содержащих ноль неплохо бы убрать. Я лично всегда так делаю. Не просто потому что мне так нравится а люди просят.
Ответить | Ответить с цитатой | Цитировать
# BBird 20.03.2013 13:14
Планируете в библиотеке запилить? ;)
Ответить | Ответить с цитатой | Цитировать
# BBird 20.03.2013 13:18
Блин, совсем заработался.
Спутал вас с автором.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 20.03.2013 13:27
Запилим.
Ответить | Ответить с цитатой | Цитировать
# BBird 20.03.2013 13:28
Спасибо!
Ответить | Ответить с цитатой | Цитировать
# foxit 20.03.2013 15:07
Цитирую Андрей:
Да подсветка более старших разрядов содержащих ноль неплохо бы убрать. Я лично всегда так делаю. Не просто потому что мне так нравится а люди просят.


ТОчно
Ответить | Ответить с цитатой | Цитировать
# hawk 20.03.2013 16:57
Все таки не вдуплю как вывести число, хоть автор все разжевал. У меня 3-х разрядный индикатор с ОК. Вот мой код для вывода числа к примеру 357. Код: #include "mega16.h"
#include "indicator.h"

void main( void )
{
IND_Init();


while(1){

IND_OutputFormat(357, 0, 0, 0);

IND_Update();
delay_ms(400);

}
}

Однако На всех трех сегментах выводятся разные символы.
ЗЫ. Прошу строго не судить, изучение мк и си начал недавно.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 20.03.2013 20:40
Общие выводы разрядов индикатора у тебя как подключены? Через транзисторы?
Должно быть

IND_OutputForma t(357, 0, 1, 3);

вывести в 3 разряда, начальное положение 1-й разряд индикатора, без точки.
Ответить | Ответить с цитатой | Цитировать
# frolikum 21.03.2013 07:54
Я тут подумал что неплохо было бы вести отсчёт разрядов не справа, а слева. Тогда можно было бы используя функцию IND_OutputForma t при необходимости производить округления значений на индикаторе просто указывая нужное кол-во знаков ведь в математике так и делают.
И на практике очень редко получается повесить сегменты на один порт из-за необходимости каких-то аппаратных узлов привязанных к определённой ноге так что предлагаю усложнить инициализацию так чтобы для каждого сегмента можно было определять и порт и бит.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 22.03.2013 07:14
По моему проще округлить данные до вывода на индикатор. По поводу сегментов .. ну фиг знает. Если время выкрою, попробую сделать. Это усложнит код. Тут не только инициализацию придется править, но и функцию обновления.
Ответить | Ответить с цитатой | Цитировать
# hawk 21.03.2013 17:34
Pashgan
Спасибо, разобрался. Плюс у меня не правильно были настроены активные уровни сегментов.
И еще. Сейчас, насколько я понял, частота обновления зависит от задержки. К примеру такой код
Код: unsigned int data = 0;
void main( void ){
IND_Init();
while(1){
data++;
if (data == 1000) {
data = 0;
}
IND_Output(data, 0);
IND_Update();
delay_ms(1000);
}
}

В данном случае каждый сегмент индикатора обновляется 1 раз в секунду, причем поочередно.
Может стоит вывести частоту обновления в функцию IND_Update()? Чтобы было например IND_Update(1000 );
Ответить | Ответить с цитатой | Цитировать
# frolikum 22.03.2013 05:25
В статье же написано что IND_Update нужно помещать в прерывание какого-нибудь таймера. Примерно так:
1) Настраиваешь таймер на прерывания 500 раз в секунду.
2) А потом в его обработчике прерывания пишешь Код:
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
IND_Update();
}
Ответить | Ответить с цитатой | Цитировать
# Pashgan 22.03.2013 07:10
Организовывать таким образом (c помощью программных задержек) циклическое обновление индикатора нежелательно. Лучше формировать задержки средствами аппаратных таймеров. Или помещать в прерывание требуемый код, или выставлять в прерывании флаги, а в основном цикле опрашивать их.
Ответить | Ответить с цитатой | Цитировать
# hawk 29.03.2013 19:47
Заметил странное поведение либо мк, либо библиотеки при работе. Индикатор с ОК. МК-мега16. разряды подключены к PB.
Теперь сегменты и разные порты.
Работа с PORTА. Работают все порты кроме РА7.
Работа с PORTС. РС0, РС1, РС6 работают, остальные нет.
Работа с PORTD. Работают все порты кроме PD7.
Исходя из этого у меня как минимум не будет работать один сегмент.
Если кто то может проверить отпишитесь пожалуйста после проверки
Ответить | Ответить с цитатой | Цитировать
# Pashgan 29.03.2013 20:03
Косяк только в 7-ом разряде. Я забыл прописать в инициализации настройку седьмого разряда (точки). А на порте C у тебя наверное JTAG не отключен.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 29.03.2013 20:15
Перезалил проекты. Исправил косяк с точкой и убрал нули. Проверяй. Остальные допилы в процессе.
Ответить | Ответить с цитатой | Цитировать
# hawk 29.03.2013 20:23
Огромное спасибо :-)
Ответить | Ответить с цитатой | Цитировать
# Marv5 30.03.2013 20:00
Добрый вечер.
У меня возникла проблека: при отключенном SPI и посегментной развертке компилятор IAR ругается, мол "Error[Pe020]: identifier "PORTC" is undefined", и то же самое для DDRC, PORTD, DDRD. Пытаюсь привинтить все это для МК ATMega 32A. В чем может быть загвоздка? =\
Из соурсов подключал только Indicator.c.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 31.03.2013 11:46
В свойствах проекта задан тип микроконтроллер а?
Ответить | Ответить с цитатой | Цитировать
# Marv5 31.03.2013 12:43
Да, я задал именно этот тип МК.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 31.03.2013 13:28
Такая ошибка может быть, если у микроконтроллер а нет указанных портов. Проверь, что ИАР подключил к проекту заголовочный файл iom32.h или может iom32a.h.
Ответить | Ответить с цитатой | Цитировать
# Marv5 31.03.2013 13:38
Оба заголовочных подключены: и iom32a.h, и iom32a.inc
Ответить | Ответить с цитатой | Цитировать
# Pashgan 31.03.2013 13:49
Скинь вот сюда свой проект в rar архиве, я посмотрю.
http://chipenable.ru/index.php/forum/materialy-sajta-chipenable/3245-vetka-dlya-vremennogo-khraneniya-proektov.html
Ответить | Ответить с цитатой | Цитировать
# Marv5 31.03.2013 14:44
Спасибо Pashganу за помощь! :)
У меня была ошибка в том, что я закоментировал #include "compilers.h" в файле indicator.c =_=
Ответить | Ответить с цитатой | Цитировать
# Pyku_He_oTTyda 08.04.2013 11:22
Вот еще нужная функция, которой нет: моргание индикатора
Ответить | Ответить с цитатой | Цитировать
# foxit 08.04.2013 11:33
Цитирую Pyku_He_oTTyda:
Вот еще нужная функция, которой нет: моргание индикатора

+1
Ответить | Ответить с цитатой | Цитировать
# Pashgan 08.04.2013 15:05
Я чувствую, что скоро это выльется в целый фреймворк, который будет формировать на семисегментном индикаторе даже 3Д изображение.. :D
Ответить | Ответить с цитатой | Цитировать
# frolikum 09.04.2013 08:42
А я для таких целей добавил две функции.
Первую выводящую на все разряды "минус" и вторую тушащую все разряды с помощью EMPTY_DIG. Всё в пару строк.
Ответить | Ответить с цитатой | Цитировать
# Robinz0n 07.06.2013 13:45
Спасибо за библиотеку. У меня при симуляции в протеусе следующий прикол: 3-разр. 7-сегм. инд. с ОК + Attiny2313 работает без проблем, но когда подключаю транзисторы к общим выводам то на разрядах IND_NUM2 и IND_NUM3 дублируются символы с IND_NUM1. Может есть какие идеи? Спасибо.
Ответить | Ответить с цитатой | Цитировать
# zafa1 14.06.2013 16:35
Добавил отображение отрицательного числа, если кому интересно:
Код:
void IND_OutputFormat(uint16_t value, uint8_t comma, uint8_t position, uint8_t amount)
{

uint8_t tmp;
uint8_t i;
uint8_t m=0;
if ((position <= IND_AMOUNT_NUM)&&(position != 0)){

if(value&(1<<15))//проверяем является число отрицательным
{

value=~(value-1);
//value=0-value;//тоже самое
m=1;
}
for(i = 0; i < amount; i++){
tmp = value % 10;

if ((i == 0)||(value > 0)||(position <= comma)){
ind_buf[position-1] = read_byte_flash(number[tmp]);
}
else{
if(m==1){
ind_buf[position-1] = read_byte_flash(number[11]);
m=0;
}
else{
ind_buf[position-1] = read_byte_flash(number[IND_EMPTY_NUM]);
}
}
value = value/10;
position++;




if (position > IND_AMOUNT_NUM){
break;
}
}
}

if ((comma <= IND_AMOUNT_NUM) && (comma != 0)) {
ind_buf[comma-1] |= 1<<IND_COM;
}
}
Ответить | Ответить с цитатой | Цитировать
# Plotnik 19.08.2013 16:36
Цитирую Pyku_He_oTTyda:
Вот еще нужная функция, которой нет: моргание индикатора

О-о-очень полезная весчь!Пробовал самостоятельно поиграться Вашей библиотекой-рез ультат,ессно,ни какой.Как прикрутить блинк?(натолкни те на мысль).
Ответить | Ответить с цитатой | Цитировать
# Pashgan 19.08.2013 17:36
Быстро не получится. Сам хочу переделать эту библиотеку, но пока не успеваю.
Ответить | Ответить с цитатой | Цитировать
# Plotnik 19.08.2013 17:50
Спасибо.... :-) Раз уж переделывать,то гда и динамику букаф прикрутить,и блинк в нужном месте,и.....впр очем,вот Вам и фреймворк!!! :-) Спасибо за статьи!
Ответить | Ответить с цитатой | Цитировать
# Pashgan 19.08.2013 21:09
Попытаюсь переделать с учетом изложенных здесь пожеланий.
Ответить | Ответить с цитатой | Цитировать
# Plotnik 19.08.2013 22:03
Цитирую Pashgan:
Попытаюсь переделать с учетом изложенных здесь пожеланий.

Ну,тогда ИМЕЕТ смысл создать на форуме отдельный топик по индикации,а пожелания будут-и очень много...
Ответить | Ответить с цитатой | Цитировать
# foxit 15.09.2013 10:08
Цитирую Pashgan:
Попытаюсь переделать с учетом изложенных здесь пожеланий.

Павел, драйвер еще не дорабатывал?
Ответить | Ответить с цитатой | Цитировать
# Pashgan 16.09.2013 19:14
Нет, Коль, еще не сделал. Не придумал еще как лучше сделать. А этот месяц вообще вылетел с точки зрения каких-то поделок, потому что уезжал в отпуск.
Ответить | Ответить с цитатой | Цитировать
# Anderer 24.11.2013 21:22
Спасибо большое за библиотеку.
Возник вопрос.
Код:
T++;
if (T == 100)
{
T= 0;
}
IND_Output(T, 0);
delay_ms(100);

IND_Init(); стоит по переполнению таймера.
Вот и вопрос: чем выше частота таймера, тем медленнее изменяются значения Т. Как это победить?
Т.е. при максимальной частоте таймера значение Т сменяется раз в 5 секунд, вместо 0.1. Но чем ниже частота таймера, тем быстрее изменяется Т.
Мда... Никогда не владел языком :(
Ответить | Ответить с цитатой | Цитировать
# Pashgan 24.11.2013 23:22
Не врубаюсь в твой вопрос.
Ответить | Ответить с цитатой | Цитировать
# Anderer 25.11.2013 04:32
Согласен, криво написал.
На дисплей выводится число, которое увеличивается на единицу каждую десятую долю секунды (по коду). Но на деле выходит то, что интервал смены числа зависит от частоты таймера на который повешена функция IND_Init(). Чем частота таймера выше, тем больше интервал увеличения числа. И наоборот, ставим частоту таймера ниже - интервал инкремента числа уменьшается. Как-то так.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 25.11.2013 11:48
Все равно не понятно. IND_Init() вообщем то никуда не повешена. Она с таймером никак не связана. К таймеру имеет отношение функция IND_Update(). Нужно вызывать эту функцию в прерывании таймера или по сигналу таймера, чтобы обновлять цифры на индикаторе.
Ответить | Ответить с цитатой | Цитировать
# MaxIvanich 14.01.2014 14:33
Спасибо за библиотеку.
Пробую прикрепить в CodeVision AVR
к своему проекту. выдает ошибку
Error: F:\temp\device\ AHcounter\AhC_v 3.0_RC_IntRef\i ndicator.c(83): undefined symbol 'IND_NUM1'
Как победить?
прикрепил как написано выше, файлы на си включивл в проект в компиляторе, а библиотеку indicator.h инклудил в коде
Ответить | Ответить с цитатой | Цитировать
# Pashgan 15.01.2014 14:33
Скинь вот сюда проект, я посмотрю.
http://chipenable.ru/index.php/forum/materialy-sajta-chipenable/3245-vetka-dlya-vremennogo-khraneniya-proektov.html
Ответить | Ответить с цитатой | Цитировать
# MaxIvanich 22.01.2014 19:04
Извините.
Разобрался на следующий день.
Закоментировал просто больше чем надо.
А нету библиотеки для опроса 4 или 5 кнопок для code vision.
(Хотелось бы с длинными и короткими нажатиями).
Нашел на вашем сайте библиотеку для семисегментного индикатора с мигающими разрядами и с отображением символов.
Пока разбираюсь.
Ответить | Ответить с цитатой | Цитировать
# Pashgan 28.01.2014 11:51
В готовом виде нет.. Хочу сделать универсальную библиотеку для кнопок, но пока руки не доходят.
Ответить | Ответить с цитатой | Цитировать
# Riza 18.11.2014 07:06
здравствуйте! можете пожалуйста скинуть свой листинг AVR USB программатор USBasp на микроконтроллер е FTDI.
Ответить | Ответить с цитатой | Цитировать
# sanyo.95 19.12.2014 09:47
Уважаемый автор, большое спасибо за библиотеку!
Есть задача подключить индикатор на 7 разрядов через 2 сдвиговых регистра (HC595). Я не пойму где в библиотеке настроить: к каким ногам регистра какие ноги МК подключать? Спасибо.
Ответить | Ответить с цитатой | Цитировать
# Melandr 04.02.2015 07:24
Не туда написал, рашил обновить правильно. Добрый день Пытаюсь использовать Вашу библиотеку для часов. И столкнулся с такой проблемой. При выводе времени 05:06 на индикаторе отображается 5 6 . Хотелось бы иметь возможность выбора вывода нуля в старший разряд. Не подскажите, что нужно изменить в библиотеке. Так как при использовании в часах вывод нуля в старший разряд нужна, а при использовании при выводе данных на индикатор, необходимо тушить ноль в старших разрядах. Заранее благодарен за ответ.
Ответить | Ответить с цитатой | Цитировать
# natali534 03.12.2015 15:43
не разбираюсь в ардуино, нужна помощь в написании программы.
нужно выводить на семисегментный дисплей числа от 0 до FF
Ответить | Ответить с цитатой | Цитировать
# melandr 02.03.2016 13:47
Такой вопрос. Необходимо выводить две переменных на 2 четырехразрядны х индикатора. Сегменты подключены к порту D, а разряды - к порту В. Биты в сегментах и разрядах расположены не по порядку. Я указываю в файле indicator.h соответсвие пинов таким образом:
Код:/*к каким выводам подключены разряды*/
#define IND_NUM1 0
#define IND_NUM2 1
#define IND_NUM3 2
#define IND_NUM4 3
#define IND_NUM5 6
#define IND_NUM6 7
#define IND_NUM7 4
#define IND_NUM8 5

/*к каким выводам подключены сегменты*/
#define IND_A 7
#define IND_B 0
#define IND_C 2
#define IND_D 6
#define IND_E 5
#define IND_F 3
#define IND_G 1
#define IND_COM 4

Буфер индикатора заполняю вызовом
Код: IND_OutputFormat(tempbutton,2,1,4);
IND_OutputFormat(tempbutton1,6,5,4);

Но символы в каждый разряд выводятся не в том порядке, который я указываю.
Ответить | Ответить с цитатой | Цитировать

Добавить комментарий

Защитный код
Обновить