Em gộp các prototype vào 1 file nhưng ko truyền UART được (lúc trước tách ra cũng ko đọc được ) dịch thì build succeeded bình thường,mấy bác giúp em cái :Yêu cầu chỉ là đọc AD của chân AN2 rùi lấy giá trị so trung bình rùi truyền lên PC thui .(có cần fải nối AN0 lên 5v ,và AN1 xuống mass ko (ADCHS ??? )
Code:
#include <p30f4011.h>
#include <uart.h>
#include <stdio.h>
#include <math.h>
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PWRT_OFF);
_FGS(CODE_PROT_OFF);
#define FOSC 7372800
#define PLL 1
#define FCY FOSC*PLL/4
#define SAMPLINGRATE 1800
#define SAMPCOUNT (FCY/SAMPLINGRATE)+1 //dung cho TMR3 cho ADC
#define BAUDRATE 9600
#define U1BRG FCY/16/BAUDRATE -1 //dung cho UART
#define AN0 0 //khai bao adc_buf
#define adc_read(pin) adc_buf[pin]
//==== Cac prototype ====
void adc_init();
void adc_start();
void adc_stop();
void uart1_open();
void uart1_close();
void uart1_puts(char[]);
void PrintSignedInteger(int x, void (*printer)(char[]));
//==== cac bien ====
unsigned int adc_buf[16];
//==== ham main ===
int main()
{
float tb;
adc_init();
adc_start();
uart1_open();
while(1)
{
float trungbinh_AN0()
{
return (((float)adc_read(AN0) / 65500.0*5.)-2.5)/0.002; // gia tri so voi trung binh /don vi
}
tb = trungbinh_AN0();
PrintSignedInteger(tb, &uart1_puts); // Send result to uart
uart1_puts("\n\r");
}
uart1_close();
return 0;
}
//==== ADC ====
void adc_init()
{
adc_stop(); // reset adc
ADCON2bits.SMPI = 3; // SMPI gom 4bit ,tuong ung uC ngat khi 1->16 lan lay mau
ADCON2bits.CHPS = 0; // CHPS = 00 chon kenh 0 de chuyen doi
// CHPS = 01 chon kenh 0 va kenh 1 de chuyen doi
// CHPS = 1x chon tat ca cac kenh de chuyen doi
ADCON1bits.SIMSAM = 0; // SIMSAM = 0 lay mau tung kenh 1 cach tuan tu
// SIMSAM = 1 lay mau 4 kenh (0,1,2,3) 1 cach dong thoi
ADCON2bits.BUFM = 0; // BUFM = 0 lay 1 lan 16 bit
// BUFM = 1 lay 2 lan ,moi lan 8 bit
ADCON2bits.BUFS = 0;
ADCON2bits.ALTS = 0; // ALTS = 0 luon luon su dung MUX A lam bo don kenh
// ALTS = 1 ban dau dung Mux A ,sau do xen ke MuxB va Mux A lam bo don kenh
// MUX A Input Select
ADCHSbits.CH0SA = 2; // CH0SA = 0 chon nguon duong cua kenh A la AN0
// CH0SA = x chon nguon duong cua kenh A la ANx
ADCHSbits.CH0NA = 0; // CH0NA = 0 chon nguon am cua kenh A la Vref-
// CH0NA = 1 chon nguon am cua kenh A la AN1
ADCON2bits.CSCNA = 1; // 1 quet ngo vao
// 0 ko quet
ADCSSL = 0b0000000000111100; // Scan AN2..AN5 quet chan nao thi cho chan do len 1
// adc_buf tinh tu bit2=>5 ,vay adc_buf[0] = quet chan AN2
// chon nguon am duong cho cac kenh 1,2,3
ADCHSbits.CH123SA = 0;
ADCHSbits.CH123NA = 0;
// MUX B Input Select
ADCHSbits.CH123SB = 0;
ADCHSbits.CH123NB = 0;
// SPECIFIC BITS
ADCON1bits.FORM = 0b00; // output la integer
ADCON1bits.SSRC = 0b010; // chon bo dem de chuyen doi (3bit) => dung Timer 3 de dem
ADCON1bits.ASAM = 1; // 1 : tu dong tiep tuc lay mau khi chuyen doi xong ,bit SAMP tu dong set
// 0 : chuyen doi xong ,doi bit SAMP set thi moi tiep tuc lay mau
ADCON2bits.VCFG = 0b000; // 3bit : chon nguon tham khao => dung AVdd va AVss
ADCON3bits.SAMC = 0b11111; // dung 31 Tad cho lay mau
ADCON3bits.ADRC = 0; // dung clock he thong
ADCON3bits.ADCS = 0b011110; // chon xung chuyen doi (6bit tuong ung 1->32xTcy)
ADPCFG = 0xFF00; // AN0..AN7 la analog
// 0 : ngo vao la analog
// 1 : ngo vao la digital
TRISB = 0b11111111; // Port B la input
// INITIALIZE TIMER3 (dung cho bo dem ADC)
TMR3 = 0x0000;
PR3 = SAMPCOUNT;
IFS0bits.ADIF = 0; // Clear the A/D interrupt flag bit
IEC0bits.ADIE = 1; // Set the A/D interrupt enable bit
}
void adc_start()
{
ADCON1bits.ADON = 1;
T3CONbits.TON = 1;
}
void adc_stop()
{
ADCON1bits.ADON = 0;
T3CONbits.TON = 0;
}
//==== UART1 ====
void uart1_close()
{
CloseUART1(); // co san trong uart.h cua microchip
}
void uart1_open()
{
unsigned int baudvalue;
unsigned int U1MODEvalue;
unsigned int U1STAvalue;
uart1_close();
ConfigIntUART1(UART_RX_INT_DIS & UART_TX_INT_DIS);
baudvalue = U1BRG;
U1MODEvalue = 0x8000;
/*UART_EN & UART_IDLE_STOP & UART_RX_TX &
UART_DIS_WAKE & UART_DIS_LOOPBACK &
UART_DIS_ABAUD & UART_NO_PAR_8BIT &
UART_1STOPBIT;*/
U1STAvalue = 0x0400;
/*UART_INT_TX_BUF_EMPTY &
UART_TX_PIN_NORMAL &
UART_TX_ENABLE & UART_INT_RX_3_4_FUL &
UART_ADR_DETECT_DIS &
UART_RX_OVERRUN_CLEAR;*/
OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
}
void uart1_puts(char string[])
{
putsUART1 ((unsigned int *)string); // lay gia tri de gui di
while (BusyUART1());
}
//==== ham truyen len pc ====
void PrintSignedInteger(int x, void (*printer)(char[]))
{
static char tmpChar[2] = "0";
unsigned int radix, i, converted;
char emptyChar = ' ';
if (x < 0)
{
printer("-");
x*=-1;
}
else if (x == 0)
{
printer("0");
return;
}
converted = (unsigned int) x;
// auto-align on 16bit size (655.. = 5 positions)
for (radix=10000, i=0; i < 5; radix/=10, i++)
{
if (converted > radix-1)
{
tmpChar[0] = '0' + (converted/radix);
printer(tmpChar);
converted = converted % radix;
emptyChar = '0';
}
else if (emptyChar == '0')
{
printer("0");
}
}
}
Em đọc bằng hyper terminal thì trắng trơn hà ,dùng Labview (dùng cái exam basic serial write and read .vi) thì báo lỗi này :
Trích:
VISA: (Hex 0xBFFF0072) The resource is valid, but VISA cannot currently access it.
|
,bác nào xài lapview thì chỉ em lun ^_^