MCP3004 veya MCP3008 sürmek

Başlatan ugurtarlaci, 04 Şubat 2009, 17:59:03

ugurtarlaci

Arkadaşlar merhaba ;

MCP3004 10 bit SPI ADC ile uğraşıyorum. MCP3208 ler ile bir sorun yaşamamıştım ancak bu alet nedense bir türlü çalışmıyor. Bu aletleri daha önce kullanmış arkadaşlar varmıdır acaba. Mümkünse C olarak bir kütüphane üzerinden açıklama yapılırsa veya çalışan bir kütüphane  gösterilirse sevinirim.

Herkese  iyi çalışmalar...
Zoru Başarırım , İmkansız Biraz Zaman Alır....İmza... YENİ NESİL GENÇ TÜRK MÜHENDİSLERİ......

parda

Merhaba;

Aynı devrede 2 adet MCP3201 denedim(2 kanal için). Kodlar çalışmıştı lakin ADC yi değiştirdiğim için sadeleştirme vs. yapamadım. Kod AVR için
Doğrudan işinize yaramasada spi için fikir verebilir. (soft spi)

Adc.h Dosyası
#include <avr/io.h>
#include <util/delay.h>

void InitAdc(void);
uint16_t ReadAdc(uint16_t cCh);


adc.c dosyası
#include "Adc.h"

#define SetClk 		PORTC |= _BV(0)
#define RstClk 		PORTC &= ~_BV(0)
//#define ReadDt 		bit_is_set(PINB,6)
#define EnableAdc0	PORTC &= ~_BV(2)
#define DisableAdc0	PORTC |= _BV(2)
#define EnableAdc1	PORTC &= ~_BV(3)
#define DisableAdc1	PORTC |= _BV(3)

uint8_t ReadBit(void);

void InitAdc(void)
{
	PORTC |= _BV(1);
	DDRC &= ~_BV(1);//PullUp aktif data pin input
	DDRC |= _BV(0);//clk output
	DDRC |= _BV(2);//CS0 output
	DDRC |= _BV(3);//CS1 output
	DisableAdc0;
	DisableAdc1;
	RstClk;
}

uint8_t ReadBit(void)
{
	uint8_t cTmp;
	SetClk;
	_delay_us(10);
	if(bit_is_set(PINC,1))
		cTmp = 1;
	else
		cTmp = 0;
	_delay_us(10);	
	RstClk;
	_delay_us(20);
	return(cTmp);
}
uint16_t ReadAdc(uint16_t cCh)
{
	uint8_t bBit,cI;
	uint16_t nAdcVal=0;
	if(cCh)
		EnableAdc1;
	else	
		EnableAdc0;
	bBit = ReadBit();//anlamsız bit
	bBit = ReadBit();//anlamsız bit
	bBit = ReadBit();//0 olmali 
	for(cI=0;cI<12;cI++)
	{
		nAdcVal <<= 1;
		nAdcVal |= ReadBit();
	}
	DisableAdc0;
	DisableAdc1;
	return(nAdcVal);
	
}
Bildiğim tek şey, hiç bir şey bilmediğimdir.

ugurtarlaci

Sanırım çözdüm. İlginiz için teşekkür ....
Zoru Başarırım , İmkansız Biraz Zaman Alır....İmza... YENİ NESİL GENÇ TÜRK MÜHENDİSLERİ......

okantex

Merhabalar ,

Abiler  ben  picbasic ile 3201 i kontrol etmek istiyorum.
ama kafamda sorular var , ,

pic olarak 16f876A  kulllanmak istiyorum ve harici 20mhz kristal  kullancam.
haliyle Fosc um 20/4 =5mhz  olacak,
MCP3201 i de  1Mhz  frekansta calıstırmak istiyorum ,
bunu nasil yaparım? datasheet i ne baktim farkli secimler var ama orada Fosc /4 , Fosc/8 , Fosc/32 gibi degerlerde kastedilen  Fosc  benim hessaptaki 20 mhz mi yoksa 5 mhz mi seciliyor.

birde pic basic de SPI protokolu MCP3201  nasil olacak?
nerelerde nasil tanimlama yapmam gerekiyor?
gerek ete hocanin notlarina , gerekse yabanci forumlara baktim picbasic de detayli bir uygulamali anlatim bulamadim.

yardimci olabilirseniz veya yonlendiriseniz sevinirim.
saygilar
Okan

hasangurlek

Arkadaşlar niçin MCU ADC özelliğini kullanmıyorsunuz ? Bahsettiğiniz ADC ler ucuz değildir. Kullandığınız MCU üzerine ADC parasını ekleyin 18F serisi yüksek hızlı PIC kullanın. Tabiki kullandığınız MCU 'in ADC özelliği yeterli değilse veya PIC MCU'lerde 10 bit yeterli gelmiyorsa ve 32xx ve 33xx ADC leri 12 veya 13 bit çözünürlüğe sahip olduğu için kullanıyorsanız birşey diyemem.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

okantex

Evet hocam , derdim 12 bit olmasi ve daha da onemlisi ornekleme suresinin daha kucuk olması.

okantex

MErhablar ,
Oncelike ilginiz icin hepinize teşekkür ederim ,

FxDev  hocam ,  
abi ben 16f876A kullanıyorum , sen 16f877 kullanmıssın ,tamam ,bunda sorun yok. ADC  olarakta 3201 ama bu da sorun olmaz.
ama anlamadigim  harici ADC yi kontrol ederken  seri iletisimde olmasi gereken  ve MCU tarfindan saglanmasi gereken  SCK    clock sinyali ni sen    RB0/int  ten nasil verdin onu anlamadim.
SCK pini olan   RC3 ten  cıkıs yapman   gerekmiyor mu idi
yani pinler soyle olması gerekmiyor mu idi
mcp nin   CLK  pini   16f877 nin  SCK  si RC3 e
mcp nin   DOUT  pini   16f877 nin  SDI  si RC4 e
mcp nin   CS/SHDN  pini   16f877 nin  herhangi bir cikis pinine


birde siz   SCK  yi kullanmadiginizdan  onun degerinin register olarak belirlenmesi nasil yapilacak onu goremiyorum.

ben 16f876a  da 20mhz  kristal kullanmak istiyorum ,
Fosc=20    ,  SCK da  Fosc/16 olsun istiyorum
yani islemci  Fosc/4 hizda cycle 'la  komut atarken  ,SCK hizi farkli olacak.
neden Fosc /16 sorunsunun cevabida kullanmak istedigim MCP nin calisma frekansini yakalayabilecek  iki degerden biri 16 olması ,clock frequency MCP icin 0,8-1,6MHZ olmasi gerekiyor.

birde   16f876A  SPI da  8bit olarak yaziyormus.
bu durumda 12 biti tek bir degiskene nasil atayabiliyor?
iki degiskene okumak gerekmiyor mu , ve okunan degerde 0.bit aslinda 2.bitin tekrari oluyor ,bunun  yazılımla silinmesi gerekmiyor mu?

birde ufak bi sorunum var  picbasic biliyourm , sizin dilinizi anlamamakta zorlaniyorum.

okantex

Merhabalar FxDev  Hocam ,

oncelikle yanlis birsey soyleyerek sizi kizdirdi isem ozur dilerim ,

siz sanirim beni kendiniz gibi profesyonel bir elektronikci sandiniz , abi yazılımda da elektronikte de amatorum , hobi olarak ilgileniyorum ,
ogrenmeye calisiyorum ,

sizin yardim sekliniz hazir balik vermek seklinde oldu ,anlayamadim ,yiyemedim,  lutfen bana balık tutmayi ogretin.

datasheeti iki sefer  gozden gecirdim , ama  amator olmamdan kaynakli nereye bakmam gerektigini bilmiyorum ,
basic i de ETE Hocamin internette  yayilmis olan ders notlarindan ogrendigm kadariyla yapabiliyorum.

Sizin  SPI  protokolunu kullanmadan  MCP yi kontrol etmeniz gercekten harika birsey , nasil yaptıgınızi hala anlamis değilim
MCP deki  veri alisverisine baktigimda SPI ile haberlestigi yazili idi , Hemen SPI  ogrenmeye calistim  ,notlara baktim , ayni anda 3 telden haberlesme vardi,  programlamada ayni anda 3 islem nasil olur hala anlamısta değilim , onun icin sizin bunu nasil yaptıgınız cok merak ediyorum.

Şimdi soruna şöyle cevap vereyim. Datasheet'i incelediysen iletişim şu şekilde başlıyor;

5 bit : Start-SGL/DIF-D2,D1,D0 gönderiliyor
2 bit : Bir bit çevrim, bir bit ise 0 okunuyor
12 bit: Bilgi
--------
19 bit yapıyor. (I)

bu hesabi nasil yaptınız , 5 bit  diye olan satirinizdaki  seyleri ilk defa goruyorum , ne pic in nede mcp nin datasheetinde  boyle birsey gormedim.

SPI 8 bit gönderim yapılıyor, datasheette çeşitli şekillerde nasıl okuma yapılacağı gösterilmiş. O kısmı iyice incelemen gerekiyor... (II)
datasheetlerde SPI harii bir iletisim sekli goremedim ,nereye bakmam gerekiyor ?

5V'ta en fazla 2Mhz ile çalışabildiğini göz önünde bulundurmalısın. Dolayısı ile 20Mhz/16 veya 20Mhz/64 kullanmalısın.(III)
abi mcp de 0,8-1,6 Mhhz arasi calisir diye bir ozellik gormustum ,onun icin sizin gibi dusunerek 20/16  ile yapmak istiyorum. bunu  yazılım yaparken tanimlarda  islemciye bildirmem gerekmiyor mu? , siz bunu nerde yaptınız ,bunu nasıl yaptıgınıza dair komut goremiyorum.

abi , sunu tekrar belirteyim  ben C olarak yazdıgınız  metine mana veremiyorum , yanlis anlasilmasin anlayamiyorum.sadece bakiyorum ,

ne diyecegimi bilemiyorum.

yardimlarin icin cok  cok teşekkürler.

okantex

Abi ,
bu grafikler bendeki datasheetlerdekilerden biraz farkli ,
sadece 3. ayni

abi bana birkac gun musade ,,ben bu arada biraz daha ders calisayim,
saygilar

okantex

Fxdev  Hocam ,

sizin son yolladıgınız resimdeki 6.1 tablosundaki  , dizini  picbasic te araya asm kodu yazarak olusturmaya calisiyorum
sspbuf  lardan   iki seferde  adc sonucunu aliyourm, yani elimde iki tane 8 bit ten olusan sayi ver , bunlari yanyana getirebilirsem  12 bitlik sayi dizisini elde ediicem,  ama bir turlu birlestiremedim,
yani    aaaa aaaa   ve  bbbb bbbb
seklindeki iki sayiyi nasil yan yana getirip 16 bit yaparım
aaaa aaaa bbbb bbbb veya bbbb bbbb aaaa aaaa gibi bir sayi olusturmak istiyorum

saygilar

KAZIMUGUR

SAYI var word
A1 var byte
A2 var byte

SAYI.LOWBYTE = A1
SAYI.HIGHBYTE = A2   :roll:

Bunu ccs benzer kolaylıkda yapıyor.

İşte derleyiciler ve dil farkları-tercihleri böyle durumlarda önem kazanıyor.
Bu tip sorunlarla karşılaşılacağını öngören programcılar işi kolaylaştırmış ve bazı hazır komutlar yapmışlar derleyicileri için.
Bazıları da demiş ki , bilmiyorsan kurcalama böyle şeyleri oyuncak değil, biliyorsan ne yaparsan yap bana ne demiş.

Yeni başlayan , alt yapısı olmayan , ya da işi zaten bu olmayan kişiler için asm-basic-c tartışmaları her zaman kafa karıştırıyor.
Bu kimseler için en iyisi basic.
Bir şeyler yapıp keyif alırken picleri öğrenmiş oluyorlar.
Hem yazım kuralları hem donanım özellikleri  hele de yabancı dil yoksa çok zor ve zaman kaybı.
Tabii birde PBP da @ETE gibi bir fenomen varken.  :)

------------
Bir diğer değerlendirme , forum sayfaları bilgilenmek için en iyi yoldur .

picusta

Evrensel dil olan matematik ile ifade edersek, derleyicilerin dil farklari ile ugrasmaya gerek kalmaz. Formül ayni, degisken tanimlamasi ve sondaki nokta-virgül hariç her dilde asagi yukari ayni yazilir.
Basic'e yapilan elestirilerden en önemliside bu: olan kisayollar yüzünden programci altta ne olup bittiginden bi haber.
Uzun sözün kisasi, asagidaki gibi yazmak en güzeli, eninde sonunda derleyici bunu yapar :
SAYI = A1 +  A2 * 256

256 ile çarpmanin bitleri 8 kere shift etmekle ayni oldugunu unutmamak tabii.

okantex

Herkese teşekkürler,
kazim abinin onerdigi sekil yapmayi deniyecem.

okantex

Merhabalar,


pic basic de
adc_result var word tanimi karsiliaginda   pic icinde   bank yerlesimini
ASM de tanimi nedir?
aslinda tam ifade de edemiyorum.

adc_result  var word
un ASM de  karsiligi

bank1 , adc_result+1   ve  

bank0 , adc_result midir

 
yada asm  de adc_result+1  ve adc_result  olarak tanimlanan  bank lari  picbasicte  nasil bir degisken tanimlayarak elde ederim
adc_result var word e karsilik gelirler mi?

saygilar

Okan