|
MSP 430 + Сегментный индикатор, Проблемы подключения |
|
|
|
Feb 4 2014, 16:31
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 19)
|
Feb 4 2014, 17:39
|
Участник

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

|
Цитата(d7d1cd @ Feb 4 2014, 21:25)  А может тускло от того, что напряжение слишком мало? Да вроде нет. Судя из расчета элементов должно хватать. Замечу вот что. Запрогал контроллер. И что я вижу Стало заметно что это не мигание. 1 разряд загорается. А когда загорается четвертый - первый просто тускнеет. Отключил от ЮСБ,включил обратно и все хорошо мигает. Через пол часа опять залили прогу и уже не мигает нормально. (так как через строчку выше) Я запутался и не могу разобраться что делать. А ни на форуме ни в инете нету обзоров похожих подключений индикатора. Очень надеюсь на грамотных людей в помощи.
Сообщение отредактировал Niketa - Feb 4 2014, 19:01
|
|
|
|
|
Feb 4 2014, 20:19
|
Участник

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

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

Частый гость
 
Группа: Участник
Сообщений: 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 и не только...
|
|
|
|
|
Feb 5 2014, 13:03
|
Участник

Группа: Участник
Сообщений: 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 управление разрядом Очень благодарю за то что разжевали как подключать этот индикатор.
|
|
|
|
|
Feb 5 2014, 15:17
|
Участник

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

|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
Дополнительный вопрос
Как спроектировать функцию показала числа с АЦП на Сегментный индикатор.
Т.е. Я получаю с АЦП в его регситре ADC10MEM число от 0x0000 (это 0) до 0х03FF (это 1023)
Как мне из него вытащить цифры в 10теричной системе чтоб я показал его на индиктаор ?
|
|
|
|
|
Feb 5 2014, 15:51
|

Частый гость
 
Группа: Участник
Сообщений: 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 и не только...
|
|
|
|
|
Feb 5 2014, 16:38
|
Участник

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

|
Вопрос 1. Код uint32_t -что это ? uint16_t -что это ? Вопрос 2. Как после получения числа разбить его на разряды ? т.е. допустим число 1020 разбить на 1 , 0, 2, и 0 а дальше уже не так сложно вывести будет
|
|
|
|
|
Feb 5 2014, 17:41
|

Частый гость
 
Группа: Участник
Сообщений: 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 и не только...
|
|
|
|
|
Feb 5 2014, 19:40
|
Участник

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

|
Спасибо. Все просто оказалось.
В случае проблем подключения - думаю эта тема поможет многим.
|
|
|
|
|
Feb 6 2014, 09:30
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 6 2014, 10:38
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(Niketa @ Feb 6 2014, 13:30)  Я думаю что вы заметили что в старшем разряде проскакивает единица. Пока мне непонятно почему. Сделай точку остановки в отладчике именно в том месте, где происходит вывод 1 в старшем разряде. Или напиши такое условие. Потом крути-верти резистор. Когда будет выводиться 1 в старшем разряде, отладчик остановится. Посмотри значения переменных. Может так найдешь причину. В функции show_number лучше использовать оператор switch, чем кучу if. Можно и if, но тогда все if кроме первого должны быть заменены на else if. Зачем нужна "маленькая пауза"? Она у тебя не маленькая, она очееееееень маленькая.
Сообщение отредактировал d7d1cd - Feb 6 2014, 10:44
|
|
|
|
|
Feb 6 2014, 10:53
|
Участник

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

|
Цитата(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. Спасибо.Исправлю.
|
|
|
|
|
Feb 6 2014, 15:40
|

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

|
Для конструкций вида Код if (number == 0) { P1OUT &=~(BIT1+BIT2+BIT3+BIT5); P2OUT &=~(BIT0+BIT2); } if (number == 1) { P1OUT &=~BIT3+BIT5; } ...... лучше использовать switch(number ) case 0: case 1: .... Пардон, повторился, d7d1cd уже указал.
Сообщение отредактировал Mihey_K - Feb 6 2014, 15:41
--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
|
|
|
|
|
Feb 20 2014, 19:46
|
Группа: Новичок
Сообщений: 5
Регистрация: 3-07-13
Пользователь №: 77 385

|
Для большого напряжения нужно с начала проверить компоненты на которых оно гасится.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|