Динамическая индикации, не работает, объясните где ошибка?

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Hell_Cat
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вт июл 09, 2013 12:45:23
Откуда: г.Севастополь

Динамическая индикации, не работает, объясните где ошибка?

Сообщение Hell_Cat »

Собирая простой счетчик нажатия кнопки, в качестве индикатора 3-х разрядный семисегментный индикатор с ОК, землю подключил через транзисторы (в реальной схеме буду использовать BC817), сигнал на базу с МК подаю поочередно. И вместо того что б загорались разряды попчередно они горят все дружно :(
В чем проблема, что я не учел и почему так проиходит?
Схема
СпойлерИзображение

Текст программы в CodeVision
Спойлер

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

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 01.10.2014
Author  :
Company :
Comments:


Chip type               : ATtiny2313A
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 32
*****************************************************/

#include <tiny2313a.h>
#include <delay.h>

char Flag1 = 0;                           // создаем флажок для кнопки 1
char Flag2 = 0;                           // создаем флажок для кнопки 2
char Flag3 = 0;                           // создаем флажок для кнопки 3
char Number = 0;                          //Счетчик
char or = 1;                              //0(+) если 1(-)
//char tmp=0;

static flash unsigned char Replacement[] = {
    (0b00111111),       //0
    (0b00000110),       //1
    (0b01011011),       //2
    (0b01001111),       //3
    (0b01100110),       //4
    (0b01101101),       //5
    (0b01111101),       //6
    (0b00000111),       //7
    (0b01111111),       //8
    (0b01101111)        //9
    };
   
void Translation(unsigned char tmp)
{
    unsigned char Hundreds = 0;
    unsigned char Ten = 0;
    unsigned char Units = 0;
   
    Units = tmp;   
   
    while(Units >= 100)
    {
        Units -= 100;
        Hundreds ++;
    }
   
    while(Units >= 10)
    {
        Units -= 10;
        Ten ++;
    }                               
   

        PORTB.5 = 1;
        PORTD = Replacement[Hundreds];
        delay_ms(100);
        PORTB.5 = 0;
       
        PORTB.6 = 1;
        PORTD = Replacement[Ten];
        delay_ms(100);
        PORTB.6 = 0;
       
        PORTB.7 = 1;
        PORTD = Replacement[Units];
        delay_ms(100);
        PORTB.7 = 0;
       
       
    }
   
   
void main(void)                           
{

//PORTA = 0x00;
DDRA = 0x00;

PORTB = 0x00;

DDRB |= ((1<<5)|(1<<6)|(1<<7));

//PORTD = 0x00;
DDRD = 0xFF;

while (1)
    {
     
        if(PINB.0 == 0)          // опрашиваем кнопку 1(+)
        {
            Flag1 = 1;                    //кнопка нажата (устанавливаем флаг в 1)
            delay_ms(10);     //задержка (защита от дребезга)
        }
       
        if(( Flag1 == 1 ) && (PINB.0 == 1 ))         //условие если кнопка была нажата а потом отпущена
        {     
                Number += 1;
                Flag1 = 0;
//            if (or == 0)                   //Если нажата кнопка 3(-)
//            {Number -= 1; Flag1 = 0;}           // увеличиваем счетную переменную на единицу и сбрасываем флажок
//            if (or == 1)                   //Если нажата кнопка 3(+)
//            {Number += 1; Flag1 = 0;}           // увеличиваем счетную переменную на единицу и сбрасываем флажок
        }
       
       
//        if( PINB.1 == 0)                // опрашиваем кнопку 2(+)
//        {
//            Flag2 = 1;                         //кнопка нажата (устанавливаем флаг в 1)
//            delay_ms(3);               //задержка (защита от дребезга)
//        }
//
//        if(( Flag2 == 1 ) && (PINB.1 == 1))          //условие если кнопка была нажата о потом отпущена
//        { or=0; Flag2=0;}                             // уменьшаем счетную переменную на единицу и  сбрасываем флажок
//       
//        if( PINB.2 == 0)                // опрашиваем кнопку 2(+)
//        {
//            Flag3 = 1;                         //кнопка нажата (устанавливаем флаг в 1)
//            delay_ms(3);               //задержка (защита от дребезга)
//        }
//
//        if(( Flag3 == 1 ) && (PINB.2 == 1))          //условие если кнопка была нажата о потом отпущена
//        { or = 1; Flag3 = 0;}                             // уменьшаем счетную переменную на единицу и  сбрасываем флажок
       
        Translation(Number);
       
    }
}
Вложения
schetchik.rar
Протеус + прошивка
(35.88 КБ) 188 скачиваний
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение oleg110592 »

Для правильной "симуляции" транзисторы надо "подтянуть":
Изображение
Hell_Cat
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вт июл 09, 2013 12:45:23
Откуда: г.Севастополь

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение Hell_Cat »

А в реальной жизни насколько я понимаю будет достаточно резистора на базе?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение oleg110592 »

вполне.
Можно и без транзисторов обойтись, оставив только три резистора на катоды.
Изображение
Аватара пользователя
mail_robot
Встал на лапы
Сообщения: 112
Зарегистрирован: Сб янв 05, 2013 07:03:09
Откуда: в #опе изумруды?

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение mail_robot »

а я бы лучше катоды подключил напрямки, а на каждый разряд повесил по 220 омнику. Так ровнее гореть будет при смене заполнения знакоместа
Нужно делать то, что нужно. А то что не нужно, делать не нужно (с) Винни Пух
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение oleg110592 »

mail_robot писал(а):а я бы лучше катоды подключил напрямки, а на каждый разряд повесил по 220 омнику.

так будет большой ток на выводы микроконтроллера где катоды, транзисторы не зря нужны в таком случае.
Посегментная динамическая индикация.
Ее главное отличие от поразрядной индикации является в том, что в ней перебираются не разряды, а сегменты индикатора. "Горят" все сегменты очень равномерно, потребление снижается.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение ARV »

при "посегментной" индикации необходимо применять индикаторы с высокой яркостью, т.к. для обычных потребуется большой импульсный ток, что опять-таки нехорошо для МК. что касается потребляемого тока, то если обеспечивать одинаковоую яркость, никакой разницы в среднем энергопотреблении не будет :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение oleg110592 »

да яркость несколько меньше. На практике применяю обычные дешевые китайские индикаторы для посегментной индикации - яркость отличная, заказчики не жалуются. В катодах/анодах при питании 5В достаточно резисторов 150 Ом.
Насчет потребления - например, если "зажечь" все сегменты и точку, то при обычной индикации ток через 8 светодиодов (сегментов) суммарно больше чем ток через один светодиод сегмента:
(5В питания - 2В падения на светодиоде) = 3В будет падать на резисторе
ток на индикатор для посегментной индикации I=U/R 3/150 = 20мА
ток на индикатор для обычной индикации I=(U/R)*8 (3/470)*8 = 51мА
Аватара пользователя
mail_robot
Встал на лапы
Сообщения: 112
Зарегистрирован: Сб янв 05, 2013 07:03:09
Откуда: в #опе изумруды?

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение mail_robot »

не знаю как там у вас с нагрузками на выходы, у меня все работает.
Последний раз редактировалось mail_robot Вт окт 21, 2014 09:47:25, всего редактировалось 1 раз.
Нужно делать то, что нужно. А то что не нужно, делать не нужно (с) Винни Пух
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение ARV »

вы забываете, что индикация у вас динамическая, т.е. светятся сегменты/индикаторы у вас не непрерывно, а импульсами, т.е. с какой-то скважностью. так вот, при посегментной индикации СРЕДНИЙ ток через светодиод индикатора (условно можно считать, что яркость светодиода пропорциональна среднему току через него - хоть это и не совсем так, но для ориентира можно принять это) будет в 8 раз меньше при прочих равных условиях. это неизбежно означает падение яркости. если вы захотите добиться одинаковой яркости с обычным методом индикации (когда горит весь индикатор целиком), вам БУДЕТ НЕОБХОДИМО обеспечить АНАЛОГИЧНЫЙ средний ток, т.е. никакой экономии нет и быть не может. то, что у вас получается экономия, происходит не от посегментной индикации, а от того, что вы смиряетесь с потерей яркости. ну и, если уж совсем частным быть, яркость зависит не линейно от тока, поэтому на определенном участке характеристики светодиода можно получить некоторое уменьшение тока при несущественном падении яркоти - но так можно "экономить" и при любом ином виде динамической индикации :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение oleg110592 »

ну так я и сказал, что присутствует падение яркости, но для современных обычных индикаторов это вполне приемлемо для большинства применений (для моих точно). Для старых, еще советских, индикаторов типа АЛС324 это неприемлемо, для них и динамическая индикация обычная не очень то годится, лучше статическая.
Последний раз редактировалось oleg110592 Вт окт 21, 2014 16:15:05, всего редактировалось 1 раз.
Аватара пользователя
mail_robot
Встал на лапы
Сообщения: 112
Зарегистрирован: Сб янв 05, 2013 07:03:09
Откуда: в #опе изумруды?

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение mail_robot »

интересно, как же на АЛС318 сделать статическую индикацию?
Нужно делать то, что нужно. А то что не нужно, делать не нужно (с) Винни Пух
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение oleg110592 »

АЛСы бывают разные, зеленые, красные (прям как в песне) - например АЛС324
http://microcontrollerov.net/spravochni ... ors/ALS324
Аватара пользователя
mail_robot
Встал на лапы
Сообщения: 112
Зарегистрирован: Сб янв 05, 2013 07:03:09
Откуда: в #опе изумруды?

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение mail_robot »

ваше заявление было пространным, я спросил конкретно. Я знаю что они разные, но не на всех принципиально возможно организовать статику. Кстати первым экспериментом в моей жизни с динамикой был именно алс318-ый. И очень успешный. Ух и наигрался я тогда помню.... лет эдак 15 назад :roll:
Нужно делать то, что нужно. А то что не нужно, делать не нужно (с) Винни Пух
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение oleg110592 »

зачем спрашивать "как же на АЛС318 сделать статическую индикацию", если знаете, что алс318 предназначен для динамики?
Аватара пользователя
mail_robot
Встал на лапы
Сообщения: 112
Зарегистрирован: Сб янв 05, 2013 07:03:09
Откуда: в #опе изумруды?

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение mail_robot »

а зачем тогда говорить за все АЛСы?
Нужно делать то, что нужно. А то что не нужно, делать не нужно (с) Винни Пух
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Динамическая индикации, не работает, объясните где ошибк

Сообщение oleg110592 »

mail_robot писал(а):а зачем тогда говорить за все...

и где я такое говорил? Где слово "все"?
поправил свое сообщение на всякий, а то гугл на слово АЛС выдает результаты:
Автоматическая локомотивная сигнализация и амиотрофический латеральный склероз
и будем тут выяснять какое отношение это имеет к статической индикации
Для статики, к стати, АЛСов больше :)):
Изображение
Ответить

Вернуться в «Периферия»