📄 das1210.c
字号:
// Texas Instruments
// Name: DAS1210.c
// Revision: 1.0
// Description: MSC1210 DAQ-EVM Demo
#include <REG1210.H>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
extern signed long bipolar(void);
extern void put_string(char code *string);
extern char rx_byte(void);
extern void putspace1(void);
extern void putspace2(void);
extern void putspace3(void);
extern void putspace4(void);
extern void putcr(void);
extern void tx_hex(char);
extern void tx_byte(char);
extern char rx_byte_echo(void);
extern unsigned int rx_hex_double_echo(void);
extern void autobaud(void);
sbit TP3 = P1^4;
sbit TP4 = P1^5;
sbit TP5 = P1^6;
sbit TP6 = P1^7;
data char ROM_temp0 _at_ 0x000a; // For put_string function
data char ROM_temp1 _at_ 0x000b;
unsigned int n; // number of ADC conversion per ENOB calculation
unsigned char odac_temp;
// recursive digit display routine
void prt_digit(unsigned long int i, signed char d) reentrant
{ unsigned long int j; char c;
j=i/10; c=i-j*10; d--;
if (j!=0 || !(d &0x80)) prt_digit(j,d);
if (d==0) tx_byte('.');
tx_byte(c+48);
}
// Display long integer number with sign and decimal
void print(signed long int i, unsigned char d)
{
if (i<0) { tx_byte('-'); i*=-1;}
prt_digit(i,d); putspace4();
}
void acquire()
{
signed long int data adres, ienob, iu;
float x,u,sd ; unsigned char j; int i;
for (j=0;j<5;j++)adres=bipolar(); // discard initial 5 conversions
ODAC=odac_temp;
adres=bipolar();
while(1){
put_string("\x1b[37m\x1b[5;1HTP3="); tx_byte(TP3 | 0x30);
put_string("\tTP4=");tx_byte(TP4 | 0x30);
put_string("\tTP5=");tx_byte(TP5 | 0x30);
put_string("\tTP6=");tx_byte(TP6 | 0x30);
u=0;x=0; i=0; putcr();
while (i<n){ // acquire n points
putcr();
for (j=0;j<4;j++){
adres=bipolar();
u+=adres; x+= adres*adres; print(adres,0);
tx_byte('\t'); tx_byte('\t');
if(i<n) i++; else break;
}
}
u=u/n; sd=sqrt(x/n-u*u);
put_string("\nENOB="); print((24-log(sd)/log(2))*100.0,2);
put_string("\nAve="); print(u*100,2);
put_string("\nSD="); print(sd*100,2);
putspace4();
}
}
int settings(void)
{
PDCON &= 0x0f7; //turn on adc
ACLK = 0; // ACLK = 1.8432MHz/(1+1)= 0.9216MHz
if(rx_byte_echo()!='N'){
n=32;
DECIMATION = 1440; // Data Rate = ACLK/64/1440 = 10.000Hz
ADMUX = 0x033; // Select AIN3-AIN3
ADCON0 = 0x30; // Vref on 2.5V, Buff on, BOD off, PGA 1
ADCON1 = 0x01; // bipolar, auto, self calibration, offset, gain
} else {
put_string("\n4 hex#: #Samp?"); n=rx_hex_double_echo();
put_string("\tDECIMATION?"); DECIMATION = rx_hex_double_echo();
put_string("\n2 hex#: ADMUX?"); ADMUX = rx_hex_echo();
put_string("\tADCON0?"); ADCON0 = rx_hex_echo();
put_string("\tODAC?"); odac_temp = rx_hex_echo();
put_string("\tADCON1?"); ADCON1 = rx_hex_echo();
}
return(n);
}
void greeting(void)
{
TH1 = 255; // 4800 Baud @ 1.8432MHz
SCON = 0x52; // Async mode 1, 8-bit UART, enable rcvr, TI=1, RI=0
TMOD = 0x20; // T1 at 8 bit counter with auto reload
TR1 = 1; // Run T1
put_string("\x1b[1;34;46m\x1b[2J\x1b[12CDAS1210\nDefault Y/N?");
}
void main(void)
{
greeting();
n=settings();
acquire();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -