📄 adc.c
字号:
//
// MSC1200 Debug
//
// This program configures the ADC input to measure
// the IDAC voltage through a 1k resistor on the
// AIN7-AINCOM inputs on the MSC1200EVM.
// The ADC output in floating point format is
// transmitted on UART0.
// The "bipolar" routine returns the ADC value
// in registers R4567 (long int).
//
// The program is then downloaded by the serial
// debugger into the MSC1200.
//
#include <REG1200.H>
#include <stdio.h>
#define LSB 298e-9
at 0x803d code char HCR2 = 0x03; // External Oscillator
extern signed long bipolar(void);
float result;
char AD_Done;
int putchar(int car)
{
ES0=0; // Mask USART INTs or
// they will clear TI_0 as soon as it appears
TI_0=0;
SBUF=car;
while(!TI_0);
TI_0=0;
ES0=1;
}
void AUXInterrupt (void) interrupt 6
{
switch (PAI)
{
case 6: // ADC Interrupt
result = bipolar();
AD_Done = 1; // Set ADC Done Flag
break;
}
AI=0; // Clear Aux Int Before RETI
}
void main(void)
{
char i;
PDCON= 0xA7; // Power Up IDAC, ADC
ACLK = 16; // ACLK = 22.1184/17 = 1.301 MHz
// 1.301 Mhz/64 = 20,330 Hz
ADMUX = 0x78; // AINP = AIN7, AINN = AINCOM
DECIMATION = 2033; // Data Rate = 20,330/2,033 = 10 Hz
ADCON0 = 0x30; // Vref On, 2.5V, Buffer Off, PGA=1
ADCON1 = 0x01; // Bipolar, Auto, Self Calibration - Offset, Gain
IDAC = 0x84; // IDAC = 3.81uA *1k *0x84 ~ 500mV
printf ("MSC1200 Debug Program\n");
for (i=0; i<3 ; i++) {
while(!(AIPOL&0x20)) {}
result = ADRESL; // Clear Filter
}
AIE = 0x20; // Enable ADC Interrupt and HW Breakpoint Interrupt
EAI = 0x01; // Enable Auxiliary Interrupts
while(1){
while (!AD_Done); // Loop Until ADC Interrupt
AD_Done = 0;
if (!(++i%4)) printf ("\n");
printf ("%6.6f\t", result*LSB); // Print ADC Results
if ((result*LSB) > 0.504)
--IDAC;
if ((result*LSB) < 0.496)
++IDAC;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -