發新話題
打印

關於adc F06x_SAR16data求助

關於adc F06x_SAR16data求助

是否能解釋下列關於16位元的語言 謝謝

// 16-bit SFR Definitions for 'F06x


sfr16 RCAP3    = 0xCA;                 // Timer3 reload value
sfr16 TMR3     = 0xCC;                 // Timer3 counter

sfr16 ADC0     = 0xBE;                 // ADC0 Data
sfr16 ADC1     = 0xBE;                 // ADC1 Data

sfr16 DMA0DS   = 0xDB;                 // DMA0 XRAM Address Pointer
sfr16 DMA0CT   = 0xF9;                 // DMA0 Repeat Counter Limit
sfr16 DMA0DA   = 0xD9;                 // DMA0 Address Beginning
sfr16 DMA0CS   = 0xFB;                 // DMA0 Repeat Counter


//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------

#define SYSCLK 22118400                   // SYSCLK frequency in Hz
#define BAUDRATE 115200                   // Baud Rate for UART0

// DMA INSTRUCTIONS
#define DMA0_END_OF_OP     0x00           // End-of-Operation
#define DMA0_END_OF_OP_C   0x80           // End-of-Operation + Continue
#define DMA0_GET_ADC0      0x10           // Retrieve ADC0 Data
#define DMA0_GET_ADC1      0x20           // Retrieve ADC1 Data
#define DMA0_GET_ADC01     0x30           // Retrieve ADC0 and ADC1 Data
#define DMA0_GET_DIFF      0x40           // Retrieve Differential Data
#define DMA0_GET_DIFF1     0x60           // Retrieve Differential and ADC1 Data


#define NUM_SAMPLES        32768          // Number of ADC sample to acquire (each sample 2 bytes)
#define XRAM_START_ADD     0x0000         // DMA0 XRAM Start address of ADC data log
#define SAMP_RATE          100000         // ADC sample rate in Hz


sbit LED = P0^7;                          // LED: '1' = ON; '0' = OFF
sbit BUTTON = P3^7;                       // pushbutton on the target board
sbit RAM_CS = P4^5;                       // chip select bit is P4^4

//------------------------------------------------------------------------------------
// Function PROTOTYPES
//------------------------------------------------------------------------------------
void SYSCLK_Init (void);
void UART0_Init (void);
void PORT_Init (void);
void ADC0_Init (void);
void ADC1_Init (void);
void DMA0_Init (void);
void Timer3_Init (int counts);
void EMIF_Init (void);
void SendData(void);

//-------------------------
// Global Variables
//-------------------------
unsigned char Conv_Complete = 0;
unsigned int xdata * data read_ptr;

//// MAIN Routine
//void main (void)
{
   WDTCN = 0xde;                          // disable watchdog timer
   WDTCN = 0xad;

   SYSCLK_Init ();                        // initialize SYSCLK

   PORT_Init ();

   EMIF_Init ();                          // Storing ADC samples in SRAM on the
                                          // target board.
   SFRPAGE = CONFIG_PAGE;

   RAM_CS = 0;                            // assert SRAM chip select

   UART0_Init ();                         // initialize UART0

   Timer3_Init (SYSCLK/SAMP_RATE);        // Init Timer3 for 100ksps sample rate

   ADC0_Init ();                          // configure ADC0 and ADC1 for differential
                                          // measurement.

   DMA0_Init ();                          // Configure DMA to move NUM_SAMP samples.


   SFRPAGE = UART0_PAGE;
   printf ("Data Acquisition in progress...\n");

   SFRPAGE = DMA0_PAGE;                   // Switch to DMA0 Page

   while (!(DMA0CN & 0x40));              // Wait for DMA to obtain and move ADC samples
                                          // by polling DMA0INT bit.

   SFRPAGE = LEGACY_PAGE;
   printf ("Data Acquisition complete.\nPress P3.7 button when ready to receive file.\n");

   while (BUTTON != 0);                   // Wait for user to press P3.7 on the TB.

   SendData();                            // Send data via the UART0.

   while(1);                              // Done.

}
//// PORT_Init
////
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
char old_SFRPAGE = SFRPAGE;

   SFRPAGE = CONFIG_PAGE;              // Switch to configuration page


   XBR0    = 0x04;                     // Enable UART0 on crossbar
   XBR1    = 0x00;
   XBR2    = 0x40;                     // Enable crossbar and weak pull-ups
   P0MDOUT |= 0xFF;                    // enable Port0 outputs as push-pull

   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}

//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
void UART0_Init (void)
{
char old_SFRPAGE = SFRPAGE;

   SFRPAGE = UART0_PAGE;               // Switch to UART0 page

   SCON0   = 0x50;                     // SCON: mode 1, 8-bit UART, enable RX
   SSTA0 = 0x10;                       // Timer 1 generates UART0 baud rate and
                                       // UART0 baud rate divide by two disabled

   SFRPAGE = TIMER01_PAGE;             // Switch to Timer 0/1 page

   TMOD   = 0x20;                      // TMOD: timer 1, mode 2, 8-bit reload
   TH1    = -(SYSCLK/BAUDRATE/16);     // set Timer1 reload value for baudrate
   TR1    = 1;                         // start Timer1
   CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
   PCON  |= 0x80;                      // SMOD = 1

   SFRPAGE = UART0_PAGE;               // Switch to UART0 page

   TI0    = 1;                         // Indicate TX ready

   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE

}

//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
   char old_SFRPAGE = SFRPAGE;
   int i;                                 

   SFRPAGE = CONFIG_PAGE;              // Switch to Configuration Page

   OSCXCN = 0x67;                      // start external oscillator with
                                       // 22.1184MHz crystal on TB

   for (i=0; i <5000; i++) ;           // XTLVLD blanking interval (>1ms)

   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle

   RSTSRC = 0x04;                      // enable missing clock detector reset

   CLKSEL = 0x01;                      // change to external crystal

   OSCICN = 0x00;                      // disable internal oscillator



   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}

TOP

//-----------------------------------------------------------------------------
// ADC0_Init
//-----------------------------------------------------------------------------
void ADC0_Init (void)
{
   char old_SFRPAGE = SFRPAGE;
   int i;

   SFRPAGE = ADC0_PAGE;                // Switch to ADC0 Page

   ADC0CN = 0x44;                      // ADC Disabled, Timer3 start-of-conversion
                                       // track 16 SAR clocks before data conversion
                                       // upon Timer3 OV.  DMA will enable ADC as needed
                                       //

   REF0CN = 0x03;                      // turn on bias generator and internal reference.

   for(i=0;i<10000;i++);               // Wait for Vref to settle (large cap used on target board)

   AMX0SL = 0x00;                      // Single-ended mode

   ADC0CF = (SYSCLK/25000000) << 4;    // Select SAR clock frequency =~ 25MHz

   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}



//-----------------------------------------------------------------------------
// DMA0_Init
//-----------------------------------------------------------------------------
void DMA0_Init (void)
{
   char old_SFRPAGE = SFRPAGE;

   SFRPAGE = DMA0_PAGE;                // Switch to DMA0 Page

   DMA0CN = 0x00;                      // Disable DMA interface

   DMA0DA = XRAM_START_ADD;            // Starting Point for XRAM addressing

   DMA0CT = NUM_SAMPLES;               // Get NUM_SAMPLES samples

   DMA0IPT = 0x00;                     // Start writing at location 0

   // Push instructions onto stack in order they will be executed
   DMA0IDT = DMA0_GET_ADC0;            // DMA to move ADC0 data.
   DMA0IDT = DMA0_END_OF_OP;

   DMA0BND = 0x00;                     // Begin instruction executions at address 0
   DMA0CN = 0xA0;                      // Mode 1 Operations, Begin Executing DMA Ops
                                       // (which will start ADC0)

   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}

//------------------------------------------------------------------------------------
// Timer3_Init
//------------------------------------------------------------------------------------
//
// Configure Timer3 to auto-reload and generate ADC sample rate
// specified by <counts> using SYSCLK as its time base.
//
void Timer3_Init (int counts)
{
   char old_SFRPAGE = SFRPAGE;

   SFRPAGE = TMR3_PAGE;                // Switch to Timer 3 page

   TMR3CN = 0x00;                      // Stop Timer3; Clear TF3;
   TMR3CF = 0x08;                      // use SYSCLK as timebase
   RCAP3   = -counts;                  // Init reload values
   TMR3    = 0xffff;                   // set to reload immediately
   TR3 = 1;                            // start Timer3

   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}

//-----------------------------------------------------------------------------
// EMIF_Init
//-----------------------------------------------------------------------------
//
// Configure the external memory interface to use upper port pins in
// non-multiplexed mode to a mixed on-chip/off-chip configuration without
// Bank Select.
//
void EMIF_Init (void)
{
   char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page

   SFRPAGE = EMI0_PAGE;                // Save SFR_PAGE
   EMI0CF = 0x3C;                      // upper ports; non-muxed mode;
                                       // split mode w/o bank select
   EMI0TC = 0x45;                      // timing (7-cycle MOVX)

   SFRPAGE = CONFIG_PAGE;
   P4MDOUT |= 0xFF;                    // all EMIF pins configured as
   P5MDOUT |= 0xFF;                    // push-pull
   P6MDOUT |= 0xFF;
   P7MDOUT |= 0xFF;

   SFRPAGE = SFRPAGE_SAVE;             // restore SFR_PAGE
}

//-----------------------------------------------------------------------------
// SendData
//-----------------------------------------------------------------------------
//
//Send data out UART0
//
void SendData(void)
{
   unsigned int i;
   char old_SFRPAGE = SFRPAGE;
   SFRPAGE = UART0_PAGE;               // Switch to UART0 page

   read_ptr = XRAM_START_ADD;          // Set pointer to beginning of data

   for (i=0;i<NUM_SAMPLES;i++)
   {
   printf ("%u\n",*read_ptr);          // Send data as unsigned integers
   read_ptr++;
   }
   SFRPAGE = old_SFRPAGE;
}//End

TOP

程式註解已經很清楚了~ 或許您可以指出詳細位置會更好

TOP

我想了解16位元的主要意義 因為我是初學者
不太了解上面註解的涵義  請問我該從哪開始著手呢?

TOP

您說的16位元應該是指adc=16bit吧
這意思是說 ad轉換出來後的數位資料有16bit

這個範例程式 大致說明
adc轉換完畢後會直接儲存到記憶體中(DMA) , 這樣就不用在寫程式去搬移ad資料到記憶體中暫存
之後會再透過uart將資料傳送到pc端顯示~
大約是這樣~

您可以參考datasheet的dma說明還有uart的功能與adc的功能

TOP

發新話題