Giao tiếp Uart: dùng pc để điều khiển hai led trên kit msp430g2553

Phạm Minh

Thành Viên PIF
Cho mình hỏi là làm sao để điều khiển được hai led trên kit được. À, mà giá trị trong thanh ghi UCA0RXBUF mình lấy trực tiếp để gán vào một biến được không, hay phải thông qua hàm đọc giá trị thành ghi UCA0RXBUF vậy ?????:-s
 

Võ Hồng Đức

Thành Viên PIF
thanh ghi UCA0RXBUF có thể đọc trực tiếp khi bạn vào ngắt hoặc bạn chờ cờ ngắt set lên (cách này không khuyến khích), bạn có thể tham khảo code mẫu của clb
 

Tuất

Thành Viên PIF
à mà có cách nào để dùng uart điều khiển tắt bật led không
có chứ bạn, kiểu như bạn sẽ cho kit đọc 1 chuỗi kí tự nhận từ uart, mình sẽ code sao cho chuỗi kí tự nhận được ứng với một việc gì đó :)
 

Phạm Minh

Thành Viên PIF
#include "msp430.h"
unsigned int t;
void Configure_Clocks(void)
{
if(CALBC1_1MHZ == 0xFF)
{
while(1);
}
DCOCTL = 0;
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
// Chọn nguồn clock là 8MHz
BCSCTL2 |= SELM_0; // chọn nguồn MCLK là DCO
// lúc này tần số hoạt động của MCU là 1MHZ ( mặc định MCU lấy nguồn MCLK là DCO )

}
void Configure_Led(void)
{
P1DIR |= BIT0 + BIT6 ; // P1.0 and P1.6 are input point
P1OUT &=~ BIT0;
P1OUT &=~ BIT6;
}
void Configure_Uart(void)
{
P1SEL = BIT1 + BIT2; // P1.1 = RXD, P1.2 = TXD
P1SEL2 = BIT1 + BIT2;
UCA0CTL1 = UCSWRST; // bắt đầu cấu hình
UCA0CTL0 = 0x00; // parity Disabled
// bit thấp đầu tiên
// truyền 8 bit
// chọn chế độ UART
// chế độ không đồng bộ
UCA0CTL1 = UCSSEL_2 | UCSWRST; // chọn nguồn clock UART(SMLK) là DCO 8MHZ
UCA0MCTL = UCBRS_0 | UCBRF_1|UCOS16;
UCA0BR0 = 52; //chọn tốc độ baud là 9600, tần số 8MHz tra bảng guide
UCA0BR1 = 00;
UCA0CTL1 &=~ UCSWRST ; // reset để hoạt động
IE2 |= UCA0RXIE; //cho phép ngắt ở uart rx
_BIS_SR(GIE); // ngắt toàn cục
}
void Configure_Sendbyte(unsigned int byte)
{
while(!(IFG2 & UCA0TXIFG)); //đợi tới khi bộ truyền trống
UCA0TXBUF = byte;
}
void Configure_String(char* string)
{
while(*string)//hết chuỗi kí tự thì thoát
{
while(!(IFG2 & UCA0TXIFG)); // đợi khi nào truyền xong một kí tự
UCA0TXBUF = *string;
string++; // lấy kí tự tiếp theo
}
}
char UART_Read_Char()
{
while (!(IFG2&UCA0RXIFG)); // Doi gui xong ky tu truoc
// Moi cho phep nhan ky tu tiep theo
return UCA0RXBUF;
}
void UART_Read_String(char* s)
{
*s = UART_Read_Char();
while(*s != '\0')
{
s++;
*s = UART_Read_Char();
}
}
void Uart_control_led(void)
{
unsigned int t;
while(!(IFG2 & UCA0RXIFG)); // Đợi đến khi thanh ghi nhận trống
t = UCA0RXBUF; // đặt giá trị trong thanh ghi RX vào biến t
if(t ==1)
{
P1OUT |= BIT0;
P1OUT &=~ BIT6;
}
if(t == 2)
{
P1OUT |= BIT6;
P1OUT &=~ BIT0;
}
if(t != 1 && t != 2)
P1OUT |= 0X00;


}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // WATCHDOG
Configure_Clocks();
Configure_Led();
Configure_Uart();
_BIS_SR(GIE);
}
#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
Uart_control_led();
}
 

Võ Hồng Đức

Thành Viên PIF
Thông thường khi giao tiếp UART chúng ta thường sử dụng mã ASCII, tức là t == 1 tương tự với t == 0x01, còn nếu bạn gửi từ terminal hoặc bạn viết gui gửi xuống cho MCU là kí tự '1' mã ascii là 0x31 nên nó không đúng trường hợp trên.
và theo như mình đã từng code, và có tham khảo qua code mẫu thì khi dùng ngắt thì không cần dùng while(!(IFG2 & UCA0RXIFG)) trong ngắt nữa ( vì cờ ngắt đã được set lên HIGH trước khi vào ngắt)
 
Top