Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подключение 7-сегментного индикатора к msp430g24523
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Cruz21
Добрый день, я собрал небольшую вставочную схему для отладчика LaunchPad на МК msp430g2452(фото прикреплен), где содержатся 7-сегментный, 4хразрядный индикатор. 7 сегментов я вывел на второй порт (Р2), а разряды на первый порт (Р1). Проблема в том что я не могу включить этот индикатор, точнее не знаю какой код прописать. Таблицы образов написал, а как заработал этот индикатор не знаю wacko.gif
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 отключать. Помогите мне написать простенькую программу, хоть простой какой нибудь счетчик, чтоб я понял как взаимодействует простой индикатор без драйверов с МК. Как загнать образы в порта и выводить значения на индикаторе?
kovigor
Цитата(Cruz21 @ Jun 16 2013, 18:19) *
Проблема в том что я не могу включить этот индикатор, точнее не знаю какой код прописать.

Индикаторы есть разные - с общим катодом и с общим анодом (ваша схема рассчитана на общий анод). Какой у вас индикатор ? И номиналы резисторов на схеме не указаны.
Начать советую с малого - засветите сегмент "A" первой цифры (цифра включена, если база ее транзистора заземлена). Дальше поймете сами ...
Cruz21
Цитата(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" первой цифры (цифра включена, если база ее транзистора заземлена). Дальше поймете сами ...

Как засветить сегмент А?
Такой индикатор
fractcon
А не пробовали взять батарейку, резистор и два провода, и руками зажечь этот самый сегмент. А уж потом пытаться его зажечь через плату.
Cruz21
Цитата(fractcon @ Jun 16 2013, 21:29) *
А не пробовали взять батарейку, резистор и два провода, и руками зажечь этот самый сегмент. А уж потом пытаться его зажечь через плату.

Пробовал, но через плату не получается
rezident
Цитата(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
Вашему "китайцу" более соответствует (по распиновке) CC56-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мс устанавливать по-очереди выводы общих анодов/катодов в активное состояние, а на выводы сегментов синхронно с ними выводить число, соответствующее порядковому номеру цифры, используя таблицу преобразования.
Cruz21
Цитата(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?
исходник программы нужен.
rezident
Цитата(Cruz21 @ Jun 16 2013, 22:57) *
исходник программы нужен.

Ну знаете ли ... вы бы попробовали вначале сами что-то написать. То, что можно будет отрецензировать и указать на недочеты. А писать для вас код (даже простой) в 1-м часу ночи мне уже как-то лениво. laughing.gif "Дорогу осилит идущий". Успехов!
Cruz21
Цитата(rezident @ Jun 16 2013, 22:09) *
Ну знаете ли ... вы бы попробовали вначале сами что-то написать. То, что можно будет отрецензировать и указать на недочеты. А писать для вас код (даже простой) в 1-м часу ночи мне уже как-то лениво. laughing.gif "Дорогу осилит идущий". Успехов!

Спасибо за помощь, я понять хочу как работает МК с дисплеем, хочу вывести хоть одну цифру, чтобы понять. Но у меня не получается что то ничего. А сама программа она должна выводить на 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;
  }
}


вот, все что есть sad.gif
kovigor
Цитата(Cruz21 @ Jun 16 2013, 21:34) *
Спасибо за помощь, я понять хочу как работает МК с дисплеем

Но вы и не поймете, ибо не слушаете, что вам говорят. Напишите пару строк, засвечивающих сегмент первой цифры, без всякой динамической индикации. Это все, что от вас требуется ...

Мало того, вы еще и не читаете ответы. SM420364 - собщим катодом (!!!), вам чуть выше человек ссылку для чего дал ?
Cruz21
Код
void main(void)
{
P2DIR = 0xFF;
P2OUT = BIT0+BIT1+BIT2+BIT4+BIT5;
}


Зажег A,B,F,D,H(точка) остальные биты не включается, в чем может быть проблема?(программная или аппаратная ошибка?)
kovigor
Цитата(Cruz21 @ Jun 16 2013, 23:53) *
Зажег A,B,F,D,H(точка) остальные биты не включается, в чем может быть проблема?(программная или аппаратная ошибка?)

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

Понял ошибку, сейчас транзисторы для общего катода запаяю
Cruz21
Исправил схему
Cruz21
Кто может указанные здесь 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;
}

Совсем запутался с портами, как с ними работать sad.gif
haker_fox
QUOTE (Cruz21 @ Jun 18 2013, 01:11) *
Кто может указанные здесь AVRсоком коде, порты переименовать на наш msp430cкий
Совсем запутался с портами, как с ними работать sad.gif

Может быть я занудствую, но - учитесь читать мануалы и даташиты. Читая, Вы попутно впитываете сопутствующую полезную информацию, и с каждой итерацией чтения, находить ответы на вопросы будет легче.

Естественно, что чтение не избавит от недоразумений и новых вопросов, но это будут вопросы рода "сделал как указано в этом толстющем мануале, всё проверил на не раз, а оно не работает. Помогите" rolleyes.gif Чувствуете разницу? rolleyes.gif ну тогда успехов rolleyes.gif rolleyes.gif rolleyes.gif
rezident
Цитата(Cruz21 @ Jun 17 2013, 13:49) *
Исправил схему

Плохо исправили. Нумерацию выводов нужно внести так, как она изображена у оригинального индикатора. Транзисторы заменить на NPN, оставив их включенными по изначальной схеме с общим эмиттером.
Цитата(Cruz21 @ Jun 17 2013, 21:11) *
Совсем запутался с портами, как с ними работать sad.gif

Читайте User's Manual (по ссылке), в нем описано в разделе 8 Digital I/O. http://www.ti.com/product/msp430g2453
Я не работал с AVR, чтобы давать аналогии. В MSP430 PxDIR регистр, определяющий функцию входа/выхода для режима GPIO (и для некоторых альтернативных): 0 - вход, 1 - выход. Вам нужна функция "выход", поэтому биты в PxDIR нужно установить в 1. В регистре PxOUT задается состояние выхода для GPIO. Вот этими PxOUT и нужно манипулировать, зажигая и выключая сегменты индикатора. PxSEL определяет подключение дополнительных функции к пину, отличающейся от GPIO. Поскольку вам этого не нужно, то в PxSEL биты должны быть сброшены в 0.
Cruz21
Цитата(rezident @ Jun 18 2013, 23:42) *
Плохо исправили. Нумерацию выводов нужно внести так, как она изображена у оригинального индикатора. Транзисторы заменить на NPN, оставив их включенными по изначальной схеме с общим эмиттером.

Я перепаял транзисторы NPN, но с общим коллектором, а не эмиттером. Почему мне нужно перепаять с ОЭ?
Сейчас собираюсь заново собрать, как раз учту нумерацию в этот раз.
rezident
Цитата(Cruz21 @ Jun 19 2013, 00:52) *
Я перепаял транзисторы NPN, но с общим коллектором, а не эмиттером. Почему мне нужно перепаять с ОЭ?

Я же не вижу, чего и куда вы перепаяли. На вашей схеме в сообщении №14 изображены транзисторы PNP, включенные по схеме с ОК. В то время как для работы в ключевом режиме вам нужны NPN, включенные по схеме с ОЭ. Может вам ТОЭ для начала почитать? Хотя бы даже в Википедии http://ru.wikipedia.org/wiki/%D0%9A%D0%B0%...%80%D0%BE%D0%BC
P.S. в исходном сообщении на схеме у вас было правильное включение: PNP, с ОЭ относительно плюса питания. Но эта схема годилась бы для индикатора с общим анодом. А у вас индикатор с общим(и) катодом(ами), поэтому включать нужно NPN по схеме с ОЭ относительно общего провода (минуса питания).
Cruz21
Цитата(rezident @ Jun 18 2013, 23:58) *
Я же не вижу, чего и куда вы перепаяли. На вашей схеме в сообщении №14 изображены транзисторы PNP, включенные по схеме с ОК. В то время как для работы в ключевом режиме вам нужны NPN, включенные по схеме с ОЭ. Может вам ТОЭ для начала почитать? Хотя бы даже в Википедии http://ru.wikipedia.org/wiki/%D0%9A%D0%B0%...%80%D0%BE%D0%BC
P.S. в исходной схему у вас было правильное включение: PNP, с ОЭ относительно плюса питания. Но эта схема годилась бы для индикатора с общим анодом. А у вас индикатор с общим(и) катодом(ами), поэтому включать нужно NPN по схеме с ОЭ относительно общего провода (минуса питания).

Спасибо за помощь. Сейчас попробую сделать с ОЭ. Транзисторы я новые купил NPN КТ3102Б, а раньше были ВС327-25(аналог КТ3107Б)
На схеме да, я не правильно указал транзисторы.
Cruz21
Наконец то собрал схему правильно, программно тоже начал работать индикатор, спасибо всем кто помог. Немного теперь и у меня мозгов прибавилось wink.gif Теперь осталось реализовать программную начинку, так сказать залить душу в тело.
Особую благодарность хочу выразить rezident, kovigor a14.gif вам rolleyes.gif
kovigor
Цитата(Cruz21 @ Jun 19 2013, 21:43) *
Наконец то собрал схему правильно, программно тоже начал работать индикатор, спасибо всем кто помог.

Не за что, рад был помочь ...
Cruz21
Код
#include  <msp430g2452.h>

#define IND1 BIT5 //управление разрядами индикатора
#define IND2 BIT4
#define IND3 BIT3
#define IND4 BIT2

unsigned char NUM;//отвечает какой разряд горит
unsigned char BCD;//значение частоты
unsigned char BC_H1,BC_L1,BC_H2,BC_L2; //разделение по BCD по знаково
int t2ms=0;


unsigned char digits[]=
{
       0xBE, //0
       0x84, //1
       0xAB, //2
       0xA7, //3
       0x95, //4
       0x37, //5
       0x3F, //6
       0xA4, //7
       0xBF, //8
       0xB7, //9
      
  };


void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
  BCSCTL1 = CALBC1_16MHZ;//Проц тактируем от встроенного
  DCOCTL  = CALDCO_16MHZ;//генератора с калибровкой последнего на 16 мгц

  
  P1DIR |= 0x3C;      // P1 output
  P2DIR |= 0xFF;      // P2 output
  
  //конфиг первого таймера
  TA0CCR0 = 32000;//?anoioa
TA0CCTL0 = CCIE;//
TACTL = TASSEL_2 + MC_1; // SMCLK, upmode

__enable_interrupt();

_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0 (void)
{
  P1OUT &= ~(IND1|IND2|IND3|IND4);
    
switch (NUM)
{
  case 0 :
  
   P2OUT = digits[1];
   P1OUT |= IND1;
   break;
        
  case 1 :
    
    P2OUT = digits[2];
    P1OUT |= IND2;
    break;
  case 2 :
    
    P2OUT = digits[3];
    P1OUT |= IND3;
    break;
    
  case 3 :
    
    P2OUT = digits[4];
    P1OUT |= IND4;
    break;
}
NUM++;
if (NUM == 4) NUM = 0;
  
}


в чем может быть проблема?
я хочу чтоб у меня светилось 1 2 3 4, а получается 1 1 1 1, 2 2 2 2, 3 3 3 3, 4 4 4 4??
rezident
Рискну предложить свой "перелопаченный" вариант вашей тестовой программы.
CODE
#include <msp430g2452.h>

unsigned char digits[]=
{
0xBE, //0
0x84, //1
0xAB, //2
0xA7, //3
0x95, //4
0x37, //5
0x3F, //6
0xA4, //7
0xBF, //8
0xB7, //9
};

#define SYS_VALMCLKL 16000000UL //частота MCLK
#define SYS_VALSMCLK 2000000UL //частота SMCLK
#define SYS_VALACLK 12000UL //частота ACLK

/* биты управления разрядами индикатора */
#define SEG7_DIG1 (1U<<5)
#define SEG7_DIG2 (1U<<4)
#define SEG7_DIG3 (1U<<3)
#define SEG7_DIG4 (1U<<2)
/* маска битов управления разрядами */
#define SEG7_MASKDIG (SEG7_DIG1|SEG7_DIG2|SEG7_DIG3|SEG7_DIG4)

#define SEG7_MAXNUM 4 //количество разрядов индикатора
#define SEG7_REFRESH_MS 5UL //период динамической индикации [мс]

#define SYSTICKMS_ADD 1UL //приращение счетчика системных тиков [мс]

volatile unsigned int sysTickMS; //счетчик мс

unsigned char seg7_buf[4]; //буфер индикатора
unsigned int seg7_num; //номер разряда для текущего отображения

void main( void )
{
unsigned int sysTickMSStamp, time;

WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset
BCSCTL3 = LFXT1S_2; //ACLK = VLOCLK
BCSCTL1 = CALBC1_16MHZ; //Проц тактируем от встроенного
DCOCTL = CALDCO_16MHZ; //генератора с калибровкой последнего на 16 мгц
BCSCTL2 = DIVM_0 | DIVS_3;//MCLK = DCOCLK, SMCLK = DCOCLK/8

P1DIR |= 0x3C; // P1 output
P2DIR |= 0xFF; // P2 output

//конфиг первого таймера
/* период: ccr0 = SYSTICKMS_ADD * (16МГц/8 / 1000мс) - 1 */
unsigned long tmp = SYS_VALSMCLK;
tmp /= 1000UL;
tmp *= SYSTICKMS_ADD;
TA0CCR0 = (unsigned int)tmp - 1;
TA0CCTL0 = CCIE; //
TACTL = TASSEL_2 | MC_1; // SMCLK, upmode

/* заполним буфер индикатора символами 1, 2, 3, 4
вообще говоря, по-уму нужна отдельная функция,
которая будет выводить строку символов в буфер индикатора
*/
seg7_buf[0] = digits[1];
seg7_buf[1] = digits[2];
seg7_buf[2] = digits[3];
seg7_buf[3] = digits[4];

sysTickMSStamp = sysTickMS; //сделаем отметку времени

__enable_interrupt();

/* main loop - большой цикл */
for(;;)
{ time = sysTickMS;
if ((time - sysTickMSStamp) >= SEG7_REFRESH_MS)
{
/* здесь делаем все, что нужно делать при динамичесй индикации */
seg7_num += 1;
if (seg7_num >= SEG7_MAXNUM) seg7_num = 0;

P1OUT &= ~(SEG7_MASKDIG); //гасим все разряды
P2OUT = seg7_buf[seg7_num]; //выводим значение символа
switch(seg7_num) //зажигаем соответствующий символ индикатора
{
case 0:
P1OUT |= SEG7_DIG1;
break;
case 1:
P1OUT |= SEG7_DIG2;
break;
case 2:
P1OUT |= SEG7_DIG3;
break;
case 3:
P1OUT |= SEG7_DIG4;
break;
}
sysTickMSStamp = sysTickMS; //обновляем значение временной отметки
}

/* не знаю, зачем вам это нужно в тестовой программе, но засыпаем */
__bis_SR_register(LPM0_bits | GIE); // Enter LPM0 w/ interrupt

}/* end main loop - конец большого цикла */
} /* end main */

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0 (void)
{
sysTickMS += SYSTICKMS_ADD; //увеличиваем счетчик мс

/* поскольку в основном цикле есть переход в режим энергосбережения, то
для того, чтобы большой цикл выполнялся нужно временно выйти из этого режима
*/
__bic_SR_register_on_exit(LPM4_bits);
}

Основные недостатки вашей программы
а) отсутствует big loop, т.е. программа не зацикливается, а перезапускается после одного-единственного прохода
б) в прерывании нужно делать минимум операций и только самые необходимые. Вызов функции обработки динамической индикации можно спокойно перенести в основной цикл. А в прерывании от таймера только увеличивать счетчик времени, который в моей версии считает миллисекунды.
в) судя по именам переменных, замысел такой был, но по факту не реализована буферизация вывода на индикатор. Я бы на вашем месте написал отдельную функцию для вывода в буфер индикатора (отметил это в комментариях).
г) старайтесь избегать "магических" чисел в исходниках. Пользуйтесь именованными константами, определенными с помощью макросов (define) и enum. Будет проще и вам самому и другим людям, которые будут разбираться с вашей программой.
д) рекомендуется поддерживать общепринятый стиль написания программ на Си. Только одними ЗАГЛАВНЫМИ символами принято обозначать макросы. Не стоит такие имена давать переменным. Имена переменным нужно давать осмысленно. Я сначала вообще хотел отдельную структуру для переменных индикатора создать, но потом подумал и ограничился лишь префиксом seg7_.
ARV
почитайте вот эту статью о динамической индикации и вот эту о том, как выводить цифры на дисплей, возможно, это вам поможет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.