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...
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);
}
Sanırım çözdüm. İlginiz için teşekkür ....
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
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.
Evet hocam , derdim 12 bit olmasi ve daha da onemlisi ornekleme suresinin daha kucuk olması.
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.
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.
Abi ,
bu grafikler bendeki datasheetlerdekilerden biraz farkli ,
sadece 3. ayni
abi bana birkac gun musade ,,ben bu arada biraz daha ders calisayim,
saygilar
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
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 .
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.
Herkese teşekkürler,
kazim abinin onerdigi sekil yapmayi deniyecem.
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