seri adc

Başlatan thelastares, 15 Ağustos 2006, 11:11:50

thelastares

arkadaşlar bana seri adc kullanımı konusunda yardım edecek birileri varmı
kullanacağım adc 3202-c 12bit seri adc.
chip select 0
data in e de 1101 gönderdiğimiz zaman data outtan seri olarak 12 bit alıyoruz her clock palsinde.
data sheetinden anladığım kadarıyla böle.
ama bunu kod olarak nasıl yazacağımı bilemedim
16f877 kullanıyorum.
RC0 f877 ye göre data in
RC1 data out
RC2 entegreye giden clock
RC3  de cs olarak ayarladım.

buna göre bana yardımcı olacak birileri varsa lütfen yardımlarınızı bekliyorum.şimdiden çok teşekkür ederim.

(12 bit seri adc kullanmam yapacağım projede duyarlılığın fazla olması gerektiğindendir.)

bu arada şunu da sormak istiyorum seri bilgiyi paralel bilgiye dönüştürürken atıyorum bir x integerini 12 defa sola kaydırırsam(yukarıda yaptığım data in 1101 ayarıyla channel 0 seçiliyo ve msb en önce geleck şekilde gönderiliyo data)gelen bilgiyi o integere kaydetmiş olur muyum.ve bu binary olarak kaydırdığım bitler atıyorum


11011 se bu x e işlem yaparken ben bu sayıyı 27 olarak hesaplatabilirmiyim?kafam biraz karıştı saçmalıyo olabilirim kusura bakmayın

Logan

@thelastares,
Keşke entegrenin datasheetini bulabileceğimiz bir linkini atsaydın aramak zorunda kalmazdık.Ben daha önce seri haberleşme ile uğraştım fakat sadece data_out bacağı mevcuttu.Yani kullandığım entegreye config ayarı yapmam gerekmiyordu.Üzgünüm ama datasheeti incelemeye pek vaktim yok.Sadece göz ucu ile baktım.Yine de işine yarar diye yazdığım programı gönderiyorum.
Not:Datasheetin linki aşağıdadır.Göz atmak isteyenler buradan temin edebilirler.
http://rapidshare.de/files/29457342/adc.pdf.html

oku: 
low cs
 for i=0 to 15
 high sclock  :  pauseus 1
  data_reg.0=sdata  :  data_reg=data_reg<<1
   low sclock
   next i
    high cs  :  return


Burada kullandığım entegre, içinde 16 bitlik bir word barındırıyor.bu alt programdan çıktığı zaman data_reg isimli registere, entegre içindeki bilgiyi okuyup atmış oluyor.Umarım problemini çözersin.Kolay gelsin.
İmza.

thelastares

logan sağolasın ilgilendiğin için ama bu kouda bana biraz zaman ayırırsan çok sevinrim.ben çoğusu gibi sadece hazır kod isteyen biri değilim benim bunu bi şekilde anlamam lazım.o yüzden kafama takılan şeyleri sorabileceğim birini arıyorum.
yaptığım projenin çoğu bitti sadece gelen voltajın işlenmesi kaldı.
mesela ben bu entegrenin clockunu nasıl vereceğimi bilmiyorum.ayrıca shift operasyonu nasıl işe yarar.yani benim aklımda şu oluşuyo.
adc nin data outundan gelen bilgiyi bayrağa atıp her clok de bir sağa kaydırsak 12 adım sonunda 12 bitlik bi integer sayım olur benim zaten istediğim o gelen sayıydı yani iş otomatikmem halloluyo gibi gözküyo ama.
bu clocku elimle veremem herhalde.

clock=1;
data out=1;
clock=0;

gibi elle bişi olmasa gerek değil mi yazdığın kodu biraz daha açabilirsen sevinirim.

oyhan

CCS için yazılmış olan şöyle bir örnek var sanırım istifade edebilirsiniz bu koddan. Ayrıca MCP3204 ve 3208 için kod driver örnekleri ccs deki driver klasöründe mevcut. Kolay gelsin...

#include <16F877.h> 
#fuses XT,NOWDT,NOPROTECT,NOLVP 
#use delay(clock=4000000) 
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12 

#define CLK  PIN_B0 
#define Dout PIN_B1 
#define Din  PIN_B2 
#define CS   PIN_B3 


void ShiftOut (int data, int no_of_bit) 
{ 
   int i; 
   for(i=0 ; i<no_of_bit>>= 1; 
      output_high(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(CLK); 
      delay_us(50); 
      shift_left(&data,1,input(Dout)); 
      output_high(CLK); 
      delay_us(50); 
   } 
   return(data); 
} 

void main() 
{ 

   int  data_l; 
   long int data_h, value; 
   float result; 
   data_h=0; 
   data_l=0; 

   printf("\r****  Initializing of MCP3202 12 Bit A/D Converter ****\n "); 

   while(1) { 
      output_high(CS); 
      delay_us(1); 
      output_low(CS); 

      ShiftOut(0b00001100, 4); 

   data_h = read_adc_byte(9); 
   data_l = read_adc_byte(4); 
   output_high(CS); 
   value = (data_h << 4) | data_l; 
   result = value * 0.001226; 
      printf("\rOutput Voltage = %f V", result); 
      delay_ms(250); delay_ms(250); 
   } 
}
BİRLİKTEN KUVVET DOĞAR: