niketa 0 4 февраля, 2014 Опубликовано 4 февраля, 2014 (изменено) · Жалоба Для того чтоб разобраться как правильно подключать и для того чтоб появился адекватный пример - создаю эту тему. Собственно что имеется. -Сегментный индикатор 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); Итог после того как прошил контроллер. Все мигает. НО ОЧЕНЬ ТУСКЛО! Все ли я сделал правильно ? Надо ли для увеличения яркости заново рассчитать номиналы резисторов ? Маленькое видео для демонстрации как мигает и какая яркость При свете лампы даже и не видно. Изменено 4 февраля, 2014 пользователем Niketa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 4 февраля, 2014 Опубликовано 4 февраля, 2014 · Жалоба А может тускло от того, что напряжение слишком мало? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 4 февраля, 2014 Опубликовано 4 февраля, 2014 (изменено) · Жалоба А может тускло от того, что напряжение слишком мало? Да вроде нет. Судя из расчета элементов должно хватать. Замечу вот что. Запрогал контроллер. И что я вижу Стало заметно что это не мигание. 1 разряд загорается. А когда загорается четвертый - первый просто тускнеет. Отключил от ЮСБ,включил обратно и все хорошо мигает. Через пол часа опять залили прогу и уже не мигает нормально. (так как через строчку выше) Я запутался и не могу разобраться что делать. А ни на форуме ни в инете нету обзоров похожих подключений индикатора. Очень надеюсь на грамотных людей в помощи. Изменено 4 февраля, 2014 пользователем Niketa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 4 февраля, 2014 Опубликовано 4 февраля, 2014 (изменено) · Жалоба ///// Хотя вот переписал цикл так чтоб на одном регистре горела одна палка а на втором друга. Так же вписал пердварительное обнуление перед показаном нового разряда и все вроде норм. 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; Подвели к земпле базу тразистора Изменено 4 февраля, 2014 пользователем Niketa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 4 февраля, 2014 Опубликовано 4 февраля, 2014 (изменено) · Жалоба ////////////////////// Еще один косяк. Со всем остальным вроде разобрался. Либо у меня где то пробой или же я не пойму в чем косяк...Номиналы наверно другие надо. Весь КОД МИГАНИЯ #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; } ВИДЕО - Демонстрация проблемы ПЕрвое видео Второе видео Почему не гаснут разряды ? Изменено 4 февраля, 2014 пользователем Niketa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 (изменено) · Жалоба Непонятно 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; ////////////////////////////////////////////////////// Изменено 5 февраля, 2014 пользователем Mihey_K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба Ток течет через индикатор от 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 управление разрядом Очень благодарю за то что разжевали как подключать этот индикатор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба Пожалуйста. А ведь еще в прошлой теме про АЦП в последнем посте я написал про настройку портов :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба ////////////////////////////////////////////////////////////////////////////////////////////////////////// Дополнительный вопрос Как спроектировать функцию показала числа с АЦП на Сегментный индикатор. Т.е. Я получаю с АЦП в его регситре ADC10MEM число от 0x0000 (это 0) до 0х03FF (это 1023) Как мне из него вытащить цифры в 10теричной системе чтоб я показал его на индиктаор ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 (изменено) · Жалоба Чистая математика uint32_t adc_result; uint16_t value; // Берём из регистра ADC10MEM результат преобразования adc_result = ADC10MEM; // Пересчитываем результат в милливольты (VREF = 2500) value = (uint16_t)( (adc_result * VREF) / 1024 ); И кстати в шестнадцатиричном виде вы их видите отладчиком (в CCS можно поменять систему исчисления регистров), а в контроллере нет систем исчисления. Просто значение АЦП это код в разрядах от полной шкалы, задаваемой напряжением опорного и битностью. Изменено 5 февраля, 2014 пользователем Mihey_K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба Вопрос 1. uint32_t -что это ? uint16_t -что это ? Вопрос 2. Как после получения числа разбить его на разряды ? т.е. допустим число 1020 разбить на 1 , 0, 2, и 0 а дальше уже не так сложно вывести будет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 (изменено) · Жалоба Ответ 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; } Изменено 5 февраля, 2014 пользователем Mihey_K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба Спасибо. Все просто оказалось. В случае проблем подключения - думаю эта тема поможет многим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 6 февраля, 2014 Опубликовано 6 февраля, 2014 · Жалоба Бросьте ссылку на видео, хоть посмотреть результат совместного труда :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 6 февраля, 2014 Опубликовано 6 февраля, 2014 (изменено) · Жалоба Полный код программы на вывод числа. #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; } } } Вот тут видео как все работает Надо пооптимизировать программу,добавить таймеры. С таймерами пока не разобрался как пользоваться. Изменено 6 февраля, 2014 пользователем Niketa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться