18f4550 ve mcp3422 adc uygulama i2c sorunu?

Başlatan ismailhtc, 14 Şubat 2014, 09:59:14

ismailhtc

Arkadaşlar şekilde ki devreyi kurdum. bir pt100 sıcaklık sensörünün omaj değerini 0-5 volta çevirdim. bunuda bir adc yardımıyla picte okuyup sıcaklık değerini ekranda göstermek istiyorum. kodlar aşağıda. i2c protokolü ile haberleşme yapılıyor. ama herhangi bir bilgi aktarımı yapamadım. sorunun kodlardan kaynaklanıyor büyük ihtimal. yine bu sitedeki kodlardan yararlandım ama sorunu çözemedim. hatamın nerede kaynaklandığına yardımcı olabilirseniz çok sevinirim.
[IMG]http://imagizer.imageshack.us/v2/1600x1200q90/513/xo79.jpg[/img]
bir opam devresi ile 1mA sabit akım ürettp bunu pt100 sıcaklık sensörüne veriyorum. pt100 uçlarında oluşan gerilim değerinide başka bir opamla yükseltip 0-5 volta ayarlıyorum. onuda mcp3422 adc entegresiyle seri iletişim yaparak pice aktarıyorum. picden de lcd ekranda sıcaklık olarak göstermek istiyorum.
#include <18f4550.h>
#device adc=16 
#fuses HSPLL,USBDIV,PLL5,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOMCLR
#use delay(INTERNAL=8MHZ)

#USE I2C( MASTER,SCL=PIN_C5 , SDA=PIN_C4,slow) 

#define DAL_SCL PIN_C5 
#define DAL_SDA PIN_C4 
#include <LCD.c> 

#define _ACK   0
#define _NOACK 1
   int8 Ack; 
   char byte0=0 , byte1=0 , byte2=0, conf; 
   int32 adc_in   =  0; 
   float Volts    =  0.0;  
void main( void ) 
{ 
   setup_psp(PSP_DISABLED); 
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_32);
   setup_timer_1(T1_DISABLED);  
   setup_timer_2(T2_DISABLED,0,1);  
   setup_adc_ports(NO_ANALOGS);    
   setup_adc(ADC_OFF); 
   setup_CCP1(CCP_OFF); 
   setup_CCP2(CCP_OFF); 

   lcd_init();    
   // 
     printf( lcd_putc , "\f %LX"  , adc_in );
   output_float(DAL_SDA); 
   output_float(DAL_SCL);   
   i2c_start();   
   Ack = i2c_write(0b11010000 ); // Yazma modu
   Ack = i2c_write(0b00011100 ); // Sürekli çevirme - 18bit - PGA = 1V/V
   i2c_stop(); 
   delay_ms(100);
      
   while(True) 
   {       
       i2c_start();         
      Ack = i2c_write(0b11010001); // MCP3421   adresini yolla    
       // 
      byte0 = i2c_read( 1 );           // birinci baytı oku ve ACK yolla
      byte1 = i2c_read( 1 );           // ikinci baytı oku ve ACK yolla
      byte2 = i2c_read( 0 );           // üçüncü baytı oku ve ACK yollama
       i2c_stop(); 
      byte0 &= 0b00000011; 
      adc_in = byte0; 
      adc_in <<= 8; 
      adc_in += byte1; 
      adc_in <<= 8; 
      adc_in += byte2; 
            
      printf( lcd_putc , "\f %LX"  , adc_in );     
      Volts = (float)adc_in * 0.015625; // 18 bits ADC 
      printf( lcd_putc ,  "\nmV=%0.3f      " , Volts ); 
      delay_ms( 500 ); 
   } 
}

madpic

Programa bakmadım ama I2C uçlarına 10K pulup dirençleri eklemen gerekiyor.

sadogan

18 bit ve içerisinda PGA si olan  adc ile ölçüm yaparken opamp la yükselmeye gerek yok.
Proteusta PDS_Test.DSN i referans alarak devrenizi yeniden gözden geçirmenizde fayda var.
Basic te yazılmış koduda var similasyon oldukca güzel.

ismailhtc

yorumlarınız için teşekkür ederim. dediklerini uygulayıp deniyeceğim.