CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

external adc problem

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
baghrir



Joined: 28 Dec 2004
Posts: 2

View user's profile Send private message

external adc problem
PostPosted: Sun Apr 24, 2005 4:37 am     Reply with quote

Hello,
I want to use a PIC16F877 with an external adc (ADC700) using the PSP mode. I don't know how to use this device. do the microcontroller start the conversion automatically at the PSP interrupt, or I must do it by programming. My English is very bad, but.... Thank you very much.
jecottrell



Joined: 16 Jan 2005
Posts: 559
Location: Tucson, AZ

View user's profile Send private message

PostPosted: Sun Apr 24, 2005 8:19 am     Reply with quote

1. I assume your difficulty with the ADC700 is understanding the English in the data sheet?

2. I also assume that you are using the ADC700 for some of its special features and no other device meets your needs? (Maybe an I2C or some other part that already has a CCS driver written?) Have you checked on the availability, it appears that it may be hard to find?

First quick reading of the data sheet indicates that you will need to write a driver for it.
Quote:

A conversion is started by asserting CS and WR Low.


The datasheet appears to be pretty clear about the requirements. You should find someone that can help you with the translation to your native language.

Good Luck
bfemmel



Joined: 18 Jul 2004
Posts: 40
Location: San Carlos, CA.

View user's profile Send private message Visit poster's website

ADC Setup
PostPosted: Tue Apr 26, 2005 11:40 am     Reply with quote

baghrir,

The very fancy ADC you are using has a serial output on it so you could try to use that instead of the PSP port but if not here is a method I have used for parallel interfacing.

I just attach the ADC output bits to a port on the PIC. I am using an 18F6520 and I selected port F but you can use anything you want. then you need to use three other pins to control the ADC, one is to get the ADC to start a conversion, one to sense the conversion is done and one to select either high or low byte. See the code below as to how I control the chip. I use an LTC1605 which may operate somwhat differently than your ADC700 but you'll get the idea and be able to adapt the routine.

This particular algorithim is for oversampling. Usually we look at anywhere between 16 and 64 consecutive samples to filter out gaussian noise but the same routine will work for one ample. The routine is passed the number of samples to send back so the return value is a signed 32 bit integer as it will contain the sum of multiple 16 bit values.

Please note the disabling of global interrupts around the conversion start output commands. This is because many ADC converters will throw fits if you hold that line down too long and then give you bogus readings so it is important that you not get interrupted in that short time it takes to toggle the bit.

Code:

#device PIC18F6520

#define ADC_BUSY  PIN_B0      // pin on ADC that shows conversion is complete
#define ADC_BYTE  PIN_E7      // pin on ADC that selects high or low byte.
#define ADC_RC    PIN_C2      // pin on ADC to start conversion
#define ADC_PORT input_f()    // port hooks to 8 bit wide data on ADC


signed int32 GetADC32(unsigned int8 n_samples) {
   unsigned int8 i;              // loop counter
   unsigned int8 ADC_LSB;        // lower byte of reading
   unsigned int8 ADC_MSB;        // upper byte of reading
   signed int32 sumValue;        // sum of all the readings taken in one pass of the GetADC32 routine.

   disable_interrupts(global);               // Disable interrupts so that the R/C is not low for an extended time
   output_low(ADC_RC);                       // Start conversion before anything else to use the setup time
   output_high (ADC_RC);                     // Toggling the bit starts the external A to D
   enable_interrupts(global);                // Turn interrupts back on after R/C is raised

   sumValue = 0;                             // Clear the sumValue

   for (i=0; i < n_samples; i++) {           // Take as many samples as calling routine requested

      while (!input(ADC_BUSY));              // Wait while conversion is in progress (max 8uS)
                                             // Since PIC is reading with an 8 bit bus we need to shift the data
      output_low(ADC_BYTE);                  // to read both bytes, so start by putting low byte in place to read
      ADC_LSB = ADC_PORT;                    // Read low byte
      output_high (ADC_BYTE);                // Put high byte in place to read
      ADC_MSB = ADC_PORT;                    // Read High byte

      disable_interrupts(global);            // Disable interrupts so that the R/C is not low for an extended time
      output_low(ADC_RC);                    // Start conversion before anything else to use the setup time
      output_high (ADC_RC);                  // Toggling the bit starts the external A to D
      enable_interrupts(global);             // Turn interrupts back on after R/C is raised

      sumValue += (signed int32) ( (signed int16) MAKE16(ADC_MSB,ADC_LSB) );  // Add the recent value to the sum
   }  /* end for loop */

   return(sumValue);                         // return the sum of values

}  /* end of GetADC() */


Good Luck

- Bruce
baghrir



Joined: 28 Dec 2004
Posts: 2

View user's profile Send private message

PostPosted: Fri Sep 23, 2005 11:28 am     Reply with quote

Good day to all members,
I'm sory, I did a long time to reply
Thank you very much for your help
Regard
Baghrir
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group