Отговори на тема  [ 47 мнения ]  Отиди на страница Предишна  1, 2, 3, 4
MSP430 LaunchPad 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: MSP430 LaunchPad
Код:
#include  "msp430F1101.h"
#define     LCM_DIR1              P1DIR
#define     LCM_OUTD              P1OUT
#define     LCM_DIR2              P2DIR
#define    LCM_OUTC           P2OUT

// дефиниране на линии те за данни
#define     LCM_PIN_D0            BIT0          // P1.0
#define     LCM_PIN_D1            BIT1          // P1.1
#define     LCM_PIN_D2            BIT2          // P1.2
#define     LCM_PIN_D3            BIT3          // P1.3
#define     LCM_PIN_D4            BIT4          // P1.4
#define     LCM_PIN_D5            BIT5         // P1.5
#define      LCM_PIN_D6           BIT6         //P1.6
#define      LCM_PIN_D7           BIT7         // P1.7
// дефиниране на управляващите изводи
#define      LCM_PIN_E            BIT0         //P2.0
#define      LCM_PIN_RS           BIT1         //P2.1

// Създава необходимата маска чрез  побитово ИЛИ  LCM_PIN_MASK=0x1F=0001 1111
#define     LCM_PIN_DMASK  ((LCM_PIN_D0 | LCM_PIN_D1 | LCM_PIN_D2 | LCM_PIN_D2 | LCM_PIN_D3 | LCM_PIN_D4 | LCM_PIN_D5 | LCM_PIN_D6 | LCM_PIN_D7))

// маска за управлващите пинове
#define     LCM_PIN_CMASK  (( LCM_PIN_E | LCM_PIN_RS ))
#define     FALSE                 0
#define     TRUE                  1

// функция която кара дисплея да сканира изводите си
void PulseLcm()
{

    LCM_OUTC &= ~LCM_PIN_E;          // EN=0
    __delay_cycles(200);

    LCM_OUTC |= LCM_PIN_E;            // EN=1
    __delay_cycles(200);

    LCM_OUTC &= (~LCM_PIN_E);         // EN=0
    __delay_cycles(200);
}

// функция за изпращане на байт
void SendByte(  char ByteToSend, int IsData)
{
   
   
    LCM_OUTD &= (~LCM_PIN_DMASK);       //нулираме всички портовете
    LCM_OUTD |= ByteToSend;            // изпращаме данни

   //проверка за това команда или символ се праща
    /if (IsData == TRUE)
    {
        LCM_OUTC |= LCM_PIN_RS;       // изпраща ме символ , определеният за RS извод се активизира, изпращаме TRUE-->данни
    }
    else
    {
        LCM_OUTC &= ~LCM_PIN_RS;    // нулира се извода определен за RS единствено и само той , изпращаме FALSE--> команди
    }
    PulseLcm();       

}
// функция за управлението на курсора
void LcmSetCursorPosition(char Row, char Col)  // определяне на позицита на курсора
{
    char address;
    if (Row == 0)
    {
        address = 0;
    }
    else
    {
        address = 0x40;
    }

    address |= Col;

    SendByte(0x80 | address, FALSE); // изпращаме команда за изпозициониране на курсора
}

void ClearLcmScreen() // изчистане на дисплея
{
    SendByte(0x01, FALSE);
    SendByte(0x02, FALSE);
}
// функция за инициализиране на дисплея
void InitializeLcm(void)
{
    LCM_DIR1 |= LCM_PIN_DMASK;       //определяне на посоката на изводите на контролера
    LCM_DIR2 |= LCM_PIN_CMASK;
    LCM_OUTD &= ~(LCM_PIN_DMASK);
    __delay_cycles(100000);
    LCM_OUTC &= ~LCM_PIN_RS;     // нулира се RS
    LCM_OUTC |= LCM_PIN_E;        // нулира се EN

    P1OUT = 0x3F;               //Би трябвало да останови в 8-битов режим
    PulseLcm();
   
    LCM_OUTC = LCM_PIN_E;       
    PulseLcm();
    SendByte(0x06, FALSE); // автоматично инкрементиране на курсора
}
// функция за извличане на текст
void PrintStr(char *Text)
{
    char *c;
    c = Text;
    while ((c != 0) && (*c != 0))
    {
        SendByte(*c, TRUE);
        c++;
    }
}
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;            // Спиране на таймера
    InitializeLcm();
    ClearLcmScreen();
    PrintStr("Hello World!");
    while (1)
    {
        __delay_cycles(1000);
    }

}



