Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP 430 + Сегментный индикатор
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Niketa
Для того чтоб разобраться как правильно подключать и для того чтоб появился адекватный пример - создаю эту тему.

Собственно что имеется.

-Сегментный индикатор CA56-12SRWA с общим Анодом
-MSP430 Launchpad + MSP430G2553
-набор резисторов и тразисторов

Расскажу что я делал и буду рад если укажете где у меня ошибка как их исправить.

Для начала посмотрим даташит к CA56-12. 4х разрядный индикатор с общим анодом.
Цитата
Схема включения. общ.анод
Максимальное прямое напряжение,В 2.5
Максимальное обратное напряжение,В 5
Максимальный прямой ток ,мА 30
Максимальный импульсный прямой ток ,мА 155


Понятно. Посмотрим на MSP430. В даташите не указано какой максимальный суммарный ток может быть на ножках - но примем его за 100mA. Vcc = 3.5 B.

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

Вот что спаял для теста

Начнем писать КОД, но для начала представлю описание из даташита на PxOUT и PxREN

Приступим

Садим P2.1 и P2.2 на землю. Т.е. подключаем подтяги резистор и включаем чтоб выходила ножка на землю (исходя из приведенных скринов даташита)
Код
    
P2REN |= BIT1+BIT2;
P2OUT &= ~(BIT1+BIT2); // пусть всегда горят только 2 сегмента


Дальее 2.3 и 2.5 вклюаем на выход и так же подключаем подтягивающий резистор.
Код
    
P2DIR |=( BIT3+BIT5);
P2REN |= BIT3+BIT5;


Так же сделаем так чтоб P2.3 подтягивалось к общему проводу
Код
P2OUT &=~(BIT3);


Так. Теперь напишем простой кусок для того чтоб мигать то первым разряздом - то четвертым.
А именно ножки P2.3 и P2.5 поочередно подтягиваем то на землю то на питание.
Так как P2.1 и P2.2 сидят всегда на земле мы увидим мигание двух сегментов на разных разрядах.

кусок мигания
Код
for(;;) {
    
P2OUT ^= BIT5;
P2OUT ^= BIT3;

i = 50000;                    
do i--;
while(i != 0);


Итог после того как прошил контроллер.
Все мигает. НО ОЧЕНЬ ТУСКЛО!

Все ли я сделал правильно ?
Надо ли для увеличения яркости заново рассчитать номиналы резисторов ?

Маленькое видео для демонстрации как мигает и какая яркость
При свете лампы даже и не видно.
d7d1cd
А может тускло от того, что напряжение слишком мало?
Niketa
Цитата(d7d1cd @ Feb 4 2014, 21:25) *
А может тускло от того, что напряжение слишком мало?

Да вроде нет. Судя из расчета элементов должно хватать.

Замечу вот что.
Запрогал контроллер. И что я вижу
Стало заметно что это не мигание. 1 разряд загорается. А когда загорается четвертый - первый просто тускнеет.

Отключил от ЮСБ,включил обратно и все хорошо мигает.

Через пол часа опять залили прогу и уже не мигает нормально. (так как через строчку выше)

Я запутался и не могу разобраться что делать.
А ни на форуме ни в инете нету обзоров похожих подключений индикатора.
Очень надеюсь на грамотных людей в помощи.
Niketa
/////
Хотя вот переписал цикл так чтоб на одном регистре горела одна палка а на втором друга.
Так же вписал пердварительное обнуление перед показаном нового разряда и все вроде норм.

Код
    for(;;) {
        volatile unsigned int i;    // volatile to prevent optimization

        P2OUT |= (BIT1+BIT2);

        P2OUT &=~BIT1;
        P2OUT |=BIT2;

        P2OUT |=BIT5;
        P2OUT &=~BIT3;

        i = 100;
        do i--;
        while(i != 0);

        P2OUT |= (BIT1+BIT2);

        P2OUT |=BIT1;
        P2OUT &=~BIT2;

        P2OUT &=~BIT5;
        P2OUT |=BIT3;


        i = 100;
        do i--;
        while(i != 0);
    }


Теперь только с яркостью разобраться надо

Исходя из моей логики программы - во время того как загорается диод P2.1 равносильна земле.

Но я попробовал ножку с индикатора что идет к 2.1 проводкном коснуться земли(быстренько чтоб не спалить ничего) - все просто засверкало ярче яркого!

Все таки подтягивается резистор к земле хреного....

как быть ? где знающие люди ?

///////////////////////////////////////////////////////////////////////////////////////////////

Я во всем разорался,но мне непонятно почему.

Схема у меня с общим анодом.

И сегмент горит в том случе - если
Непонятно
Код
P2DIR |=BIT1; - Ножка выбора сегмента на ВЫХОД - почему ?
P2OUT &=~BIT1  - 0 на ножке

понятно
Код
P2DIR |=BIT3; Ножка выбора разряда на ВЫХОД
P2REN |= BIT3; ВКЛ подтягивающий резистор
P2OUT &=~BIT5; Подвели к земпле базу тразистора
Niketa
//////////////////////
Еще один косяк. Со всем остальным вроде разобрался.
Либо у меня где то пробой или же я не пойму в чем косяк...Номиналы наверно другие надо.


Весь КОД МИГАНИЯ
Код
#include <msp430.h>

int main(void) {
    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer


///////////НАСТРОЙКА ВСЕХ ДИОДОВ НА "НЕ ГОРИТ"//////
    //Пины управления сегментов ставим на вход
    P2DIR &=~(BIT0+BIT1+BIT2);
    P1DIR &=~(BIT1+BIT2+BIT3+BIT4+BIT5);
    //0 на пины управления сегментов
    P2OUT &=~(BIT0+BIT1+BIT2);
    P1OUT &=~(BIT1+BIT2+BIT3+BIT4+BIT5);

    //Пины выбора разряда на выход
    P2DIR |=(BIT3+BIT4+BIT5);
    P1DIR |=BIT6;
    //Подтягивающ резистор включаем
    P2REN |=(BIT3+BIT4+BIT5);
    P1REN |= BIT6;
    //Подтягиваем Vcc к пинам
    P2OUT |=(BIT3+BIT4+BIT5);
    P1OUT |=BIT6;
//////////////////////////////////////////////////////


    

////ОЧЕНЬ ПРОСТОЙ ЦИКЛ МИГАНИЯ////////////////////////
    for(;;) {
        volatile unsigned int i;    // volatile to prevent optimization
////////////////////////////////////////
        //Обнуляем все в "НЕ ГОРИТ"
        P2DIR &=~(BIT0+BIT1+BIT2);
        P1DIR &=~(BIT1+BIT2+BIT3+BIT4+BIT5);
        P2OUT |=(BIT3+BIT4+BIT5);
        P1OUT |=BIT6;

        //ВКЛ
        P2DIR |=BIT2;
        P2DIR |=BIT1;
        //Первый регистр
        P2OUT &=~BIT3;


        i = 100000;
        do i--;
        while(i != 0);
//////////////////////////////////////////
        //Обнуляем все в "НЕ ГОРИТ"
        P2DIR &=~(BIT0+BIT1+BIT2);
        P1DIR &=~(BIT1+BIT2+BIT3+BIT4+BIT5);
        P2OUT |=(BIT3+BIT4+BIT5);
        P1OUT |=BIT6;


        P2DIR |=BIT2;
        P2DIR |=BIT1;
        //Второй регистр
        P2OUT &=~BIT4;


        i = 100000;
        do i--;
        while(i != 0);
//////////////////////////////////////////
        //Обнуляем все в "НЕ ГОРИТ"
        P2DIR &=~(BIT0+BIT1+BIT2);
        P1DIR &=~(BIT1+BIT2+BIT3+BIT4+BIT5);
        P2OUT |=(BIT3+BIT4+BIT5);
        P1OUT |=BIT6;


        P2DIR |=BIT2;
        P2DIR |=BIT1;
        //Третий регистр
        P2OUT &=~BIT5;


        i = 100000;
        do i--;
        while(i != 0);
//////////////////////////////////////////
        //Обнуляем все в "НЕ ГОРИТ"
        P2DIR &=~(BIT0+BIT1+BIT2);
        P1DIR &=~(BIT1+BIT2+BIT3+BIT4+BIT5);
        P2OUT |=(BIT3+BIT4+BIT5);
        P1OUT |=BIT6;


        P2DIR |=BIT2;
        P2DIR |=BIT1;
        //Четвертый регистр
        P1OUT &=~BIT6;


        i = 100000;
        do i--;
        while(i != 0);
//////////////////////////////////////////

    }

    return 0;
}



ВИДЕО - Демонстрация проблемы ПЕрвое видео Второе видео

Почему не гаснут разряды ?
Mihey_K
Цитата
Непонятно
Код
P2DIR |=BIT1; - Ножка выбора сегмента на ВЫХОД - почему ?
P2OUT &=~BIT1  - 0 на ножке
Ток течет через индикатор от VCC на общем аноде в землю на порту МК. Поэтому порт нужно настраивать на ВЫХОД, т.к. в таком случае подключаются встроенные FET транзисторы, которые коммутируют линию на VCC (лог. 1) или на GND (лог. 0). А записью 0 встроенный транзистор замыкает линию на GND. И выключите подтяжки, они здесь только мешают, т.к. могут образовывать делитель напряжения! А в вашем примере ток течет через подтягивающие резисторы, встроенные в МК, т.к. настроены на вход!
R pullup/pulldown resistor 3 V 20-50 kΩ

Замените код на
Код
///////////НАСТРОЙКА ВСЕХ ДИОДОВ НА "НЕ ГОРИТ"//////
    //Пины управления сегментов ставим на ВЫХОД!!!!  // От входа все тускло и горит
    P2DIR |= (BIT0+BIT1+BIT2);
    P1DIR |= (BIT1+BIT2+BIT3+BIT4+BIT5);
    //0 на пины управления сегментов
    P2OUT &=~(BIT0+BIT1+BIT2);
    P1OUT &=~(BIT1+BIT2+BIT3+BIT4+BIT5);

    //Пины выбора разряда на выход
    P2DIR |=(BIT3+BIT4+BIT5);
    P1DIR |=BIT6;
    //Подтягивающ резистор ВЫКЛЮЧАЕМ, т.к. у нас все порты ВЫХОДЫ
    P2REN &= ~(BIT3+BIT4+BIT5);
    P1REN &= ~BIT6;
    //Подтягиваем Vcc к пинам  /// Не подтягиваем, а выдаем в порт 0, оттого все тускло и горит
    P2OUT |=(BIT3+BIT4+BIT5);
    P1OUT |=BIT6;
//////////////////////////////////////////////////////
Niketa
Цитата(Mihey_K @ Feb 5 2014, 06:19) *
Ток течет через индикатор от VCC на общем аноде в землю на порту МК. Поэтому порт нужно настраивать на ВЫХОД, т.к. в таком случае подключаются встроенные FET транзисторы, которые коммутируют линию на VCC (лог. 1) или на GND (лог. 0). А записью 0 встроенный транзистор замыкает линию на GND. И выключите подтяжки, они здесь только мешают, т.к. могут образовывать делитель напряжения! А в вашем примере ток течет через подтягивающие резисторы, встроенные в МК, т.к. настроены на вход!
R pullup/pulldown resistor 3 V 20-50 kΩ


Все предельно понятно.Премного вам благодарен.

Цитата(Mihey_K @ Feb 5 2014, 06:19) *
Замените код на
Код
///////////НАСТРОЙКА ВСЕХ ДИОДОВ НА "НЕ ГОРИТ"//////
    //Пины управления сегментов ставим на ВЫХОД!!!!  // От входа все тускло и горит
    P2DIR |= (BIT0+BIT1+BIT2);
    P1DIR |= (BIT1+BIT2+BIT3+BIT4+BIT5);
    //0 на пины управления сегментов
    P2OUT &=~(BIT0+BIT1+BIT2);
    P1OUT &=~(BIT1+BIT2+BIT3+BIT4+BIT5);

    //Пины выбора разряда на выход
    P2DIR |=(BIT3+BIT4+BIT5);
    P1DIR |=BIT6;
    //Подтягивающ резистор ВЫКЛЮЧАЕМ, т.к. у нас все порты ВЫХОДЫ
    P2REN &= ~(BIT3+BIT4+BIT5);
    P1REN &= ~BIT6;
    //Подтягиваем Vcc к пинам  /// Не подтягиваем, а выдаем в порт 0, оттого все тускло и горит
    P2OUT |=(BIT3+BIT4+BIT5);
    P1OUT |=BIT6;
//////////////////////////////////////////////////////


Тут ачепятка - для тех кто будет по этой теме как я подключать индикатор я подправлю



Код
///////////НАСТРОЙКА ВСЕХ ДИОДОВ НА "НЕ ГОРИТ"//////
    
        //Настройка пинов управления сегментов
    P2DIR |= (BIT0+BIT1+BIT2);
    P1DIR |= (BIT1+BIT2+BIT3+BIT4+BIT5);    
    P2OUT |= (BIT0+BIT1+BIT2);
    P1OUT |= (BIT1+BIT2+BIT3+BIT4+BIT5);

    //Настройка пинов выбора разрядов
    P2DIR |=(BIT3+BIT4+BIT5);
    P1DIR |=BIT6;
    P2OUT |=(BIT3+BIT4+BIT5);
    P1OUT |=BIT6;
//////////////////////////////////////////////////////


Как зажечь сегмент ?
Код
Пример
P2OUT &=~ BIT0;    //P2.0 управление сегментом
P2OUT &=~ BIT3:    //P2.3 управление разрядом



Очень благодарю за то что разжевали как подключать этот индикатор.
Mihey_K
Пожалуйста. А ведь еще в прошлой теме про АЦП в последнем посте я написал про настройку портов sm.gif
Niketa
//////////////////////////////////////////////////////////////////////////////////////////////////////////

Дополнительный вопрос

Как спроектировать функцию показала числа с АЦП на Сегментный индикатор.

Т.е. Я получаю с АЦП в его регситре ADC10MEM число от 0x0000 (это 0) до 0х03FF (это 1023)

Как мне из него вытащить цифры в 10теричной системе чтоб я показал его на индиктаор ?
Mihey_K
Чистая математика
Код
    uint32_t adc_result;
    uint16_t value;

    // Берём из регистра ADC10MEM результат преобразования
    adc_result = ADC10MEM;
    // Пересчитываем результат в милливольты (VREF = 2500)
    value = (uint16_t)( (adc_result * VREF) / 1024 );


И кстати в шестнадцатиричном виде вы их видите отладчиком (в CCS можно поменять систему исчисления регистров), а в контроллере нет систем исчисления. Просто значение АЦП это код в разрядах от полной шкалы, задаваемой напряжением опорного и битностью.
Niketa
Вопрос 1.
Код
uint32_t -что это ?
uint16_t -что это ?



Вопрос 2.
Как после получения числа разбить его на разряды ?
т.е. допустим число 1020 разбить на 1 , 0, 2, и 0 а дальше уже не так сложно вывести будет

Mihey_K
Ответ 1
unsigned long - 4 байта
unsigned int для MSP430 2 байта

Ответ 2
Код
    unsigned char digit; /// переменная для значения одного разряда
    unsigned char pos = 0;    /// номер разряда
    
    while (pos < 4) {
        digit = value % 10;    /// взятие остатка от деления значения АЦП
        
        /*
        * Функция вывода digit на разряд индикатора.
        * Направление движения вывода справа налево,
        * передать в функцию аргумент pos (0...3)
        * и по нему выводить соответствующий разряд
        */
        
        value /= 10;
        pos++;
    }


Чтобы нули не горели перед числом
Код
    unsigned int digit; /// переменная для значения 1 разряда
    unsigned char pos = 0;    /// номер разряда
    
    while (value) {
        digit = value % 10;    /// взятие остатка от деления
        
        /*
        * Функция вывода digit на разряд индикатора.
        * Направление движения вывода справа налево,
        * передать в функцию аргумент pos
        * и по нему выводить соответствующий разряд
        */
        
        value /= 10;
        pos++;
        if (pos > 3)
            break;
    }
Niketa
Спасибо.
Все просто оказалось.

В случае проблем подключения - думаю эта тема поможет многим.
Mihey_K
Бросьте ссылку на видео, хоть посмотреть результат совместного труда sm.gif
Niketa
Полный код программы на вывод числа.

Код
#include <msp430.h>
//unsigned int digit; /// переменная для значения 1 разряда
//unsigned int value;   // переменная для значения выводимого числа
//unsigned char pos;    /// номер разряда

void init_led(void)    // инициализация индикатора (описание смотрите в даташите)
{
    P1REN &= ~(BIT1+BIT2+BIT3+BIT4+BIT5+BIT6);
    P2REN &= ~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5);
    P2REN &= ~(BIT3+BIT4+BIT5);
    P1REN &= ~BIT6;
    P2DIR |= (BIT0+BIT1+BIT2);
    P1DIR |= (BIT1+BIT2+BIT3+BIT4+BIT5);
    P2OUT |= (BIT0+BIT1+BIT2);
    P1OUT |= (BIT1+BIT2+BIT3+BIT4+BIT5);
    P2DIR |=(BIT3+BIT4+BIT5);
    P1DIR |=BIT6;

    P2OUT |=(BIT3+BIT4+BIT5);
    P1OUT |=BIT6;
}

void clear_led(void) {            // обнуление. выключаем все регистры и цифры.
    P2OUT |= (BIT0+BIT1+BIT2);
    P1OUT |= (BIT1+BIT2+BIT3+BIT4+BIT5);
    P2OUT |= (BIT3+BIT4+BIT5);
    P1OUT |= BIT6;

    //Маленькая пауза после очистки
    volatile unsigned int i;
    i = 10;
    do i--;
    while(i != 0);
}

void show_number(number) {     // сопоставление ножек установки числа
    if (number == 0) {
        P1OUT &=~(BIT1+BIT2+BIT3+BIT5);
        P2OUT &=~(BIT0+BIT2);
    }
    if (number == 1) {
        P1OUT &=~BIT3+BIT5;
    }
    if (number == 2) {
        P1OUT &=~(BIT1+BIT3+BIT4);
        P2OUT &=~(BIT0+BIT2);
    }
    if (number == 3) {
        P1OUT &=~(BIT1+BIT3+BIT4+BIT5);
        P2OUT &=~(BIT0);
    }
    if (number == 4) {
        P1OUT &=~(BIT2+BIT3+BIT4+BIT5);
    }
    if (number == 5) {
        P1OUT &=~(BIT1+BIT2+BIT4+BIT5);
        P2OUT &=~(BIT0);
    }
    if (number == 6) {
        P1OUT &=~(BIT1+BIT2+BIT4+BIT5);
        P2OUT &=~(BIT0+BIT2);
    }
    if (number == 7) {
        P1OUT &=~(BIT1+BIT3+BIT5);
    }
    if (number == 8) {
        P1OUT &=~(BIT1+BIT2+BIT3+BIT4+BIT5);
        P2OUT &=~(BIT0+BIT2);
    }
    if (number == 9) {
        P1OUT &=~(BIT1+BIT2+BIT3+BIT4+BIT5);
        P2OUT &=~(BIT0);
    }
}

void show_registr(registr) {   // сопоставление ножек управления регистра
    if (registr == 4) {
        P1OUT &=~BIT6;
    }
    if (registr == 3) {
        P2OUT &=~BIT5;
    }
    if (registr == 2) {
        P2OUT &=~BIT4;
    }
    if (registr == 1) {
        P2OUT &=~BIT3;
    }
}

int main(void) {
    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer

    init_led();          // инициализация ножек индикатора

    for(;;) {

        volatile unsigned int digit; /// переменная для значения 1 разряда
        volatile unsigned int value;   // переменная для значения выводимого числа
        volatile unsigned int pos;    /// номер разряда

        value = 634; // ЧИСЛО ДЛЯ ВЫВОДА
        pos = 1;

        while (value) {            // цикл показа числа
            digit = value % 10;    /// взятие остатка от деления
            //clear_led();           // выключаем все
            show_registr(pos);     // выбор сегмента
            show_number(digit);    // выбор числа
            value /= 10;           // деление без остатка. отбпрасываем число которое показали
            pos++;
            clear_led();
            // счетчик позиции
            if (pos > 4)
                break;
        }

    }
}


Видео демонстрация.

Далее я дописав пару строк для того чтоб брать значение с АЦП.
Между ногой ацп,vcc и землей поставил переменный резистор для того чтоб можно было заметить разницу , да и в целом работу.


Код
Код
#include <msp430.h>

void init_led(void)    // инициализация индикатора (описание смотрите в даташите)
{
    P1REN &= ~(BIT1+BIT2+BIT3+BIT4+BIT5+BIT6);
    P2REN &= ~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5);
    P2REN &= ~(BIT3+BIT4+BIT5);
    P1REN &= ~BIT6;
    P2DIR |= (BIT0+BIT1+BIT2);
    P1DIR |= (BIT1+BIT2+BIT3+BIT4+BIT5);
    P2OUT |= (BIT0+BIT1+BIT2);
    P1OUT |= (BIT1+BIT2+BIT3+BIT4+BIT5);
    P2DIR |=(BIT3+BIT4+BIT5);
    P1DIR |=BIT6;

    P2OUT |=(BIT3+BIT4+BIT5);
    P1OUT |=BIT6;
}

void clear_led(void) {            // обнуление. выключаем все регистры и цифры.
    P2OUT |= (BIT0+BIT1+BIT2);
    P1OUT |= (BIT1+BIT2+BIT3+BIT4+BIT5);
    P2OUT |= (BIT3+BIT4+BIT5);
    P1OUT |= BIT6;

    //Маленькая пауза после очистки
    volatile unsigned int i;
    i = 10;
    do i--;
    while(i != 0);
}

void show_number(number) {     // сопоставление ножек установки числа
    if (number == 0) {
        P1OUT &=~(BIT1+BIT2+BIT3+BIT5);
        P2OUT &=~(BIT0+BIT2);
    }
    if (number == 1) {
        P1OUT &=~(BIT3+BIT5);
    }
    if (number == 2) {
        P1OUT &=~(BIT1+BIT3+BIT4);
        P2OUT &=~(BIT0+BIT2);
    }
    if (number == 3) {
        P1OUT &=~(BIT1+BIT3+BIT4+BIT5);
        P2OUT &=~(BIT0);
    }
    if (number == 4) {
        P1OUT &=~(BIT2+BIT3+BIT4+BIT5);
    }
    if (number == 5) {
        P1OUT &=~(BIT1+BIT2+BIT4+BIT5);
        P2OUT &=~(BIT0);
    }
    if (number == 6) {
        P1OUT &=~(BIT1+BIT2+BIT4+BIT5);
        P2OUT &=~(BIT0+BIT2);
    }
    if (number == 7) {
        P1OUT &=~(BIT1+BIT3+BIT5);
    }
    if (number == 8) {
        P1OUT &=~(BIT1+BIT2+BIT3+BIT4+BIT5);
        P2OUT &=~(BIT0+BIT2);
    }
    if (number == 9) {
        P1OUT &=~(BIT1+BIT2+BIT3+BIT4+BIT5);
        P2OUT &=~(BIT0);
    }
}

void show_registr(registr) {   // сопоставление ножек управления регистра
    if (registr == 4) {
        P1OUT &=~BIT6;
    }
    if (registr == 3) {
        P2OUT &=~BIT5;
    }
    if (registr == 2) {
        P2OUT &=~BIT4;
    }
    if (registr == 1) {
        P2OUT &=~BIT3;
    }
}

int main(void) {
    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer

    init_led();          // инициализация ножек индикатора

    ADC10CTL1 |= CONSEQ_0;        // single channel, single conversion
    ADC10CTL1 |= INCH_0
               + SHS_0            // use ADC10SC bit to trigger sampling
               + ADC10DIV_3    // clock divider = 4
               + ADC10SSEL_3;    // clock source = SMCLK

    ADC10CTL0 |= SREF_0        // reference voltages are Vss and Vcc
                   + ADC10SHT_3    // 64 ADC10 clocks for sample and hold time (slowest)
                   + ADC10ON
                   + ENC;

    ADC10AE0 = BIT0;      // Разрешаем вход АЦП на порту P1.0

    for(;;) {

        volatile unsigned int digit; /// переменная для значения 1 разряда
        volatile unsigned int value;   // переменная для значения выводимого числа
        volatile unsigned int pos;    /// номер разряда



        ADC10CTL0 |= ADC10SC; // включаем считвание с ацп

        while (ADC10CTL1 & ADC10BUSY); // ждем пока все считает

        value=ADC10MEM;  // конвертируем результат в напряжение и сохраняем
        pos = 1;

        while (value) {            // цикл показа числа
            digit = value % 10;    /// взятие остатка от деления
            clear_led();
            show_registr(pos);     // выбор сегмента
            show_number(digit);    // выбор числа
            value /= 10;           // деление без остатка. отбпрасываем число которое показали
            pos++;
            // счетчик позиции
            if (pos > 4)
                break;
        }

    }
}


Вот тут видео как все работает



Надо пооптимизировать программу,добавить таймеры.

С таймерами пока не разобрался как пользоваться.
d7d1cd
Цитата(Niketa @ Feb 6 2014, 13:30) *
Я думаю что вы заметили что в старшем разряде проскакивает единица. Пока мне непонятно почему.

Сделай точку остановки в отладчике именно в том месте, где происходит вывод 1 в старшем разряде. Или напиши такое условие. Потом крути-верти резистор. Когда будет выводиться 1 в старшем разряде, отладчик остановится. Посмотри значения переменных. Может так найдешь причину.

В функции show_number лучше использовать оператор switch, чем кучу if. Можно и if, но тогда все if кроме первого должны быть заменены на else if.

Зачем нужна "маленькая пауза"? Она у тебя не маленькая, она очееееееень маленькая.
Niketa
Цитата(d7d1cd @ Feb 6 2014, 14:38) *
Сделай точку остановки в отладчике именно в том месте, где происходит вывод 1 в старшем разряде. Или напиши такое условие. Потом крути-верти резистор. Когда будет выводиться 1 в старшем разряде, отладчик остановится. Посмотри значения переменных. Может так найдешь причину.

Ошибку в коде нашел. Предыдущий пост исправил. Я там забыл скобки две поставить.

Цитата(d7d1cd @ Feb 6 2014, 14:38) *
Зачем нужна "маленькая пауза"? Она у тебя не маленькая, она очееееееень маленькая.

Паузу уберу нафиг,она ненужна.

Цитата(d7d1cd @ Feb 6 2014, 14:38) *
В функции show_number лучше использовать оператор switch, чем кучу if. Можно и if, но тогда все if кроме первого должны быть заменены на else if.

Спасибо.Исправлю.
Mihey_K
Для конструкций вида
Код
if (number == 0) {
        P1OUT &=~(BIT1+BIT2+BIT3+BIT5);
        P2OUT &=~(BIT0+BIT2);
    }
    if (number == 1) {
        P1OUT &=~BIT3+BIT5;
    }
    ......
лучше использовать switch(number ) case 0: case 1: ....

Пардон, повторился, d7d1cd уже указал.
piterqq
Для большого напряжения нужно с начала проверить компоненты на которых оно гасится.
igorle
Случайно наткнулся на эту тему. Если еще актуально - год назад мне потребовалось сотворить пульт управления домашней печкой с двухсимвольным семисегментным индикатором. Для проотипа просто взял MSP430G2553 в корпусе DIP и воткнул его в бредборд. Сверху насадил индикатор. Так что каждая ножка индикатора идет напрямую к своей ножке MSP. Таким образом в каждую единицу времени можно зажечь один сегмент. Ярковато, даже учитывая, что каждый элемент горит только 1/16 времени. Но для макетирования сгодилось. Потом, когда паял конечное устройство - в цепи анодов добавил резисторы (две штуки - по одному на каждый анод)

Схему не рисовал, там и так понятно. А на код могу ссылку дать. Если интересно - пишите в личку. (я форум крайне не регулярно просматриваю, так что не увижу, если здесь кто напишет.)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.