реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
Niketa
сообщение Feb 4 2014, 16:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



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

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

-Сегментный индикатор 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 - Feb 4 2014, 16:38
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Feb 4 2014, 17:25
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



А может тускло от того, что напряжение слишком мало?
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 4 2014, 17:39
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



Цитата(d7d1cd @ Feb 4 2014, 21:25) *
А может тускло от того, что напряжение слишком мало?

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

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

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

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

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

Сообщение отредактировал Niketa - Feb 4 2014, 19:01
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 4 2014, 20:19
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



/////
Хотя вот переписал цикл так чтоб на одном регистре горела одна палка а на втором друга.
Так же вписал пердварительное обнуление перед показаном нового разряда и все вроде норм.

Код
    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 - Feb 4 2014, 20:19
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 4 2014, 23:03
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



//////////////////////
Еще один косяк. Со всем остальным вроде разобрался.
Либо у меня где то пробой или же я не пойму в чем косяк...Номиналы наверно другие надо.


Весь КОД МИГАНИЯ
Код
#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 - Feb 4 2014, 23:38
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 5 2014, 02:19
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



Цитата
Непонятно
Код
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 - Feb 5 2014, 02:32


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 5 2014, 13:03
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



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



Очень благодарю за то что разжевали как подключать этот индикатор.
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 5 2014, 15:15
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



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


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 5 2014, 15:17
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



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

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

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

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

Как мне из него вытащить цифры в 10теричной системе чтоб я показал его на индиктаор ?
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 5 2014, 15:51
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



Чистая математика
Код
    uint32_t adc_result;
    uint16_t value;

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


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

Сообщение отредактировал Mihey_K - Feb 5 2014, 15:57


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 5 2014, 16:38
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



Вопрос 1.
Код
uint32_t -что это ?
uint16_t -что это ?



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

Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 5 2014, 17:41
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



Ответ 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 - Feb 5 2014, 17:21


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 5 2014, 19:40
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



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

В случае проблем подключения - думаю эта тема поможет многим.
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 6 2014, 03:58
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



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


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 6 2014, 09:30
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



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

Код
#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 - Feb 6 2014, 10:45
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 02:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01533 секунд с 7
ELECTRONIX ©2004-2016