iki adet mcp 3208 ile bilgi okuma yardım

Başlatan salamon, 10 Temmuz 2015, 10:04:10

salamon

Merhabalar,

iki adet mcp3208 den analog bilgi almak istiyorum. tek mcp3208 üzerinden bilgi alabiliyorum ancak ikinci üzerinden bilgi alamıyorum.

kodları aşağıda belirttim, yardımlarınızı rica ederim.


#ifndef MCP3208_CS
#define VREF_A2   0x40
#define MCP3208_CLK  PIN_B0
#define MCP3208_DOUT PIN_B1
#define MCP3208_DIN  PIN_B2
#define MCP3208_CS   PIN_B3

#endif


void adc_init() {
   output_high(MCP3208_CS);
   setup_vref(VREF_LOW|12|VREF_A2);
}


void write_adc_byte(BYTE data_byte, BYTE number_of_bits) {
   BYTE i;

   delay_us(2);
   for(i=0; i<number_of_bits; ++i) {
      output_low(MCP3208_CLK);
      if((data_byte & 1)==0)
         output_low(MCP3208_DIN);
      else
         output_high(MCP3208_DIN);
      data_byte=data_byte>>1;
      delay_us(50);
      output_high(MCP3208_CLK);
      delay_us(50);
   }
}


BYTE read_adc_byte(BYTE number_of_bits) {
   BYTE i,data;

   data=0;
   for(i=0;i<number_of_bits;++i) {
      output_low(MCP3208_CLK);
      delay_us(50);
      shift_left(&data,1,input(MCP3208_DOUT));
      output_high(MCP3208_CLK);
      delay_us(50);
   }
   return(data);
}


long int read_analog_mcp(BYTE channel, BYTE mode) {
   int l;
   long int h;
   BYTE ctrl_bits;

   delay_us(200);

   if(mode!=0)
      mode=1;

   output_low(MCP3208_CLK);
   output_high(MCP3208_DIN);
   output_low(MCP3208_CS);

   if(channel==1)               // Change so MSB of channel #
      ctrl_bits=4;            //      is in LSB place
   else if(channel==3)
      ctrl_bits=6;
   else if(channel==4)
      ctrl_bits=1;
   else if(channel==6)
      ctrl_bits=3;
   else
      ctrl_bits=channel;

   ctrl_bits=ctrl_bits<<1;

   if(mode==1)                  // In single mode
      ctrl_bits |= 1;
   else                        // In differential mode
      ctrl_bits &= 0xfe;

   ctrl_bits=ctrl_bits<<1;      // Shift so LSB is start bit
   ctrl_bits |= 1;

   write_adc_byte( ctrl_bits, 7);   // Send the control bits

   h=read_adc_byte(8);
   l=read_adc_byte(4)<<4;

   output_high(MCP3208_CS);

   return((h<<8)|l);
}


long int read_analog( BYTE channel )   // Auto specifies single mode
{
   return read_analog_mcp( channel, 1);
}


void convert_to_volts( long int data, char volts[6]) {
   BYTE i, d, div_h, div_l;
   long int temp,div;

   div=0x3330;

   for(i=0;i<=4;i++) {
     temp=data/div;
     volts=(BYTE)temp+'0';
     if(i==0) {
       volts[1]='.';
       i++;
     }
     temp=div*(BYTE)temp;
     data=data-temp;
     div=div/10;
   }
   volts='\0';
}

ete

Data sheet birden fazla aletin nasıl bağlanacağı konusunda pek bilgi vermemiş.
Sen nasıl bir bağlantı yaptın acaba?. Şema verilmeyince anlamak zor tabiiki.
Şimdi farkli pinlere bağlanan iiki MCP yi Basic de çalıştırmak çok kolay. Ama C dilinde işlem fonksiyon ve hazır kütüphane ile hallediliyor.  Kütüphane de tek MCP ye uygun hazırlanmış. Bir ikincisi için ikinci bir fonksiyon kullanmak gerekir diye düşünüyorum. Ahkam kesmiş gibi olmayayım da tahminim bu yönde. Diğer bir yöntemde aletin Chip Select ucunu farklı pinlere vererek hangisini kullanacaksan onu aktif etmek şeklinde kullanım olabilir. Denemek lazım.

Ete

salamon

Ete Hocam Merhaba,

Chip Select ucunu farklı pinlere bağladım ve timer kesmesi ilede sayıcı yaparak farklı zamanlarda pin değişikliği yaptım. ancak bilgileri okuyamadım. iki veya daha fazla mcp için kütüphane dosyasını form aracılığı ile bulabilirmiyim? yoksa oturup kütüphane dosyasını kendim derleyeceğim. ekte bağlantı şeklinide ekliyorum. yardımlarınız için teşekkürler

ete

Kullandığın okuma fonksiyonu senin iki pinden kontrollü Chip Select kullanımına müsaade etmiyor.
Fonksiyon CHip select pinini kendi amacına uygun kullanıyor. Bence fonksiyonu tadil etmen gerek.
Yapabiliyorsan Kullanılan chip select pini okuma yapılırken seçilebilir olsun.

Forum aracılığı ile kütüphane bulman zor gibi gözüküyor. Kendi imkanların ile araştırman gerek.

Ete

coskunyildirim06

MCP3304 13 bit için iki  ayrı uç kullanarak diferansiyel modda 13 biti veriyor.Ben ccs c ile mcp3208 12 bit olarak ölçüm yapabiliyorum.Mcp3304 bize iki ayrı kanaldan -4095 ile +4095 arasında değer veriyormuş. Mcp3208 de farklı olarak sign biti olduğunu biliyorum.referans voltajını 2.5 volt verdim.CH1 e 2,5 volt sabit ve CH0 a pot bağlayarak 5 volt verdim ve MCP3208 in kütüphanesiyle CH0 ve CH1 in değerlerini ayrı ayrı okuyarak CH0 a bağladığım pot ile 5 voltu artırıp çoğalttım.Hyper terminalde CH0 ve CH1 in değerleri birbirine zıt oranda aynı farkta değişmekte ve iki ayrı kanalın farkını aldığımda gerçekten 13 bit değerini veriyor.Benim sizden istediğim 0 ile 8192 arasında nasıl okuma yapabilrim.Kütüphanede nasıl bir değişiklik yapmalıyım. Lütfen bilgili abilerimiz yardımcı olsun.Çok uğraştım ancak işin içinden çıkamadım.En azından bir yol gösterecek.

Powered by EzPortal