UART với MSP430

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Các anh chị có thể tạo file uart.c hay uart.h giống như con PIC được không ạ :-s... tại vì em muốn bấm nút để gửi lên PC như con PIC mà không biết làm sao hết
VD: bấm nút 1.3 thì gửi lên PC chữ "A" chẳng hạn
 

nguyenquoctrung-hhk

Thành Viên PIF
nguyên lý uart con vi điều khiển nào cũng giống nhau hết, CLB đã xây dựng sẵn cho bạn con PIC16f887 để làm nền tản. khi làm thì bạn dùng hàm đã có sẵn, nhiệm vụ của bạn là xem datasheet phần uart + code đã có sẵn CLB, cố gắng đọc cho hiểu. mình chưa dùng con MSP430 (do cũng đang đặt hàng chờ ngày lấy) nên chưa biết lập trình dùng ngôn ngữ gì, về mặt ngôn ngữ lập trình chỉ khác nhau bởi cú pháp. tính tương quan logic vẫn giống nhau. Do đó khi đã đọc hiểu code uart.c, uart.h bên con PIC thì chắc hẵn bạn sẽ viết lại đc cho MSP430 thui. lúc trước bạn không biết thì CLB xây dựng nền móng, còn bây giớ có "móng " nhiệm vụ của bạn phải xây cái " móng " mới bắt trước theo cái "móng" cũ chứ bạn, rồi tứ đó bạn mới xây nhà lầu, nhà cao tầng. không nên chờ người khác làm sẵn bạn nhé, trừ khi những cái đó quá mới mẻ, thì coi như mình học lại những người họ đã làm rồi, khi mình đã học của họ thì đừng làm lại những gì họ đã làm mà hãy phát triển thêm từ đó và thể hiện chất riêng của mình...
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
tại em thử nhiều cách như đặt biến như cái code có sẵn, timer mà chả ra đâu hết :(
 

tranhieu_hcmut

Cố Vấn CLB
Staff member
Tất cả những gì e cần TI đã cung cấp đầy đủ ở phần source code [viết bằng ASM + C], e chỉ cần đọc hiểu & sử dụng nó thôi. E tham khảo thêm tại link dưới nhé
Code:
http://www.ti.com/lsds/ti/microcontroller/16-bit_msp430/msp430_software_landing.page
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Em viết thế này sao nó không chạy ạ :(.. nhất là cái phần chớp tắt led nó cũng không chạy luôn. RỒi nhấn nút 1.3 cũng không hiển thị dòng chữ Button, lúc mới vào không hiển thị dòng Hello
Code:
/******************************************************************************
*   MSP430G2553 - USCI_A0, 9600 UART Echo ISR, DCO SMCLK
*
*   Description: Echo a received character, RX ISR used. Normal mode is LPM0.
*   USCI_A0 RX interrupt triggers TX Echo.
*   Baud rate divider with 1MHz = 1MHz/9600 = ~104.2
*   ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz
*
*                MSP430G2553
*             -----------------
*         /|\|              XIN|-
*          | |                 |
*          --|RST          XOUT|-
*            |                 |
*            |     P1.2/UCA0TXD|------------>
*            |                 | 9600 - 8N1
*            |     P1.1/UCA0RXD|<------------
*
*******************************************************************************/
 
 
/*****************************************************************
* DEFINE
******************************************************************/
#include "msp430g2553.h"
 
#define BITIME  (13 * 4)                // 125 KHz /(13*4) = 2404 bits/sec
 
unsigned char bitCnt;                   // number of bits to transmit
unsigned int  txByte;                   // transmit buffer with start/stop bits
 
 
 
/*****************************************************************
* GLOBAL
******************************************************************/
 
 
/*****************************************************************
* INTERRUPT
******************************************************************/
 
 
 
/*****************************************************************
* PROTOTYPE
******************************************************************/
void uart_putstr(char *str);                 // transmit string
void uart_transmit(unsigned char ch);        // transmit a character
void led(void);//led signal
 
 
/****************************************************************
* MAIN
****************************************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //Stop watchdog timer
 
P1DIR |= BIT0 + BIT6;//Output direction LED1, LED2
 
P1DIR &= ~BIT3;//Input direction Push button
P1REN |= BIT3;
P1OUT |= BIT3;
 
//UART Config
BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2;                     // SMCLK
UCA0BR0 = 104;                            // 1MHz 9600
UCA0BR1 = 0;                              // 1MHz 9600
UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
 
__bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
 
 
while(1)
{
led();
uart_putstr("Hello world.\n\r");
if ((P1IN & BIT3) == 0)
{
uart_putstr("Button \n");
}
}
}
 
 
/*****************************************************************
* LED Signal
******************************************************************/
void led(void)
{
P1OUT |= BIT0;
P1OUT &= ~BIT6;
_delay_cycles(10000);
P1OUT &= ~BIT0;
P1OUT |= BIT6;
_delay_cycles(10000);
}
 
 
/*****************************************************************
* UART Timer_A interrupt
******************************************************************/
void timer_A_ISR(void)
{
    CCR0 += BITIME;                     // Schedule next interrupt
    if (bitCnt == 0)
    {
        CCTL0 &= ~CCIE;                 // All bits TXed, disable interrupt
    }
    else
    {
        if (txByte & 0x02)
        {
            CCTL0 &= ~OUTMOD2;          // TX Mark
        }
        else
        {
            CCTL0 |= OUTMOD2;           // TX Space
        }
        txByte = txByte >> 1;
        bitCnt--;
    }
}
 
 
/*****************************************************************
* UART Transmit character
******************************************************************/
void uart_transmit(unsigned char ch)
{
    bitCnt = 0xA;                       // Load Bit counter, 8data + ST/SP
    txByte = (unsigned int)ch | 0x100;  // Add mark stop bit to txByte
    txByte = txByte << 1;               // Add space start bit
 
    CCR0 = TAR + BITIME;                // Some time till first bit
    CCTL0 = OUTMOD0 + CCIE;             // TXD = mark = idle
    while (CCTL0 & CCIE);               // Wait for ISR to complete TX
}
 
 
/*****************************************************************
* UART Transmit put string
******************************************************************/
void uart_putstr(char *str)
{
    char *cp;
    for (cp = str; *cp != '\0'; cp++)
    {
        uart_transmit(cp[0]);
    }
}
 
 
/*****************************************************************
* UART receive character
******************************************************************/
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
 
if (UCA0RXBUF == 'b')                     // 'b' received? <-> BIG just turn on LED1
{
    IE2 |= UCA0TXIE;                        // Enable USCI_A0 TX interrupt
    P1OUT &= ~BIT6;
    P1OUT |= BIT0;
}
else
{
led();
}
 
if (UCA0RXBUF == 's')                     // 's' received? <-> SMALL just turn on LED2
{
IE2 |= UCA0TXIE;                        // Enable USCI_A0 TX interrupt
P1OUT &= ~BIT0;
P1OUT |= BIT6;
}
else
{
led();
}
}
 
/*****************************************************************
* END OF main.c
******************************************************************/
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Rồi :D...tình hình là em đã xong được phần lớn đề tài rồi..chỉ còn có 1 điều nữa là sao em đọc giá trị gửi lên từ MSP430 không ra ạ?
Cho em hỏi em cần phải sửa chỗ nào??
Code:
private void butA_KeyPress(object sender, KeyPressEventArgs e)
        {
            /*if (e.KeyChar == 'h') 
            {
                butA.Focus();
                butA.PerformClick();
            }*/
            int h = Com.ReadByte();
            if (h == 'h')  
            {
                butA.Focus();
                butA.PerformClick();
            }
        }
Làm sao đọc riêng lẻ kí tự được ạ :(..Giúp em với để mai em cố gắng làm cái đồ thị nữa cho nó xong :)
 

bigboy061293

Thành Viên PIF
đọc riêng lẽ kí tự là sao ?
Hình như bạn phải dùng cái readexisting hay readline gì đó chứ readbyte có vẻ không ổn :|
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
ý của mình là đọc ký tự về thôi a'...ví dụ như mình gửi lên ký tự h thì nó đọc ký tự h thôi chứ không đọc mấy cái "tầm xàm ba láp" kia....tại không thấy cái nào có kiểu char hay byte cả @@ :)...để mình thử cách này :D...nhưng mà cái focus rồi PerformClick có ổn không bigboy :)
 
Top