ADC problems with TI DSP280x

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From English to

Threaded View
In Example_280xAdcSeqModeTest.c for the TMS320F2808 DSP i wonder what the
following assembler command is for:

    asm(" RPT #11 || NOP");


In this source:

// TI File $Revision: /main/5 $
// Checkin $Date: September 15, 2005   10:50:57 $
//##########################################################################
#
//
// FILE:   Example_280xAdcSeqModeTest.c
//
// TITLE:  DSP280x ADC Seq Mode Test.
//
// ASSUMPTIONS:
//
//    This program requires the DSP280x header files.
//
//    Make sure the CPU clock speed is properly defined in
//    DSP280x_Examples.h before compiling this example.
//
//    Connect the signal to be converted to channel A0.
//
//    As supplied, this project is configured for "boot to SARAM"
//    operation.  The 280x Boot Mode table is shown below.
//    For information on configuring the boot mode of an eZdsp,
//    please refer to the documentation included with the eZdsp,
//
//       Boot      GPIO18     GPIO29    GPIO34
//       Mode      SPICLKA    SCITXDA
//                 SCITXB
//       -------------------------------------
//       Flash       1          1        1
//       SCI-A       1          1        0
//       SPI-A       1          0        1
//       I2C-A       1          0        0
//       ECAN-A      0          1        1
//       SARAM       0          1        0  <- "boot to SARAM"
//       OTP         0          0        1
//       I/0         0          0        0
//
//
// DESCRIPTION:
//
//    Channel A0 is converted forever and logged in a buffer (SampleTable)
//
//    Open a memory window to SampleTable to observe the buffer
//    RUN for a while and stop and see the table contents.
//
//       Watch Variables:
//          SampleTable - Log of converted values.
//
//##########################################################################
#
//
// Original source by: S.S.
//
// $TI Release: DSP280x V1.20 $
// $Release Date: September 19, 2005 $
//##########################################################################
#

#include "DSP280x_Device.h"     // DSP280x Headerfile Include File
#include "DSP280x_Examples.h"   // DSP280x Examples Include File

// ADC start parameters
#define ADC_MODCLK 0x4   // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*4)
= 12,5MHz
#define ADC_CKPS   0x1   // ADC module clock = HSPCLK/2*ADC_CKPS   =
12,5MHz/(1*2) = 6.25MHz
#define ADC_SHCLK  0xf   // S/H width in ADC module periods
= 16 ADC clocks
#define AVG        1000  // Average sample limit
#define ZOFFSET    0x00  // Average Zero offset
#define BUF_SIZE   2048  // Sample buffer size

// Global variable for this example
Uint16 SampleTable[BUF_SIZE];

main()
{
   Uint16 i;

// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP280x_SysCtrl.c file.
   InitSysCtrl();

// Specific clock setting for this example:
   EALLOW;
   SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
   EDIS;

// Step 2. Initialize GPIO:
// This example function is found in the DSP280x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();  // Skipped for this example

// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP280x_PieCtrl.c file.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP280x_DefaultIsr.c.
// This function is found in DSP280x_PieVect.c.
   InitPieVectTable();

// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP280x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
   InitAdc();  // For this example, init the ADC

// Specific ADC setup for this example:
   AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
   AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  Cascaded mode
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
   AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       // Setup continuous run


// Step 5. User specific code, enable interrupts:


// Clear SampleTable
   for (i=0; i<BUF_SIZE; i++)
   {
     SampleTable[i] = 0;
   }

   // Start SEQ1
   AdcRegs.ADCTRL2.all = 0x2000;

   // Take ADC data and log the in SampleTable array
   for(;;)
   {
     for (i=0; i<AVG; i++)
     {
        while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} // Wait for interrupt
        // Software wait = (HISPCP*2) * (ADCCLKPS*2) * (CPS+1) cycles
        //               = (3*2)      * (1*2)        * (0+1)   = 12 cycles
        asm(" RPT #11 || NOP");
<<------------------- here!!   :-/   why?
        AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
        SampleTable[i] =((AdcRegs.ADCRESULT0>>4) );
     }
   }
}

//==========================================================================
=
// No more.
//==========================================================================
=




And do you know of any more ADC examples for this DSP?

And isn't it possible to check SEQ1_BSY instead of INT_SEQ1?





Re: ADC problems with TI DSP280x
Op Mon, 21 Nov 2005 19:50:24 +0100 schreef Moppe:

Quoted text here. Click to load it

Perhaps RePeaT eleven times the No Operation Instruction ?

--
Coos

Re: ADC problems with TI DSP280x
Correct.  This is a typical delay loop that is commonly sprinkled
througout TI exmample code.

In this case, it has been calculated that it will take 12 cycles for
ADC cycle to complete.  So to keep things simple, the software is held
in a delay loop to ensure this happens.


Re: ADC problems with TI DSP280x
But won't the while-loop wait for the ADC to complete:



   while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} // Wait for interrupt



I don't se why it's necessary to wait (with NOP's) after the while-loop?


Quoted text here. Click to load it



Re: ADC problems with TI DSP280x
:-) Yes

I also figured it out after a while.

Quoted text here. Click to load it
the



Site Timeline