|
Подключение 7-сегментного индикатора к msp430g24523, программирование |
|
|
|
Jun 16 2013, 15:19
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 23-01-13
Пользователь №: 75 313

|
Добрый день, я собрал небольшую вставочную схему для отладчика LaunchPad на МК msp430g2452(фото прикреплен), где содержатся 7-сегментный, 4хразрядный индикатор. 7 сегментов я вывел на второй порт (Р2), а разряды на первый порт (Р1). Проблема в том что я не могу включить этот индикатор, точнее не знаю какой код прописать. Таблицы образов написал, а как заработал этот индикатор не знаю static const u_char TBL_IMAGE[ ] = 0x40, // 0 0x79, // 1 0x24, // 2 0x30, // 3 0x19, // 4 0x12, // 5 0x02, // 6 0x78, // 7 0x00, // 8 0x10, // 9 static const u_char TBL_COM[ ] = 0xF8, // А1 0xF4, // А2 0xEC, // А3 0xDC, // А4 Идея такая, если взять какое нибудь число и его код в шестнадцатеричном коде и перевести в двоичный, то 0 должные зажигать LED подсветки, а 1 отключать. Помогите мне написать простенькую программу, хоть простой какой нибудь счетчик, чтоб я понял как взаимодействует простой индикатор без драйверов с МК. Как загнать образы в порта и выводить значения на индикаторе?
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 16 2013, 17:19
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 23-01-13
Пользователь №: 75 313

|
Цитата(kovigor @ Jun 16 2013, 19:54)  Индикаторы есть разные - с общим катодом и с общим анодом (ваша схема рассчитана на общий анод). Какой у вас индикатор ? И номиналы резисторов на схеме не указаны. Начать советую с малого - засветите сегмент "A" первой цифры (цифра включена, если база ее транзистора заземлена). Дальше поймете сами ... индикатор SM420364. R3...R11 С2-33-0,25-330 Ом ± 10%-А-В-В, R12...R1 С2-33-0,25-2,2 кОм ± 10%-А-В-В Цитата(kovigor @ Jun 16 2013, 19:54)  Индикаторы есть разные - с общим катодом и с общим анодом (ваша схема рассчитана на общий анод). Какой у вас индикатор ? И номиналы резисторов на схеме не указаны. Начать советую с малого - засветите сегмент "A" первой цифры (цифра включена, если база ее транзистора заземлена). Дальше поймете сами ... Как засветить сегмент А? Такой индикатор
|
|
|
|
|
Jun 16 2013, 17:29
|
Частый гость
 
Группа: Участник
Сообщений: 157
Регистрация: 10-05-13
Пользователь №: 76 788

|
А не пробовали взять батарейку, резистор и два провода, и руками зажечь этот самый сегмент. А уж потом пытаться его зажечь через плату.
--------------------
Скажи нет международному терроризму... не покупай Pepsi Cola.
|
|
|
|
|
Jun 16 2013, 17:40
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 23-01-13
Пользователь №: 75 313

|
Цитата(fractcon @ Jun 16 2013, 21:29)  А не пробовали взять батарейку, резистор и два провода, и руками зажечь этот самый сегмент. А уж потом пытаться его зажечь через плату. Пробовал, но через плату не получается
|
|
|
|
|
Jun 16 2013, 17:51
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Cruz21 @ Jun 16 2013, 22:19)  индикатор SM420364. http://www.yxztdz.com/EnProductShow.asp?ID=240Цитата(Cruz21 @ Jun 16 2013, 22:19)  Как засветить сегмент А? Например, подать через токоограничивающий резистор "+" на 11 пин и "-" на 12 пин индикатора. Должен светиться сегмент A первой цифры. Цитата(Cruz21 @ Jun 16 2013, 22:19)  Такой индикатор На фото изображен аналогичный, но другой по распиновке индикатор - CA56-11GWA фирмы Kingbright http://www.kingbrightusa.com/images/catalo.../ca56-11gwa.pdfВашему "китайцу" более соответствует (по распиновке) C C56-12SRWA http://www.kingbrightusa.com/images/catalo...CC56-12SRWA.pdfВообще программу для управления семисегментником нужно писать немного не так. Обозначьте сегменты символьными именами в виде макроподстановок. Тогда вся настройка под конкретный индикатор будет заключаться в редактировании макросов, а подстановка - выбором из таблицы по индексу. Код #define SG_A (1U<<6) #define SG_B (1U<<7) #define SG_C (1U<<5) #define SG_D (1U<<4) #define SG_E (1U<<3) #define SG_F (1U<<2) #define SG_G (1U<<1) #define SG_H (1U<<0)
//таблица символов 0-9 unsigned char Symb7SegTab[]= { SG_A | SG_B | SG_C | SG_D | SG_E | SG_F, // 0 SG_B | SG_C, // 1 SG_A | SG_B | SG_G | SG_E | SG_D, // 2 SG_A | SG_B | SG_C | SG_D | SG_G, // 3 SG_F | SG_G | SG_B | SG_C, // 4 SG_A | SG_F | SG_G | SG_C | SG_D, // 5 SG_A | SG_F | SG_E | SG_D | SG_C | SG_G, // 6 SG_A | SG_B | SG_C, // 7 SG_A | SG_B | SG_C | SG_D | SG_E | SG_F | SG_G, // 8 SG_A | SG_B | SG_C | SG_D | SG_F | SG_G, // 9 }; Для управления сегментами нужно вначале проинициализировать функции пинов как выходов GPIO. Код P1SEL &= BIT2 | BIT3 | BIT4 | BIT5; P1DIR |= BIT2 | BIT3 | BIT4 | BIT5; P1OUT &= BIT2 | BIT3 | BIT4 | BIT5; P2SEL = 0x00; P2DIR = 0xFF; P2OUT = 0x00; Поскольку выводы управления анодами и катодами совмещены, то вам нужно реализовать динамическую индикацию. Т.е. в цикле с интервалом 1-5мс устанавливать по-очереди выводы общих анодов/катодов в активное состояние, а на выводы сегментов синхронно с ними выводить число, соответствующее порядковому номеру цифры, используя таблицу преобразования.
|
|
|
|
|
Jun 16 2013, 17:57
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 23-01-13
Пользователь №: 75 313

|
Цитата(rezident @ Jun 16 2013, 21:51)  http://www.yxztdz.com/EnProductShow.asp?ID=240Например, подать через токоограничивающий резистор "+" на 11 пин и "-" на 12 пин индикатора. Должен светиться сегмент A первой цифры. На фото изображен аналогичный, но другой по распиновке индикатор - CA56-11GWA фирмы Kingbright http://www.kingbrightusa.com/images/catalo.../ca56-11gwa.pdfВашему "китайцу" более соответствует (по распиновке) CA56-12SRWA http://www.kingbrightusa.com/images/catalo...CA56-12SRWA.pdfВообще программу для управления семисегментником нужно писать немного не так. Обозначьте сегменты символьными именами в виде макроподстановок. Тогда вся настройка под конкретный индикатор будет заключаться в редактировании макросов, а подстановка - выбором из таблицы по индексу. Код #define SG_A (1U<<6) #define SG_B (1U<<7) #define SG_C (1U<<5) #define SG_D (1U<<4) #define SG_E (1U<<3) #define SG_F (1U<<2) #define SG_G (1U<<1) #define SG_H (1U<<0)
//таблица символов 0-9 unsigned char Symb7SegTab[]= { SG_A | SG_B | SG_C | SG_D | SG_E | SG_F, // 0 SG_B | SG_C, // 1 SG_A | SG_B | SG_G | SG_E | SG_D, // 2 SG_A | SG_B | SG_C | SG_D | SG_G, // 3 SG_F | SG_G | SG_B | SG_C, // 4 SG_A | SG_F | SG_G | SG_C | SG_D, // 5 SG_A | SG_F | SG_E | SG_D | SG_C | SG_G, // 6 SG_A | SG_B | SG_C, // 7 SG_A | SG_B | SG_C | SG_D | SG_E | SG_F | SG_G, // 8 SG_A | SG_B | SG_C | SG_D | SG_F | SG_G, // 9 }; как мне через этот код зажечь числа 1 2 3 4? исходник программы нужен.
|
|
|
|
|
Jun 16 2013, 18:34
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 23-01-13
Пользователь №: 75 313

|
Цитата(rezident @ Jun 16 2013, 22:09)  Ну знаете ли ... вы бы попробовали вначале сами что-то написать. То, что можно будет отрецензировать и указать на недочеты. А писать для вас код (даже простой) в 1-м часу ночи мне уже как-то лениво.  "Дорогу осилит идущий". Успехов! Спасибо за помощь, я понять хочу как работает МК с дисплеем, хочу вывести хоть одну цифру, чтобы понять. Но у меня не получается что то ничего. А сама программа она должна выводить на LED индикатор частоту и период. Потому что я делаю генератор прямоугольных импульсов на МК msp430 Код #include <msp430g2452.h> #define u_char unsigned char #define s_u_char static unsigned char #define u_int unsigned int #define A0 BIT0 #define A1 BIT1 // -------- таблица образов цифр семисегментного индикатора ------- static const u_char TBL_IMAGE[10] = { 0x40, // 0 0x79, // 1 0x24, // 2 0x30, // 3 0x19, // 4 0x12, // 5 0x02, // 6 0x78, // 7 0x00, // 8 0x10, // 9 };
// таблица сигналов управления анодами 4 цифр светодиодного дисплея static const u_char TBL_COM[4] = { 0xF8, // COM1 (cur_nom = 0) 0xF4, // COM2 (cur_nom = 1) 0xEC, // COM3 (cur_nom = 2) 0xDC, // COM4 (cur_nom = 3) };
void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer IE1 |=WDTIE; BCSCTL1 = CALBC1_1MHZ; // Устанавливаем частоту DCO на калиброванные 1 MHz. DCOCTL = CALDCO_1MHZ; TACTL = TASSEL_2 + ID_3 + MC_1; TACCTL1 = OUTMOD_7; ADC10CTL1 = INCH_1 + CONSEQ_3; ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + SREF_0 + ADC10IE; ADC10AE0 |= A0 + A1; P1DIR |=BIT6; P1SEL |=BIT6; while(1) { ADC10CTL0 &=~ENC; while(ADC10CTL1 & BUSY); ADC10SA = 0x200; ADC10CTL0 |= ENC + ADC10SC; TACCR0 = ADC10MEM; TACCR1 = ADC10MEM; } } вот, все что есть
Сообщение отредактировал Cruz21 - Jun 16 2013, 18:38
|
|
|
|
|
Jun 16 2013, 20:24
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Cruz21 @ Jun 16 2013, 21:34)  Спасибо за помощь, я понять хочу как работает МК с дисплеем Но вы и не поймете, ибо не слушаете, что вам говорят. Напишите пару строк, засвечивающих сегмент первой цифры, без всякой динамической индикации. Это все, что от вас требуется ... Мало того, вы еще и не читаете ответы. SM420364 - собщим катодом (!!!), вам чуть выше человек ссылку для чего дал ?
|
|
|
|
|
Jun 16 2013, 20:53
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 23-01-13
Пользователь №: 75 313

|
Код void main(void) { P2DIR = 0xFF; P2OUT = BIT0+BIT1+BIT2+BIT4+BIT5; } Зажег A,B,F,D,H(точка) остальные биты не включается, в чем может быть проблема?(программная или аппаратная ошибка?)
|
|
|
|
|
Jun 17 2013, 05:58
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 23-01-13
Пользователь №: 75 313

|
Цитата(kovigor @ Jun 17 2013, 01:00)  В том, что вы не читаете сообщений. У вас индикатор с общим катодом. Вы понимаете разницу между общим катодом и общим анодом ? Вот это я для кого написал ? Понял ошибку, сейчас транзисторы для общего катода запаяю
Сообщение отредактировал Cruz21 - Jun 17 2013, 07:17
|
|
|
|
|
Jun 17 2013, 08:49
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 23-01-13
Пользователь №: 75 313

|
Исправил схему
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 17 2013, 16:11
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 23-01-13
Пользователь №: 75 313

|
Кто может указанные здесь AVRсоком коде, порты переименовать на наш msp430cкий Код #include <ioavr.h> #include <intrinsics.h>
unsigned char number[] = { 0x3f, //0 0x06, //1 0x5b, //2 0x4f, //3 0x66, //4 0x6d, //5 0x7d, //6 0x07, //7 0x7f, //8 0x6f //9 };
unsigned char count = 0;
//числа для вывода на индикатор unsigned char data1 = 2; unsigned char data2 = 5;
int main( void ) { //порт, к которому подкл. сегменты PORTB = 0xff; DDRB = 0xff; //порт, к которому подкл. катод PORTD = 0; DDRD = (1<<1)|(1<<0); while(1){
//гасим оба разряда PORTD &= ~((1<<1)| (1<<0));
//выводим в порт код цифры //и зажигаем следующий разряд if (count == 0) { PORTB = number[data2]; PORTD |= (1<<1); } if (count == 1) { PORTB = number[data1]; PORTD |= (1<<0); } count++; if (count == 2) count = 0;
//частота смены разрядов будет 100 Гц при кварце 8МГц __delay_cycles(800000); } return 0; } Совсем запутался с портами, как с ними работать
Сообщение отредактировал Cruz21 - Jun 17 2013, 16:11
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|