Đánh giá chủ đề:
  • 54 Vote(s) - Trung bình 3.17
  • 1
  • 2
  • 3
  • 4
  • 5
Code MSP430 Application UART with TI Launchpad
Bài viết: #1
Big Grin 
Đây là chương trình giao tiếp UART giữa máy tính với KIT TI Launchpad với ứng dụng trên chip MSP430G2231 các bạn tham khảo nhé!


PHP Code:
#include "msp430g2231.h"
 
//------------------------------------------------------------------------------
// Hardware-related definitions
//------------------------------------------------------------------------------
#define UART_TXD   0x02                 // TXD on P1.1 (Timer0_A.OUT0)
#define UART_RXD   0x04                 // RXD on P1.2 (Timer0_A.CCI1A)
 
//------------------------------------------------------------------------------
// Conditions for 9600 Baud SW UART, SMCLK = 1MHz
//------------------------------------------------------------------------------
#define UART_TBIT_DIV_2 (1000000 / (9600 * 2))
#define UART_TBIT       (1000000 / 9600)
 
//------------------------------------------------------------------------------
// Global variables used for full-duplex UART communication
//------------------------------------------------------------------------------
unsigned int txData;                    // UART internal variable for TX
unsigned char rxBuffer;                 // Received UART character
unsigned int t1,t2;
short w;
short calc;
//------------------------------------------------------------------------------
// Function prototypes
//------------------------------------------------------------------------------
void TimerA_UART_init(void);
void TimerA_UART_tx(unsigned char byte);
void TimerA_UART_print(char *string);
 
void itoa(unsigned int valchar *strunsigned int limit)
{
  
int temploc 0;
  
int digit 0;
  
int strloc 0;
  
char tempstr[5]; //16-bit number can be at most 5 ASCII digits;
 
  
if(val>limit)
val %= limit;
 
  do
  {
digit val 10;
tempstr[temploc++] = digit '0';
val /= 10;
  } while (
val 0);
 
  
// reverse the digits back into the output string
  
while(temploc>0)
str[strloc++] = tempstr[--temploc];
 
  
str[strloc]=0;
}
//------------------------------------------------------------------------------
// main()
//------------------------------------------------------------------------------
void main(void){
WDTCTL WDTPW WDTHOLD;           // Stop watchdog timer
 
DCOCTL 0x00;                      // Set DCOCLK to 1MHz
BCSCTL1 CALBC1_1MHZ;
DCOCTL CALDCO_1MHZ;
 
P1OUT 0x00;                       // Initialize all GPIO
P1SEL UART_TXD UART_RXD;        // Timer function for TXD/RXD pins
P1DIR 0xFF & ~UART_RXD;           // Set all pins but RXD to output
 
__enable_interrupt();
 
TimerA_UART_init();                 // Start Timer_A UART
P1OUT 0x01;
t1 t2 0;
calc 0;
for (;;)
{
    
// Wait for incoming character
    
__bis_SR_register(LPM0_bits);
    if(
calc == 0){
    if(
rxBuffer '/' && rxBuffer ':')
    
t1 t1*10+(rxBuffer-'0');
    else switch(
rxBuffer){
    case 
'*':
    
calc 1;
    break;
    case 
'/':
    
calc 2;
    break;
case 
'+':
calc 3;
break;
case 
'-':
calc 4;
break;
    };
    } else {
    if(
rxBuffer '/' && rxBuffer ':')
    
t2 t2*10+(rxBuffer-'0');
if(
rxBuffer == '\r'){
unsigned int t3;
switch(
calc){
case 
1:
t3 t1*t2;
break;
case 
2:
t3 t1/t2;
break;
case 
3:
t3 t1+t2;
break;
case 
4:
t3 t1-t2;
break;
}
//TimerA_UART_print(myitoa(t3));
TimerA_UART_tx('=');
char itoad[16];
itoa(t3,itoad,65535);
TimerA_UART_print(itoad);
calc t1 t2 0;
TimerA_UART_print("\r\n");
}
    }
    
TimerA_UART_tx(rxBuffer);
 
 
}
}
 
 
//------------------------------------------------------------------------------
// Function configures Timer_A for full-duplex UART operation
//------------------------------------------------------------------------------
void TimerA_UART_init(void)
{
TACCTL0 OUT;                      // Set TXD Idle as Mark = '1'
TACCTL1 SCS CM1 CAP CCIE;   // Sync, Neg Edge, Capture, Int
TACTL TASSEL_2 MC_2;            // SMCLK, start in continuous mode
}
//------------------------------------------------------------------------------
// Outputs one byte using the Timer_A UART
//------------------------------------------------------------------------------
void TimerA_UART_tx(unsigned char byte)
{
while (
TACCTL0 CCIE);             // Ensure last char got TX'd
TACCR0 TAR;                       // Current state of TA counter
TACCR0 += UART_TBIT;                // One bit time till first bit
TACCTL0 OUTMOD0 CCIE;           // Set TXD on EQU0, Int
txData byte;                      // Load global variable
txData |= 0x100;                    // Add mark stop bit to TXData
txData <<= 1;                       // Add space start bit
}
 
//------------------------------------------------------------------------------
// Prints a string over using the Timer_A UART
//------------------------------------------------------------------------------
void TimerA_UART_print(char *string)
{
while (*
string) {
    
TimerA_UART_tx(*string++);
}
}
//------------------------------------------------------------------------------
// Timer_A UART - Transmit Interrupt Handler
//------------------------------------------------------------------------------
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0_ISR(void)
{
static 
unsigned char txBitCnt 10;
 
TACCR0 += UART_TBIT;                // Add Offset to CCRx
if (txBitCnt == 0) {                // All bits TXed?
    
TACCTL0 &= ~CCIE;               // All bits TXed, disable interrupt
    
txBitCnt 10;                  // Re-load bit counter
}
else {
    if (
txData 0x01) {
      
TACCTL0 &= ~OUTMOD2;          // TX Mark '1'
    
}
    else {
      
TACCTL0 |= OUTMOD2;           // TX Space '0'
    
}
    
txData >>= 1;
    
txBitCnt--;
}
}  
//------------------------------------------------------------------------------
// Timer_A UART - Receive Interrupt Handler
//------------------------------------------------------------------------------
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1_ISR(void)
{
static 
unsigned char rxBitCnt 8;
static 
unsigned char rxData 0;
 
switch (
__even_in_range(TAIVTAIV_TAIFG)) { // Use calculated branching
    
case TAIV_TACCR1:                    // TACCR1 CCIFG - UART RX
        
TACCR1 += UART_TBIT;             // Add Offset to CCRx
        
if (TACCTL1 CAP) {             // Capture mode = start bit edge
            
TACCTL1 &= ~CAP;             // Switch capture to compare mode
            
TACCR1 += UART_TBIT_DIV_2;   // Point CCRx to middle of D0
        
}
        else {
            
rxData >>= 1;
            if (
TACCTL1 SCCI) {        // Get bit waiting in receive latch
                
rxData |= 0x80;
            }
            
rxBitCnt--;
            if (
rxBitCnt == 0) {         // All bits RXed?
                
rxBuffer rxData;       // Store in global variable
                
rxBitCnt 8;            // Re-load bit counter
                
TACCTL1 |= CAP;          // Switch compare to capture mode
                
__bic_SR_register_on_exit(LPM0_bits);  // Clear LPM0 bits from 0(SR)
            
}
        }
        break;
}
}
//------------------------------------------------------------------------------ 

Demo video:





Nguồn: You are not allowed to view links. Register or Login to view.
Trả lời
Bài viết: #2
(19-10-2011, 12:50 AM)msp430 Đã viết: You are not allowed to view links. Register or Login to view.
Đây là chương trình giao tiếp UART giữa máy tính với KIT TI Launchpad với ứng dụng trên chip MSP430G2231 các bạn tham khảo nhé!


PHP Code:
#include "msp430g2231.h"
 
//------------------------------------------------------------------------------
// Hardware-related definitions
//------------------------------------------------------------------------------
#define UART_TXD   0x02                 // TXD on P1.1 (Timer0_A.OUT0)
#define UART_RXD   0x04                 // RXD on P1.2 (Timer0_A.CCI1A)
 
//------------------------------------------------------------------------------
// Conditions for 9600 Baud SW UART, SMCLK = 1MHz
//------------------------------------------------------------------------------
#define UART_TBIT_DIV_2 (1000000 / (9600 * 2))
#define UART_TBIT       (1000000 / 9600)
 
//------------------------------------------------------------------------------
// Global variables used for full-duplex UART communication
//------------------------------------------------------------------------------
unsigned int txData;                    // UART internal variable for TX
unsigned char rxBuffer;                 // Received UART character
unsigned int t1,t2;
short w;
short calc;
//------------------------------------------------------------------------------
// Function prototypes
//------------------------------------------------------------------------------
void TimerA_UART_init(void);
void TimerA_UART_tx(unsigned char byte);
void TimerA_UART_print(char *string);
 
void itoa(unsigned int valchar *strunsigned int limit)
{
  
int temploc 0;
  
int digit 0;
  
int strloc 0;
  
char tempstr[5]; //16-bit number can be at most 5 ASCII digits;
 
  
if(val>limit)
val %= limit;
 
  do
  {
digit val 10;
tempstr[temploc++] = digit '0';
val /= 10;
  } while (
val 0);
 
  
// reverse the digits back into the output string
  
while(temploc>0)
str[strloc++] = tempstr[--temploc];
 
  
str[strloc]=0;
}
//------------------------------------------------------------------------------
// main()
//------------------------------------------------------------------------------
void main(void){
WDTCTL WDTPW WDTHOLD;           // Stop watchdog timer
 
DCOCTL 0x00;                      // Set DCOCLK to 1MHz
BCSCTL1 CALBC1_1MHZ;
DCOCTL CALDCO_1MHZ;
 
P1OUT 0x00;                       // Initialize all GPIO
P1SEL UART_TXD UART_RXD;        // Timer function for TXD/RXD pins
P1DIR 0xFF & ~UART_RXD;           // Set all pins but RXD to output
 
__enable_interrupt();
 
TimerA_UART_init();                 // Start Timer_A UART
P1OUT 0x01;
t1 t2 0;
calc 0;
for (;;)
{
    
// Wait for incoming character
    
__bis_SR_register(LPM0_bits);
    if(
calc == 0){
    if(
rxBuffer '/' && rxBuffer ':')
    
t1 t1*10+(rxBuffer-'0');
    else switch(
rxBuffer){
    case 
'*':
    
calc 1;
    break;
    case 
'/':
    
calc 2;
    break;
case 
'+':
calc 3;
break;
case 
'-':
calc 4;
break;
    };
    } else {
    if(
rxBuffer '/' && rxBuffer ':')
    
t2 t2*10+(rxBuffer-'0');
if(
rxBuffer == '\r'){
unsigned int t3;
switch(
calc){
case 
1:
t3 t1*t2;
break;
case 
2:
t3 t1/t2;
break;
case 
3:
t3 t1+t2;
break;
case 
4:
t3 t1-t2;
break;
}
//TimerA_UART_print(myitoa(t3));
TimerA_UART_tx('=');
char itoad[16];
itoa(t3,itoad,65535);
TimerA_UART_print(itoad);
calc t1 t2 0;
TimerA_UART_print("\r\n");
}
    }
    
TimerA_UART_tx(rxBuffer);
 
 
}
}
 
 
//------------------------------------------------------------------------------
// Function configures Timer_A for full-duplex UART operation
//------------------------------------------------------------------------------
void TimerA_UART_init(void)
{
TACCTL0 OUT;                      // Set TXD Idle as Mark = '1'
TACCTL1 SCS CM1 CAP CCIE;   // Sync, Neg Edge, Capture, Int
TACTL TASSEL_2 MC_2;            // SMCLK, start in continuous mode
}
//------------------------------------------------------------------------------
// Outputs one byte using the Timer_A UART
//------------------------------------------------------------------------------
void TimerA_UART_tx(unsigned char byte)
{
while (
TACCTL0 CCIE);             // Ensure last char got TX'd
TACCR0 TAR;                       // Current state of TA counter
TACCR0 += UART_TBIT;                // One bit time till first bit
TACCTL0 OUTMOD0 CCIE;           // Set TXD on EQU0, Int
txData byte;                      // Load global variable
txData |= 0x100;                    // Add mark stop bit to TXData
txData <<= 1;                       // Add space start bit
}
 
//------------------------------------------------------------------------------
// Prints a string over using the Timer_A UART
//------------------------------------------------------------------------------
void TimerA_UART_print(char *string)
{
while (*
string) {
    
TimerA_UART_tx(*string++);
}
}
//------------------------------------------------------------------------------
// Timer_A UART - Transmit Interrupt Handler
//------------------------------------------------------------------------------
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0_ISR(void)
{
static 
unsigned char txBitCnt 10;
 
TACCR0 += UART_TBIT;                // Add Offset to CCRx
if (txBitCnt == 0) {                // All bits TXed?
    
TACCTL0 &= ~CCIE;               // All bits TXed, disable interrupt
    
txBitCnt 10;                  // Re-load bit counter
}
else {
    if (
txData 0x01) {
      
TACCTL0 &= ~OUTMOD2;          // TX Mark '1'
    
}
    else {
      
TACCTL0 |= OUTMOD2;           // TX Space '0'
    
}
    
txData >>= 1;
    
txBitCnt--;
}
}  
//------------------------------------------------------------------------------
// Timer_A UART - Receive Interrupt Handler
//------------------------------------------------------------------------------
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1_ISR(void)
{
static 
unsigned char rxBitCnt 8;
static 
unsigned char rxData 0;
 
switch (
__even_in_range(TAIVTAIV_TAIFG)) { // Use calculated branching
    
case TAIV_TACCR1:                    // TACCR1 CCIFG - UART RX
        
TACCR1 += UART_TBIT;             // Add Offset to CCRx
        
if (TACCTL1 CAP) {             // Capture mode = start bit edge
            
TACCTL1 &= ~CAP;             // Switch capture to compare mode
            
TACCR1 += UART_TBIT_DIV_2;   // Point CCRx to middle of D0
        
}
        else {
            
rxData >>= 1;
            if (
TACCTL1 SCCI) {        // Get bit waiting in receive latch
                
rxData |= 0x80;
            }
            
rxBitCnt--;
            if (
rxBitCnt == 0) {         // All bits RXed?
                
rxBuffer rxData;       // Store in global variable
                
rxBitCnt 8;            // Re-load bit counter
                
TACCTL1 |= CAP;          // Switch compare to capture mode
                
__bic_SR_register_on_exit(LPM0_bits);  // Clear LPM0 bits from 0(SR)
            
}
        }
        break;
}
}
//------------------------------------------------------------------------------ 

Demo video:





Nguồn: You are not allowed to view links. Register or Login to view.


Trên máy tính mở chúng ta mở bằng phần mềm j vậy bạn?

Trả lời
Bài viết: #3
Bạn mở bằng trình biên dịch IAR nhé!
Trả lời
Bài viết: #4
Không, Ý mình là khi xem đoạn video Demo có thao tác là viết : 1+1=2, 55*5=275,.... Những thao tác này viết trên cái nào vậy bạn? Bạn có thể mô tả chi tiết các bước không?
Trả lời
Bài viết: #5
Bạn thấy tên phần mềm kèm theo video không? là nó đó. 14
Trả lời
Bài viết: #6
cái này dùng timer để gửi lên phải không?

Giờ mình cũng dùng timer để tính toán một giá trị để gửi lên uart thì cũng làm trong ngắt timer của uart hay sao
Trả lời
Bài viết: #7
Chào bạn, trong phần code trên chỉ mới sử dụng TIMERA1, bạn còn TIMERA0 có thể dùng!
Chúc các bạn thành công!
Trả lời
Bài viết: #8
nhưng mà mình thấy có dùng
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0_ISR(void)

#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1_ISR(void)

nữa mà.

nếu mình dùng thì viết trong
#pragma vector = TIMERA0_VECTOR luôn hay sao
Trả lời
Bài viết: #9
Nếu code xử lý của bạn không lớn lắm thì có thể viết trong timer0 luôn cũng được!
Chúc các bạn thành công!
Trả lời
Bài viết: #10
(19-10-2011, 12:50 AM)msp430 Đã viết: You are not allowed to view links. Register or Login to view.
Đây là chương trình giao tiếp UART giữa máy tính với KIT TI Launchpad với ứng dụng trên chip MSP430G2231 các bạn tham khảo nhé!


PHP Code:
#include "msp430g2231.h"
 
//------------------------------------------------------------------------------
// Hardware-related definitions
//------------------------------------------------------------------------------
#define UART_TXD   0x02                 // TXD on P1.1 (Timer0_A.OUT0)
#define UART_RXD   0x04                 // RXD on P1.2 (Timer0_A.CCI1A)
 
//------------------------------------------------------------------------------
// Conditions for 9600 Baud SW UART, SMCLK = 1MHz
//------------------------------------------------------------------------------
#define UART_TBIT_DIV_2 (1000000 / (9600 * 2))
#define UART_TBIT       (1000000 / 9600)
 
//------------------------------------------------------------------------------
// Global variables used for full-duplex UART communication
//------------------------------------------------------------------------------
unsigned int txData;                    // UART internal variable for TX
unsigned char rxBuffer;                 // Received UART character
unsigned int t1,t2;
short w;
short calc;
//------------------------------------------------------------------------------
// Function prototypes
//------------------------------------------------------------------------------
void TimerA_UART_init(void);
void TimerA_UART_tx(unsigned char byte);
void TimerA_UART_print(char *string);
 
void itoa(unsigned int valchar *strunsigned int limit)
{
  
int temploc 0;
  
int digit 0;
  
int strloc 0;
  
char tempstr[5]; //16-bit number can be at most 5 ASCII digits;
 
  
if(val>limit)
val %= limit;
 
  do
  {
digit val 10;
tempstr[temploc++] = digit '0';
val /= 10;
  } while (
val 0);
 
  
// reverse the digits back into the output string
  
while(temploc>0)
str[strloc++] = tempstr[--temploc];
 
  
str[strloc]=0;
}
//------------------------------------------------------------------------------
// main()
//------------------------------------------------------------------------------
void main(void){
WDTCTL WDTPW WDTHOLD;           // Stop watchdog timer
 
DCOCTL 0x00;                      // Set DCOCLK to 1MHz
BCSCTL1 CALBC1_1MHZ;
DCOCTL CALDCO_1MHZ;
 
P1OUT 0x00;                       // Initialize all GPIO
P1SEL UART_TXD UART_RXD;        // Timer function for TXD/RXD pins
P1DIR 0xFF & ~UART_RXD;           // Set all pins but RXD to output
 
__enable_interrupt();
 
TimerA_UART_init();                 // Start Timer_A UART
P1OUT 0x01;
t1 t2 0;
calc 0;
for (;;)
{
    
// Wait for incoming character
    
__bis_SR_register(LPM0_bits);
    if(
calc == 0){
    if(
rxBuffer '/' && rxBuffer ':')
    
t1 t1*10+(rxBuffer-'0');
    else switch(
rxBuffer){
    case 
'*':
    
calc 1;
    break;
    case 
'/':
    
calc 2;
    break;
case 
'+':
calc 3;
break;
case 
'-':
calc 4;
break;
    };
    } else {
    if(
rxBuffer '/' && rxBuffer ':')
    
t2 t2*10+(rxBuffer-'0');
if(
rxBuffer == '\r'){
unsigned int t3;
switch(
calc){
case 
1:
t3 t1*t2;
break;
case 
2:
t3 t1/t2;
break;
case 
3:
t3 t1+t2;
break;
case 
4:
t3 t1-t2;
break;
}
//TimerA_UART_print(myitoa(t3));
TimerA_UART_tx('=');
char itoad[16];
itoa(t3,itoad,65535);
TimerA_UART_print(itoad);
calc t1 t2 0;
TimerA_UART_print("\r\n");
}
    }
    
TimerA_UART_tx(rxBuffer);
 
 
}
}
 
 
//------------------------------------------------------------------------------
// Function configures Timer_A for full-duplex UART operation
//------------------------------------------------------------------------------
void TimerA_UART_init(void)
{
TACCTL0 OUT;                      // Set TXD Idle as Mark = '1'
TACCTL1 SCS CM1 CAP CCIE;   // Sync, Neg Edge, Capture, Int
TACTL TASSEL_2 MC_2;            // SMCLK, start in continuous mode
}
//------------------------------------------------------------------------------
// Outputs one byte using the Timer_A UART
//------------------------------------------------------------------------------
void TimerA_UART_tx(unsigned char byte)
{
while (
TACCTL0 CCIE);             // Ensure last char got TX'd
TACCR0 TAR;                       // Current state of TA counter
TACCR0 += UART_TBIT;                // One bit time till first bit
TACCTL0 OUTMOD0 CCIE;           // Set TXD on EQU0, Int
txData byte;                      // Load global variable
txData |= 0x100;                    // Add mark stop bit to TXData
txData <<= 1;                       // Add space start bit
}
 
//------------------------------------------------------------------------------
// Prints a string over using the Timer_A UART
//------------------------------------------------------------------------------
void TimerA_UART_print(char *string)
{
while (*
string) {
    
TimerA_UART_tx(*string++);
}
}
//------------------------------------------------------------------------------
// Timer_A UART - Transmit Interrupt Handler
//------------------------------------------------------------------------------
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0_ISR(void)
{
static 
unsigned char txBitCnt 10;
 
TACCR0 += UART_TBIT;                // Add Offset to CCRx
if (txBitCnt == 0) {                // All bits TXed?
    
TACCTL0 &= ~CCIE;               // All bits TXed, disable interrupt
    
txBitCnt 10;                  // Re-load bit counter
}
else {
    if (
txData 0x01) {
      
TACCTL0 &= ~OUTMOD2;          // TX Mark '1'
    
}
    else {
      
TACCTL0 |= OUTMOD2;           // TX Space '0'
    
}
    
txData >>= 1;
    
txBitCnt--;
}
}  
//------------------------------------------------------------------------------
// Timer_A UART - Receive Interrupt Handler
//------------------------------------------------------------------------------
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1_ISR(void)
{
static 
unsigned char rxBitCnt 8;
static 
unsigned char rxData 0;
 
switch (
__even_in_range(TAIVTAIV_TAIFG)) { // Use calculated branching
    
case TAIV_TACCR1:                    // TACCR1 CCIFG - UART RX
        
TACCR1 += UART_TBIT;             // Add Offset to CCRx
        
if (TACCTL1 CAP) {             // Capture mode = start bit edge
            
TACCTL1 &= ~CAP;             // Switch capture to compare mode
            
TACCR1 += UART_TBIT_DIV_2;   // Point CCRx to middle of D0
        
}
        else {
            
rxData >>= 1;
            if (
TACCTL1 SCCI) {        // Get bit waiting in receive latch
                
rxData |= 0x80;
            }
            
rxBitCnt--;
            if (
rxBitCnt == 0) {         // All bits RXed?
                
rxBuffer rxData;       // Store in global variable
                
rxBitCnt 8;            // Re-load bit counter
                
TACCTL1 |= CAP;          // Switch compare to capture mode
                
__bic_SR_register_on_exit(LPM0_bits);  // Clear LPM0 bits from 0(SR)
            
}
        }
        break;
}
}
//------------------------------------------------------------------------------ 

Demo video:





Nguồn: You are not allowed to view links. Register or Login to view.
chào bạn...cho mình hỏi cái giao diện mà bạn gõ các phép tính đó là phần mềm gì vậy...có sẵn share mình nha..hay phải tự viết ra bạn...thank
Trả lời


Đi tới chuyên mục:


Thành viên đang xem chủ đề: 1 Khách