Giúp em nhận UART này với

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Em làm cái ma trận 3x3 tương ứng các chân R0,R1,R2,C0,C1,C2 vào BIT0 BIT3 BIT4 BIT5 BIT6 BIT7 và nối VCC, lập trình cho nó khi bấm nút thì UART ra mã code tương ứng nhưng sao không chạy ạ :(...giúp em với
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 KEY 0xF9//BIT0 BIT3 BIT4 BIT5 BIT6 BIT7
 
 
/*****************************************************************
* GLOBAL
******************************************************************/
 
 
/*****************************************************************
* INTERRUPT
******************************************************************/
 
 
 
/*****************************************************************
* PROTOTYPE
******************************************************************/
void sendbyte(unsigned char *data);
 
 
/****************************************************************
* MAIN
****************************************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //Stop watchdog timer
 
P1DIR &= ~KEY; //KEY is input direction use for read the gamepad 's value
P1REN |= KEY;//KEY pullup resistor is enable
//P1OUT |= KEY;//Use for P1REN- KEY is connected to VCC
 
//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
 
for(;;)
{
if (!(P1IN & KEY))//KEY is pressed (KEY is connected to VCC)
{
_delay_cycles(10);
if(!(P1IN & KEY))
{
int i;
unsigned char *data;
for (i=0;i<=7;i++)//Write each bit to data
{
if ((P1IN & (BIT0<<i)) == 1)//Read each bit from KEY
{
*data |= (BIT0<<i);//Write bit 1
}
else
{
*data &= ~(BIT0<<i);//Write bit 0
}
}
while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
UCA0TXBUF = *data;
 
}
}
}
}
 
 
/*****************************************************************
* UART
* UART sending byte
******************************************************************/
void sendbyte(unsigned char *data)
{
int i;
for (i=0;i<=7;i++)
{
while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
UCA0TXBUF = data[i];
}
}
 
 
/*****************************************************************
* UART
* UART interrupt
******************************************************************/
 
//  Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
  //if ( IFG2 & UCA0TXIFG )
  //{
  //Do Something with the recieved character
  //}
}
 
 
/*****************************************************************
* END OF main.c
******************************************************************/
 

Manhdd

Cố Vấn CLB
Staff member
Em cho mọi người xem mạch phần cứng đi. Gọi là led ma trận mà còn nối VCC hết là thế nào? :5cool_sweat:
Launch pad có hỗ trợ debug khá tốt. Các thao tác debug cơ bản (Go, Pause, Step into, Step Over, Step Out, ...) thì tất cả SV khoa Điện đều học trong VB rồi, IDE nào cũng giống nhau mấy phần đó. Mọi người nên tận dụng công cụ này để tự gỡ rối. Vì chỉ có mình mới hiểu rõ nhất mình định làm cái gì :D
 

honghiep

Cố Vấn CLB
Staff member
Em làm cái ma trận 3x3 tương ứng các chân R0,R1,R2,C0,C1,C2 vào BIT0 BIT3 BIT4 BIT5 BIT6 BIT7 và nối VCC, lập trình cho nó khi bấm nút thì UART ra mã code tương ứng nhưng sao không chạy ạ :(...giúp em với
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 KEY 0xF9//BIT0 BIT3 BIT4 BIT5 BIT6 BIT7
 
 
/*****************************************************************
* GLOBAL
******************************************************************/
 
 
/*****************************************************************
* INTERRUPT
******************************************************************/
 
 
 
/*****************************************************************
* PROTOTYPE
******************************************************************/
void sendbyte(unsigned char *data);
 
 
/****************************************************************
* MAIN
****************************************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //Stop watchdog timer
 
P1DIR &= ~KEY; //KEY is input direction use for read the gamepad 's value
P1REN |= KEY;//KEY pullup resistor is enable
//P1OUT |= KEY;//Use for P1REN- KEY is connected to VCC
 
//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
 
for(;;)
{
if (!(P1IN & KEY))//KEY is pressed (KEY is connected to VCC)
{
_delay_cycles(10);
if(!(P1IN & KEY))
{
int i;
unsigned char *data;
for (i=0;i<=7;i++)//Write each bit to data
{
if ((P1IN & (BIT0<<i)) == 1)//Read each bit from KEY
{
*data |= (BIT0<<i);//Write bit 1
}
else
{
*data &= ~(BIT0<<i);//Write bit 0
}
}
while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
UCA0TXBUF = *data;
 
}
}
}
}
 
 
/*****************************************************************
* UART
* UART sending byte
******************************************************************/
void sendbyte(unsigned char *data)
{
int i;
for (i=0;i<=7;i++)
{
while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
UCA0TXBUF = data[i];
}
}
 
 
/*****************************************************************
* UART
* UART interrupt
******************************************************************/
 
//  Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
  //if ( IFG2 & UCA0TXIFG )
  //{
  //Do Something with the recieved character
  //}
}
 
 
/*****************************************************************
* END OF main.c
******************************************************************/
thứ nhất: mình thấy cái chỗ if ((P1IN & (BIT0<<i)) == 1)//Read each bit from KEY thì nó sẽ chỉ đúng nếu nếu i=0 và bit 0 của P1 = 1
thứ 2: cái ngắt __interrupt void USCI0RX_ISR(void) khi vào ngắt sẽ ở trong ngắt luôn mà không thoát ra ngoài vì cờ báo ngắt chưa được xóa (cái này bạn xem nếu cờ ngắt tự động xóa thì khỏi cần)
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Vậy cái này thì sao ạ :_s...vẫn không chạy
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 KEY (BIT0|BIT3|BIT4|BIT5|BIT6|BIT7)
 
/*****************************************************************
* GLOBAL
******************************************************************/
 
 
 
/*****************************************************************
* INTERRUPT
******************************************************************/
 
 
 
/*****************************************************************
* PROTOTYPE
******************************************************************/
void sendbyte(int data);
 
/****************************************************************
* MAIN
****************************************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //Stop watchdog timer
 
P1DIR &= ~KEY; //KEY is input direction use for read the gamepad 's value
P1REN |= KEY;//KEY pullup resistor is enable
P1OUT |= KEY;//Use for P1REN- KEY is connected to VCC
 
//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
 
for(;;)
{
int data;
if (!(P1IN & KEY))//KEY is pressed (KEY is connected to VCC)
{
_delay_cycles(10);
if(!(P1IN & KEY))
{
 
 
if ((P1IN & 0xC1)==1) data=0;//Key[0] is pressed
if ((P1IN & 0xA1)==1) data=1;//Key[1] is pressed
if ((P1IN & 0x61)==1) data=2;//Key[2] is pressed
if ((P1IN & 0xC8)==1) data=3;//Key[3] is pressed
if ((P1IN & 0xA8)==1) data=4;//Key[4] is pressed
if ((P1IN & 0x68)==1) data=5;//Key[5] is pressed
if ((P1IN & 0xD0)==1) data=6;//Key[6] is pressed
if ((P1IN & 0x60)==1) data=7;//Key[7] is pressed
if ((P1IN & 0x70)==1) data=8;//Key[8] is pressed
 
sendbyte(data);
}
}
 
}
}
 
 
/*****************************************************************
* UART
* UART interrupt
******************************************************************/
void sendbyte(int data)
{
while(!(IFG2&UCA0TXIFG));
UCA0TXBUF = data;
while(!(IFG2&UCA0TXIFG));
}
 
 
//  Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
 
}
 
 
/*****************************************************************
* END OF main.c
******************************************************************/
 
1 là em đã chạy được code mẫu echo chưa?
2 là chạy được rồi, thì em chạy debug session của code này xem nó stuck ở đâu, cũng lúc chạy từng step và theo dõi các thanh ghi nhé. chứ code thế thì anh chịu, hoặc cố làm đi nếu tới chiều ko dc thì anh xem cho:D
cố lên.
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Em echo được rồi..vấn đề ở đây là em đang muốn đọc nút bấm rồi hiện lên UART mà làm mãi không ra (ví dụ bấm nút thì hiện chữ a hoặc số 1)..KHông biết ở TX phải thiết lập sao đây ạ
 
Top