0. Използвай винаги и навсякъде stdint.h . Ако една променлива няма да има стойност повече от 255, обяви я като 8 битова, не използвай int. Size Matters.
1. Не ти трябва 8 битов режим.
2.
Цитат:
// Създава необходимата маска чрез побитово ИЛИ LCM_PIN_MASK=0x1F=0001 1111
коментара не е правилен.
3.
Цитат:
// функция която кара дисплея да сканира изводите си
коментара не е правилен.
4.
Код:
void PulseLcm()
{

    LCM_OUTC &= ~LCM_PIN_E;          // EN=0
    __delay_cycles(200);

    LCM_OUTC |= LCM_PIN_E;            // EN=1
    __delay_cycles(200);

    LCM_OUTC &= (~LCM_PIN_E);         // EN=0
    __delay_cycles(200);
}

не е правилно
Код:
void PulseLcm()
{
    LCM_OUTC |= LCM_PIN_E;            // EN=1
    LCM_OUTC &= ~LCM_PIN_E;         // EN=0
    __delay_cycles(40);  //40uS@ 1 000 000
}

5.
Код:
// функция за изпращане на байт
void SendByte(  char ByteToSend, int IsData)

това смуче.
Ползвай това след като го преработиш.
Код:
inline void pulse_LCD_Enable(void)
{
   LCD_ENABLE;
   __delay_cycles(LCD_delay);
   LCD_DISABLE;
}

void putchar( uint8_t in )
{
      LCD_PORT_OUT &=~LCD_DATA_MASK;
        LCD_PORT_OUT |= ( in & LCD_DATA_MASK );
        pulse_LCD_Enable();
        //
        LCD_PORT_OUT &=~LCD_DATA_MASK;
        LCD_PORT_OUT |= (  in << 4 );
        pulse_LCD_Enable();
        __delay_cycles( 700 ); //43*10^-6 / 1/16 000 000
}

void lcd_command( uint8_t cmd )
{
   LCD_MODE_INSTRUCTION;
   putchar(cmd);
   LCD_MODE_DATA;
}


6.
Цитат:
// функция за инициализиране на дисплея
void InitializeLcm(void)

Провери точно, как се рестартира дисплея с инструкции в документацията.
Цитат:
LCM_OUTD &= ~(LCM_PIN_DMASK);
това е излишно
Цитат:
__delay_cycles(100000);
това е много малко, процесора ти тръгва много по-рано от дисплея.
Цитат:
LCM_OUTC |= LCM_PIN_E; // нулира се EN
инструкцията е ненужна защото имаш PulseLcm();, комантара също е сгрешен.
Цитат:
P1OUT = 0x3F; //Би трябвало да останови в 8-битов режим
това не е правилно използвай LCM_OUTD = 0x3F;
Цитат:
LCM_OUTC = LCM_PIN_E;
това не е правилно, трябва да е LCM_OUTC &= ~LCM_PIN_E; , освен това не е нужна, защото имаш команда PulseLcm(); която прави същото.

7.
Код:
// функция за извличане на текст
void PrintStr(char *Text)
{
    char *c;
    c = Text;
    while ((c != 0) && (*c != 0))
    {
        SendByte(*c, TRUE);
        c++;
    }
}


Не ми харесва функцията ти. Използвай само тази, които са одобрени от ЦК на КПСС:
Код:
void print(char *string)
{
    while (*string) {
        SendByte(*string++);
    }
}


8.
Цитат:
WDTCTL = WDTPW + WDTHOLD; // Спиране на таймера

коментара не е правилен.
9.
Код:
while (1)
    {
        __delay_cycles(1000);
    }

Това не е правилно. Използвай:
Код:
while (1)
    {
        LPM4;
    }

_________________
Warriors of the Night, ASSEMBLER!!!


Пет Яну 11, 2013 7:46 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: MSP430 LaunchPad
На който му се е** да е**, че утре кака се жени.
http://forum.43oh.com/topic/3460-is-it- ... pad-price/
Темата е за ключ, ползвайте Ардуино от ebay.com или dx.com

_________________
Warriors of the Night, ASSEMBLER!!!


Пет Мар 01, 2013 9:15 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 47 мнения ]  Отиди на страница Предишна  1, 2, 3, 4

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни