Перейти к содержанию
    

MSP 430 + Сегментный индикатор

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

 

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

 

-Сегментный индикатор 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);

 

Итог после того как прошил контроллер.

Все мигает. НО ОЧЕНЬ ТУСКЛО!

 

Все ли я сделал правильно ?

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

 

Маленькое видео для демонстрации как мигает и какая яркость

При свете лампы даже и не видно.

Изменено пользователем Niketa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А может тускло от того, что напряжение слишком мало?

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

 

Замечу вот что.

Запрогал контроллер. И что я вижу

Стало заметно что это не мигание. 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;
}

 

 

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

 

Почему не гаснут разряды ?

Изменено пользователем Niketa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Непонятно

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;
//////////////////////////////////////////////////////

Изменено пользователем Mihey_K

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ток течет через индикатор от 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;
//////////////////////////////////////////////////////

 

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

 

 

 

///////////НАСТРОЙКА ВСЕХ ДИОДОВ НА "НЕ ГОРИТ"//////
    
        //Настройка пинов управления сегментов
    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 управление разрядом

 

 

Очень благодарю за то что разжевали как подключать этот индикатор.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пожалуйста. А ведь еще в прошлой теме про АЦП в последнем посте я написал про настройку портов :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чистая математика

    uint32_t adc_result;
    uint16_t value;

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

 

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

Изменено пользователем Mihey_K

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос 1.

uint32_t -что это ?
uint16_t -что это ?

 

 

Вопрос 2.

Как после получения числа разбить его на разряды ?

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ответ 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;
    }

Изменено пользователем Mihey_K

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

Все просто оказалось.

 

В случае проблем подключения - думаю эта тема поможет многим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бросьте ссылку на видео, хоть посмотреть результат совместного труда :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Полный код программы на вывод числа.

 

#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;
        }

    }
}

 

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

 

 

 

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

 

С таймерами пока не разобрался как пользоваться.

Изменено пользователем Niketa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...