[Help] Đọc nhiều kênh ADC gửi lên UART

lee_trieu

Gà con
Chào mọi người !!:-(
mọi người cho em hỏi một vấn đề như thế này:
Em muốn đọc 3 kênh ADC: Kênh A1,A2 và A3. em xem code mẫu thì thấy người ta lưu kết quả trong thanh ghi ADC10SA vào RAM tại địa chỉ 0x200 hay gì đấy>:5cool_sweat: em muốn lấy kết quả của 3 kênh ADC lưu vào mảng để gửi lên UART, code em viết thế này, build không có lỗi nhưng không hiểu sao em khônng nhận được gì trên UART, debug cũng không thấy có giá trị nào được lưu trong mảng hết. mọi ngươi xem giúp em nha ! Cảm ơn mọi người !!:)
PHP:
#include "msp430g2553.h"
 
void conf_uart();
unsigned int res[3]; //for holding the conversion results
 
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                // Stop WDT
  ADC10CTL1 = INCH_3 + CONSEQ_1;            // A3/A2/A1, single sequence
  ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE;
  ADC10DTC1 = 0x03;                        // 3 conversions
  ADC10AE0 |= 0x0E;                        // P1.3,2,1 ADC10 option select
  P1DIR |= 0x01;                            // Set P1.0 output
  conf_uart();
  for (;;)
  {
    ADC10CTL0 &= ~ENC;
    while (ADC10CTL1 & BUSY);              // Wait if ADC10 core is active
    ADC10SA = (int)res;                        // Data buffer start
    P1OUT |= BIT0;                          // P1.0 = 1
    ADC10CTL0 |= ENC + ADC10SC;            // Sampling and conversion start
    __bis_SR_register( CPUOFF+ GIE);        // LPM0, ADC10_ISR will force exit
    P1OUT &= ~BIT0;                        // P1.0 = 0
  }
}
 
 
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
  __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
 
}
 
void conf_uart()
{
#if 1
        P1SEL |= BIT1 + BIT2;                 
P1SEL2 |= BIT1 + BIT2;                 
UCA0CTL1 |= UCSSEL_2;
        //Baud rate = 1Mhz/9600=104;
UCA0BR0 = 104;                       
UCA0BR1 = 0;                           
UCA0MCTL = UCBRS0;                     
UCA0CTL1 &= ~UCSWRST;                 
//IE2 |= UCA0RXIE;                       
__bis_SR_register(GIE);
#endif
}
 
H

huunho

Guest
bạn đã xử lý được vấn đề chưa?
 
H

huunho

Guest
bạn post toàn bộ project lên thì có khả năng giúp bạn được. hình như bạn không hiểu toàn bộ câu lệnh trong chương trình trên à? bạn phải viết trên IAR nhé. mình chỉ dùng IAR thôi

pot nốt cái uart lên nhe
 

lee_trieu

Gà con
pot nốt cái uart lên nhe
UART mình đã có trong code rồi mà :-(
cái hàm conf_uart() đó bạn:5cool_sweat:

bạn post toàn bộ project lên thì có khả năng giúp bạn được. hình như bạn không hiểu toàn bộ câu lệnh trong chương trình trên à? bạn phải viết trên IAR nhé. mình chỉ dùng IAR thôi
Project của mình đây, bạn xem giúp mình nha:-scảm ơn bạn nhiều !!=))

https://dl.dropboxusercontent.com/u/23155150/Multiple ADC UART.rar
 
H

huunho

Guest
chương trình trên máy tính nhận tín hiệu uart gửi đến từ vi điều khiển là chương trình nào hả bạn?
đấy là cái uart mình muốn đề cập
 

lee_trieu

Gà con
chương trình trên máy tính nhận tín hiệu uart gửi đến từ vi điều khiển là chương trình nào hả bạn?
đấy là cái uart mình muốn đề cập
Mình dùng Terminal và cả cái GUI trong thư mục C8.Public của câu lạc bộ để thử nhưng cả hai đều không có tác dụng:-s(Đã test thử code echo lại ký tự =>kết nối UART ok rồi nhé)
 

lee_trieu

Gà con
à hình như trong code và project mình gửi cho bạn chưa thêm lệnh gửi lên UART:5cool_sweat:để cái này vào cuối while(1) nhưng nó vẫn không ăn nhầm gì hết:-s
PHP:
 while (!(IFG2&UCA0TXIFG));                
   UCA0TXBUF = res[0];
   while (!(IFG2&UCA0TXIFG));                
   UCA0TXBUF = res[1];
   while(!(IFG2&UCA0TXIFG));
   UCA0TXBUF = res[2];
   __delay_cycles(800000);
 
H

huunho

Guest
phần mềm hiển thị dữ liệu uart trên máy tính là gì hả bạn? bạn không cho mình sao?
 

lee_trieu

Gà con
phần mềm hiển thị dữ liệu uart trên máy tính là gì hả bạn? bạn không cho mình sao?
Mình có xem cái mảng res[3]; khi debug rồi, không có gì hết sao gửi qua uart được???:5cool_sweat:mình nghĩ vấn đề chỗ cái thanh ghi ADC10SA ấy:5cool_sweat:nhưng không biết chính xác lỗi gì:-s
 

lee_trieu

Gà con
Bạn thử khai báo
Code:
unsigned int *res = (unsigned int*) 0x200;
Trong đó 0x200 (giá trị mặc định của ADC10SA) là địa chỉ của res[0].
Hình như cách này khả thi đó ạ:-(Khi debug thấy mấy cái biến res[0],res[1],res[2] có giá trị :5cool_sweat:nhưng mà nó lại bị treo chỗ UART ạ:-s treo ngay dòng này :
Code:
while (!(IFG2&UCA0TXIFG));
 
Top