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

 
 
> MSP 430 + Сегментный индикатор, Проблемы подключения
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
 
Start new topic
Ответов
Niketa
сообщение Feb 6 2014, 09:30
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- Niketa   MSP 430 + Сегментный индикатор   Feb 4 2014, 16:31
- - d7d1cd   А может тускло от того, что напряжение слишком мал...   Feb 4 2014, 17:25
|- - Niketa   Цитата(d7d1cd @ Feb 4 2014, 21:25) А може...   Feb 4 2014, 17:39
- - Niketa   ///// Хотя вот переписал цикл так чтоб на одном ре...   Feb 4 2014, 20:19
- - Niketa   ////////////////////// Еще один косяк. Со всем ост...   Feb 4 2014, 23:03
- - Mihey_K   ЦитатаНепонятно КодP2DIR |=BIT1; - Ножка выбора се...   Feb 5 2014, 02:19
|- - Niketa   Цитата(Mihey_K @ Feb 5 2014, 06:19) Ток т...   Feb 5 2014, 13:03
- - Mihey_K   Пожалуйста. А ведь еще в прошлой теме про АЦП в по...   Feb 5 2014, 15:15
- - Niketa   //////////////////////////////////////////////////...   Feb 5 2014, 15:17
- - Mihey_K   Чистая математикаКод uint32_t adc_result; uint16_...   Feb 5 2014, 15:51
- - Niketa   Вопрос 1. Кодuint32_t -что это ? uint16_t -что это...   Feb 5 2014, 16:38
- - Mihey_K   Ответ 1 unsigned long - 4 байта unsigned int для M...   Feb 5 2014, 17:41
- - Niketa   Спасибо. Все просто оказалось. В случае проблем п...   Feb 5 2014, 19:40
- - Mihey_K   Бросьте ссылку на видео, хоть посмотреть результат...   Feb 6 2014, 03:58
|- - d7d1cd   Цитата(Niketa @ Feb 6 2014, 13:30) Я дума...   Feb 6 2014, 10:38
|- - Niketa   Цитата(d7d1cd @ Feb 6 2014, 14:38) Сделай...   Feb 6 2014, 10:53
- - Mihey_K   Для конструкций вида Кодif (number == 0) {...   Feb 6 2014, 15:40
- - piterqq   Для большого напряжения нужно с начала проверить к...   Feb 20 2014, 19:46
- - igorle   Случайно наткнулся на эту тему. Если еще актуально...   Jul 7 2014, 18:37


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

 


RSS Текстовая версия Сейчас: 1st August 2025 - 22:23
Рейтинг@Mail.ru


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