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

I need help setting up MCP41100 digital potentiometer.

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



Joined: 08 Sep 2003
Posts: 492
Location: India

View user's profile Send private message Send e-mail

I need help setting up MCP41100 digital potentiometer.
PostPosted: Wed Nov 14, 2007 6:00 am     Reply with quote

Hi all,

mcu: 16F628
PCM: 3.224

Iam trying to get the MCP41100 digital pot to work. I am using my own driver codes for this..

Code:


#define SPI_SCK  pin_a3
#define SPI_DOUT pin_a5
#define SPI_DIN  pin_b0

#define MCP3208_CS pin_b3
#define MCP4822_CS pin_b4
#define MCP41100_CS pin_b5

void dpot_init()
{
   output_high(MCP41100_CS);
}


void setup_dpot_write()
{

   output_low(SPI_SCK);
   output_low(MCP41100_CS);
   output_low(SPI_SCK);
   output_high(SPI_DIN);
   delay_ms(2);

}

void dpot_data_out(int16 data_byte)
{

   int i;

   for (i=0;i<=15;i++)
   {
      if (bit_test(data_byte,i)==1)
         output_high(SPI_DIN);
      else
         output_low(SPI_DIN);

      output_high(SPI_SCK);
      delay_ms(8);

      output_low(SPI_SCK);
      delay_ms(8);
   }

   delay_ms(8);
   output_high(MCP41100_CS);
   delay_ms(8);

}

void dpot_output(int command,int pot,int pot_data)
{
   int i,b;
   int16 dpot_word;

   setup_dpot_write();

   dpot_word=0;

   if (command!=0)
   {
      bit_clear(dpot_word,0);               //Don't care
      bit_clear(dpot_word,1);               //Don't care

      if (bit_test(command,1)==1)
         bit_set(dpot_word,2);
      else
         bit_clear(dpot_word,2);
      
      
      if (bit_test(command,0)==1)
         bit_set(dpot_word,3);
      else
         bit_clear(dpot_word,3);


      bit_clear(dpot_word,4);               //Don't care
      bit_clear(dpot_word,5);               //Don't care

      if (bit_test(pot,1)==1)               //Don't care for MCP41XXX devices
         bit_set(dpot_word,6);
      else
         bit_clear(dpot_word,6);
      
      
      if (bit_test(pot,0)==1)               //Don't care for MCP41XXX devices
         bit_set(dpot_word,7);
      else
         bit_clear(dpot_word,7);

      b=15;
      for (i=8;i<=15;i++)
      {
         if (bit_test(pot_data,b-8)==1)
            bit_set(dpot_word,i);
         else
            bit_clear(dpot_word,i);
         b--;
      }

      dpot_data_out(dpot_word);
   }

}



I use the following code sequence.

Code:


dpot_init();  //This is done when mcu is started (initialised)
dpot_output(1,2,51);  ///Should set 20K (format: command,pot no,pot value)



As it can be seen in the define , I am using a DAC MCP4822 and an ADC MCP3208 all these devices (including the digital pot) are in the same SPI bus.

Except for the digital pot all the other devices work well.

Kindly help....

thanks
arunb
Ttelmah
Guest







PostPosted: Wed Nov 14, 2007 6:52 am     Reply with quote

First a couple of comments. Smile
Where I used to work, you would be fired on a project, if you 'named' a variable, that was 16bit, with a name including 'byte'. If you are writing code where the functions are a lot larger and more complex, and which may need maintenance by other people latter, it is vital that you don't give wrong cluse like this!...
Second, you have added some huge delays. The chip deals in times of tens of nSec. mSec, are a bit OTT!. Presumably this was done as part of the debugging, but the 'silly' thing is that the one place where a delay might be needed, is the one place you haven't got one!. The chip samples on the rising edge of the clock pulse, so it is worth ensuring that once the data bit is output, it is stable before raising this edge.
Third comment, you talk about having other devices on the same SPI bus. You are presumably not connecting the DOUT pin on this chip?. Unlike some chips, this one does not tri-state the output, when not selected.

Now for the reason it doesn't work. What _order_ are the bits meant to be sent to this chip?. What order are you sending them?.

Best Wishes
arunb



Joined: 08 Sep 2003
Posts: 492
Location: India

View user's profile Send private message Send e-mail

RE
PostPosted: Wed Nov 14, 2007 9:49 am     Reply with quote

Hi,

Thank you for the comments, they are indeed useful.

You are quite right about the delay routine being not in the right place. I did not notice this until now.

I used the following settings.....(after initializing the device using dpot_init() ).

dpot_output(1,2,1)

Using the MPLAB simulator I got a value of 0x8048 in the dpot_word variable (used in dpot_output() function).

The contents of dpot_word are outputted bit 0 first...bit15 is the last bit to be outputted. (See dpot_data_out() function).

Hope this was helpful.

thanks
arunb
Ttelmah
Guest







PostPosted: Wed Nov 14, 2007 10:58 am     Reply with quote

Yes, and what order does the 41100 expect to see the bits?.
It expects the data MSB first. You are outputting the word LSB first.
Code:

void dpot_data_out(int16 data_byte) {
   int i=15;
   //Why fiddle around dropping CS in another function?.
   output_low(MCP41100_CS);
   do   {
      if (bit_test(data_byte,i)==1)
         output_high(SPI_DIN);
      else
         output_low(SPI_DIN);
      delay_cycles(1);
      output_high(SPI_SCK);
      delay_cycles(1);
      output_low(SPI_SCK);
   } while (i--)

   delay_cycles;
   output_high(MCP41100_CS);
}

void dpot_output(int command,int pot,int pot_data) {
   int i,b;
   int16 dpot_word;

   dpot_word=command*4096;
   dpot_word!=pot*256;
   dpot.word!=pot_data;
   dpot_data_out(dpot_word);
}


Best Wishes
arunb



Joined: 08 Sep 2003
Posts: 492
Location: India

View user's profile Send private message Send e-mail

RE:
PostPosted: Wed Nov 14, 2007 10:32 pm     Reply with quote

I finally got the device working.

After examining the data sheet for the MCP41XXX closely I found that only the P1 bit of the command word was don't care for the MCP41XXX device. I assumed (my mistake ) that both the bits P1 and P0 were don't care.

I believed that the MCP41XXX being a single pot device, did not require the pot. selection bits.

Thank you for the help.

thanks
arunb
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