MCP3204

Başlatan dogi1905, 15 Aralık 2012, 21:30:13

dogi1905

ŞU başlıktaki cihazı pic basic ile nasıl çalıştırabilirim girişe gelen analog sinyali dijitale çevirip picten işlemler yapmak istioyrum ancak nasıl? Ete hocamın derslerindeki shıftın ve shıftout komutlarını kullandım ancak sonuç alamadım. Entegrenin datasheetinde bir clok pals bitiminde start biti ardından d1 ve d0 bitleri gönderilmesi gerekiyormuş kafam çok karıştı acil yardım lütfen!!
DATASHEET:http://www.google.com.tr/url?sa=t&rct=j&q=mcp3204+datasheet&source=web&cd=1&cad=rja&ved=0CC0QFjAA&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2Fdevicedoc%2F21298c.pdf&ei=VM_MUNqSMKOA4gTrwoFI&usg=AFQjCNE2EAgvDb8JkU-fF8oqJUQLlGvJ4g&bvm=bv.1355325884,d.d2k

ete

#1
Bu malzemenin çalışabilmesi için önclikle doğru bir bağlantı yapılması şarttır.
Data sheet'e bakılırsa İşlemciye bağlayacağın bacakları;
- CLK
- Din     'Bu pin entegrenin Data giriş pinidir ancak İşlemcide Dataout pini olacaktır. Shiftout da kullanılacak olan pin
- Dout   'Bu pin entegrenin Data çıkış pini olacak ancak işlemcide DATAin pini olacaktır. Shiftin de kullanılacaktır.
- CS/SHDN
pinleri olacak. Ama ne şema koymuşsun ne yazdığın programı koymuşsun. Biz nereden anlayacağız nerede hata yaptığını?
Bu durumda genel açıklama yapmamız gerekecek.

Data sheet in serial communication sayfasına bakarsan;
Orada bir control bit tablosu verilmiş. MCP3204 için bu tabloya bakarsan kullanman gereken yöntem Single-Ended olacaktır.
Şimdi örnekle devam edelim. Diyelimki 0 nolu kanala bağlı ADC değerini okuyacaksın.
Kontrol Bitleri tabloya göre şöyle olmalı,
Sing/Dif=1
D2=0
D1=0
D0=0
Bir sonraki sayfaya bakarsan orada bir haberleşme diyagramı çizilmiş. Bu diyagrama bakılırsa önce MSB yani high bit önceden veriliyor. İlk verilecek olan Bit ise START biti oluyor ki bu bir HIGH bilgisi olacakmış. CLK seviyesi LOW dan HIGH konumuna geçerken data aktarılmış oluyor ve CLK HIGH da kalıyor.
Bunun Shift komutlarında karşılığı Mode=5 dir. AÇıklaması şöyle  "Shift data out highest bit first. Clock idles high."
O halde önce entegreye ne yapacağımızı bildirmekiçin Control değişkenini vermemiz gerekecek.
Kontrol=%00011000 şeklinde olacaktır. Bunu yakrıdaki bit tablosuna göre ayarladık. Burada HIGH olan bitler Start biti ile Sing/Dif bitleridir.
Şimdi komutu verelim,
SHIFTOUT Din, CLK,5,[KONTROL\5]   'sondaki 5 yalnızca 5 bit yollayacağımızı gösteriyor.
Bu komutu verdikten hemen sonra hemen ADC değerini okumak gerekiyor
Onuda
SHIFTIN Dout,CLK,4,[ADC.byte1\5 , ADCByte0 ] şeklinde okumamız gerekiyor.
Burada mode olarak 4 kullandık karşılığı şu "  Shift data in highest bit first,  Read data before sending clock. Clock idles high."

Bu komut da ilk okunacak bilgi ADC değerinin HIGH byte değeridir ve yalnızca 5 bit den oluşuyor. Bu nedenle okuma komutunun sonuna 5 bit okunacağını belirttik. Sonraki bilgi Low byte olup 8 bitlik bir bilgi olacaktır.
High byte değeri kontrol edilmeli ve gerekirse 3 bit sağa kaydırılmalıdır. Zİra diyelimki %01100 bilgisi okundu 5 bit olarak.
Okunurken HIGH bit den başlanacağı için bu 5 bitlik bilgi değişkene %01100000 olarak yerleşebilir yada öyle yerleşecektir.
Bunu normale çevirmekiçin 3 bit sağa kaydırmak gerekir diye düşünüyorum. SOnuçta ADC.Byte1=ADC.Byte1>>3 şeklindeki bir komut bunu yapacaktır.

Böylece Programda Word oalrak tanımlanmış olan ADC değişkenine Kanal-0 daki değeri okuyup yerleştirmiş olacağız.
Diğer kanallarda yalnızca KOntrol biti ne ait D0 ve D1 değerleri değişmektedir. Tabloya bakılarak onları da yuklarıdaki örneğe göre okumanız mümkün olacaktır.

Bir şey eklemeyi unuttum.  Haberleşmeye başlamadan önce CS ucunu LOW a çekeceğiz. Okuma bittikten sonra da aynı ucu HIGH a çekmemiz gerekiyor.

Ete


dogi1905

#2

@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

CMCON=7

TRISA=%00000100
TRISB=0
PORTA=0
PORTB=0

SAYI VAR BYTE
ADC VAR WORD
DIN VAR PORTA.2
DOUT VAR PORTA.1
CLK VAR PORTA.0
CS VAR PORTA.3
SAYI=%00011000

BASLA:
LOW CS
SHIFTOUT DOUT,CLK,5,[SAYI\5]
SHIFTIN DIN,CLK,4,[ADC.BYTE1\5,ADC.BYTE0]
ADC.BYTE1=ADC.BYTE1>>3
HIGH CS
PORTB=ADC.BYTE1
GOTO BASLA
END

Hocam kodlar burda. Sistemi çalıştıramadım. Devreyide ekledim bir pot ile portbyi kontrol edicem(diyelimki). Yardımınıza muhtacım.
SAYGILAR...

ete

Birde şöyle dene bakalım. CLK kalış pozisyounu farklı olacak sanırım.
BASLA:
LOW CS
SHIFTOUT DOUT,CLK,1,[SAYI\5]
Pause 5
SHIFTIN DIN,CLK,2,[ADC\13]
HIGH CS
PORTB=ADC.BYTE1
pause 10
GOTO BASLA
END


Ete

F®T

proton da olan bir sorgulama çalışıyor.buna göre düzenlenebilir.

Symbol CLK=PORTA.0
Symbol DIN=PORTA.1
Symbol DOUT=PORTA.2
Symbol CS0=PORTC.0


basla:

MCP32041:
Low CS0
SHOut DIN, CLK,msbfirst, [SOR\5]
SHIn DOUT,CLK,msbpost,[ADC\13]
High CS1
Return

goto basla
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

dogi1905

Alıntı yapılan: ete - 17 Aralık 2012, 08:02:50
Birde şöyle dene bakalım. CLK kalış pozisyounu farklı olacak sanırım.
BASLA:
LOW CS
SHIFTOUT DOUT,CLK,1,[SAYI\5]
Pause 5
SHIFTIN DIN,CLK,2,[ADC\13]
HIGH CS
PORTB=ADC.BYTE1
pause 10
GOTO BASLA
END


Ete

Hocam çok teşekkür ederim sayenizde bir entegrenin daha nasıl çalıştığını öğrendim iyi elektrogünler :)

Powered by EzPortal