Регулировка яркости 7-мисегментника...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

Всем привет :))

Есть схема на Mega16 с выводом информации на 2 семисегментных индикатора. Схема работает, информация выводится, днем яркость индикаторов нормальная, а вот ночью слепит...

Надо сделать регулировку яркости индикаторов, только не знаю как... Видимо надо использовать ШИМ, но не могу придумать, как использовать его в динамической индикации... Кто подскажет?

Заранее спасибо :)
112.JPG
Схема включения индикаторов.
(59.43 КБ) 727 скачиваний
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение pyzhman »

К схеме хорошо исходник бы.
Как вариант: фоторезистор, с него на АЦП, перерасчет времени свечения/несвечения каждого индикатора.
Docendo discimus
Реклама
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

Вот код вывода на индикаторы:

Код: Выделить всё

void hc164_wr(unsigned char dig1, unsigned char dig2){ // Тут отправляются данные на 74HC164
 for(a=0; a<8; a++){
 PORTC.4=buf[dig1] & 1<<a;
 PORTC.5=buf[dig2] & 1<<a;
 PORTC.6=0;
 PORTC.6=1;
 }
}

// Это стоит в таймере. Он "тикает" каждые 2 мс.
 digit_out[0]=d1;
 digit_out[1]=d2;
 digit_out[2]=d3;
 digit_out[3]=d4;
 digit_out[4]=d5;
 digit_out[5]=d6;
 digit_out[6]=d7;
 digit_out[7]=d8;

 dig++;
switch (dig){
    case 1: PORTC=0b00001111; hc164_wr(digit_out[dig-1], digit_out[dig+3]); shim(1); break;
    case 2: PORTC=0b00001111; hc164_wr(digit_out[dig-1], digit_out[dig+3]); shim(2); break;
    case 3: PORTC=0b00001111; hc164_wr(digit_out[dig-1], digit_out[dig+3]); shim(3); break;
    case 4: PORTC=0b00001111; hc164_wr(digit_out[dig-1], digit_out[dig+3]); shim(4); dig=0; break;
    }   
}
Мне главное код, который будет изменять яркость. Как включать изменение я придумаю, скорее всего фоторезистор :))
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
D.VOVA
Опытный кот
Сообщения: 764
Зарегистрирован: Вт окт 27, 2009 21:27:21
Откуда: Ульяновск

Re: Регулировка яркости 7-мисегментника...

Сообщение D.VOVA »

Стрелка с эмиттеров транзисторов не к +5В, а к -5В. А яркость удобно устанавливать уменьшая длительность импульсов (скважность) на базах транзисторов. Для ночного режима длительность импульсов нужно уменьшить примерно в восемь раз (не меняя частоту сканирования динамической индикации). Для автоматического переключения режимов "день-ночь" на любой вход контроллера добавь цепочку из последовательных фоторезистора и резистора. Номинал резистора необходимо подобрать так, чтобы при пороговой освещённости напряжение на входе контроллера было ~2,4В. Естественно, всё это реализуемо только при небольшой корректировке программы.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

Стрелки именно к +5В, я просто не правильно схему нарисовал :oops: Индикаторы с общим анодом.

Пока сделал так:

Код: Выделить всё

void shim(char p){
switch(p){
    case 1: PORTC=0b00001110;
    for(n=0; n<100; n++){
    if(n==80) PORTC=0b00001111;
    }
    break;
      
    case 2: PORTC=0b00001101;
    for(n=0; n<100; n++){
    if(n==80) PORTC=0b00001111;
    }
    break;
      
    case 3: PORTC=0b00001011;
    for(n=0; n<100; n++){
    if(n==80) PORTC=0b00001111;
    }
    break;
      
    case 4: PORTC=0b00000111;
    for(n=0; n<100; n++){
    if(n==80) PORTC=0b00001111;
    }      
    break;
 }
}

// И в таймере изменил

 dig++;
switch (dig){
    case 1: PORTC=0b00001111; hc164_wr(digit_out[dig-1], digit_out[dig+3]); shim(1); break;
    case 2: PORTC=0b00001111; hc164_wr(digit_out[dig-1], digit_out[dig+3]); shim(2); break;
    case 3: PORTC=0b00001111; hc164_wr(digit_out[dig-1], digit_out[dig+3]); shim(3); break;
    case 4: PORTC=0b00001111; hc164_wr(digit_out[dig-1], digit_out[dig+3]); shim(4); dig=0; break;
    }
Работает, какие ещё есть варианты?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение pyzhman »

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

Код: Выделить всё

PORTC=0b00001111
Время до переполнения задавать в зависимости от освещенности. Т.о. время свечения каждого индикатора будет зависеть от освещенности.
Посмотрел ваше решение: этож сколько времени бездарно убьется...
Docendo discimus
Реклама
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

Спасибо, попробую :))
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

А можете кусочек кода подкинуть, а то что-то не получается...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение GP1 »

Регулировать яркость проще всего отдельным таймером в режиме ШИМ, подавая его на дополнительный ключ, у меня так в спидометре реализовано http://radiokot.ru/circuit/digital/measure/27 , но там код на асме.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

А можно программный ШИМ использовать? Просто схема на плате спаяна и добавить ещё один транзистор не получится...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение РадиоЛоматель »

Как всегда делаю я в этих случаях:
Во первых, динамическая индикация всегда должна висеть на таймере. Это дает многие преимущества. Автор правильно сделал.
Во вторых, у этого таймера должно быть два прерывания: По переполнению и по сравнению.
В прерывании по переполнению мы выводим на индикатор текущую цифру из памяти, предварительно включив соответствующий ей разряд. В прерывании по сравнению мы гасим цифру. Тогда можно регулировать соотношение времени включенного индикатора и выключенного (скважность). Соответственно, от переполнения до сравнения-включено, от сравнения до следующего переполнения-выключено. Получается ШИМ, удобный, простой в управлении, о котором не надо думать в остальной программе.
Естесственно, яркость будет пророрциональна значению регистра сравнения. (Кадется даже линейно, честно, не очень помню).
Так оно у меня работает во многих проектах и файлики с динамической индикацией у меня не меняются уже много лет.
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

А можете код показать? :)
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение РадиоЛоматель »

Конечно покажу. Тут я все прокоментировал. Там есть несколько вещей, что нужно переделать для оптимизации, но и так работать будет. Я сказал что и где.
Вложения
indication.c
(3.52 КБ) 238 скачиваний
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение O-LED »

КАШАК
вот этим вы гасите все цифры PORTC=0b00001111; так??

тогда на этом же таймере включите еще прерывание по совпвдению, и перенесети эту строчку (case 1: PORTC=0b00001111;)в обработчик этого прерывания. Теперь изменяя TCNTх вы будете менять время свечения сегмента, и следовательно яркость.
KIT
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

Да, так я гашу все сегменты. Сейчас буду разбираться... :)
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

Кстати, вот неплохая, на мой взгляд, программа для работы с семисегментными индикаторами. Может кому пригодится :)

http://narod.ru/disk/15412406001/%D0%9F ... A.rar.html
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

Все, сделал на таймере, работает :))
Еще такой вопрос. Попал мне в руки самодельный "бортовой компьютер". И исходники прошивки. Делали его делали, да недоделали, вот и отдали. Все хорошо, только тахометра там нет (конечно не только тахометра, но вся сложность именно в нем), а все выводы прерываний таймера заняты... Как можно сделать тахометр без прерываний?

P.S.
Контроллер Mega 16.
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение Аlex »

Внешнее прерывание + таймер.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Регулировка яркости 7-мисегментника...

Сообщение КАШАК »

А если выводы внешних прерываний заняты?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»