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

 
 
> Подключение 7-сегментного индикатора к msp430g24523, программирование
Cruz21
сообщение Jun 16 2013, 15:19
Сообщение #1


Участник
*

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



Добрый день, я собрал небольшую вставочную схему для отладчика 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 отключать. Помогите мне написать простенькую программу, хоть простой какой нибудь счетчик, чтоб я понял как взаимодействует простой индикатор без драйверов с МК. Как загнать образы в порта и выводить значения на индикаторе?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Jun 23 2013, 18:32
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Рискну предложить свой "перелопаченный" вариант вашей тестовой программы.
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_.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Cruz21   Подключение 7-сегментного индикатора к msp430g24523   Jun 16 2013, 15:19
- - kovigor   Цитата(Cruz21 @ Jun 16 2013, 18:19) Пробл...   Jun 16 2013, 15:54
|- - Cruz21   Цитата(kovigor @ Jun 16 2013, 19:54) Инди...   Jun 16 2013, 17:19
|- - rezident   Цитата(Cruz21 @ Jun 16 2013, 22:19) индик...   Jun 16 2013, 17:51
|- - Cruz21   Цитата(rezident @ Jun 16 2013, 21:51) htt...   Jun 16 2013, 17:57
|- - rezident   Цитата(Cruz21 @ Jun 16 2013, 22:57) исход...   Jun 16 2013, 18:09
|- - Cruz21   Цитата(rezident @ Jun 16 2013, 22:09) Ну ...   Jun 16 2013, 18:34
|- - kovigor   Цитата(Cruz21 @ Jun 16 2013, 21:34) Спаси...   Jun 16 2013, 20:24
|- - Cruz21   Кодvoid main(void) { P2DIR = 0xFF; P2OUT =...   Jun 16 2013, 20:53
|- - kovigor   Цитата(Cruz21 @ Jun 16 2013, 23:53) Зажег...   Jun 16 2013, 21:00
|- - Cruz21   Цитата(kovigor @ Jun 17 2013, 01:00) В то...   Jun 17 2013, 05:58
- - fractcon   А не пробовали взять батарейку, резистор и два про...   Jun 16 2013, 17:29
|- - Cruz21   Цитата(fractcon @ Jun 16 2013, 21:29) А н...   Jun 16 2013, 17:40
- - Cruz21   Исправил схему   Jun 17 2013, 08:49
- - Cruz21   Кто может указанные здесь AVRсоком коде, порты пер...   Jun 17 2013, 16:11
|- - haker_fox   QUOTE (Cruz21 @ Jun 18 2013, 01:11) Кто м...   Jun 18 2013, 12:12
- - rezident   Цитата(Cruz21 @ Jun 17 2013, 13:49) Испра...   Jun 18 2013, 19:42
|- - Cruz21   Цитата(rezident @ Jun 18 2013, 23:42) Пло...   Jun 18 2013, 19:52
|- - rezident   Цитата(Cruz21 @ Jun 19 2013, 00:52) Я пер...   Jun 18 2013, 19:58
|- - Cruz21   Цитата(rezident @ Jun 18 2013, 23:58) Я ж...   Jun 18 2013, 20:06
- - Cruz21   Наконец то собрал схему правильно, программно тоже...   Jun 19 2013, 18:43
|- - kovigor   Цитата(Cruz21 @ Jun 19 2013, 21:43) Након...   Jun 19 2013, 19:58
- - Cruz21   Код#include <msp430g2452.h> #define IND1...   Jun 23 2013, 12:29
- - ARV   почитайте вот эту статью о динамической индикации ...   Jun 25 2013, 08:01


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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 15:44
Рейтинг@Mail.ru


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