A/D dönüştürücü

Başlatan kanguner, 01 Nisan 2005, 16:36:19

kanguner

mrb . ark. bende pbp2.45 ve mcs var. bende ADCON1 VE ADCON0  komutları çalışmıyor. yani mesela LCDOUT  yazdığınızda yazı koyulaşırya bu söylediğim komutları tanımıyor alet. ne yapsakki.birde bu ADCON lar ile bir kaç komut söyleyebilirmisiniz.
mesela ADCON1=%00000000 yaptığımızda bütün girişler analog oluyomuş. bunun gibi aklınıza gelenler varsa yazabilirmisiniz.bu konuda biraz cahilimde .

SpeedyX

kardeş ADCON1 bir komut değildir ki.
mcs kullanmıyorum ama bir register adı olduğu için olmuyordur sanırım.
sen ADCONx ile bir program yazıp da denedin mi çalışıyor mu diye?
önce dene program çalışmıyorsa görüşelim. yazıyı kalınlaştırmıyorsa programı yapan şirkete şikayet et.
buradaki insanlar sana ya kalınlaştırıyor yada kalınlaştırmıyor diyeceklerdir. bunu çalıştırarak sen de öğrenebilirsin. kolayca öğrenebileceğiniz şeyleri bile burada soruyorsanız cevaplanmaması normaldir.

Saygılar.

kanguner

kusura bakmayın bende yeni yeni alışıyorum. daha demin kendi kendime anladım neyseki bunun bi komut olmadığını. şimdi de senin yazdıklarını görünce içim rahatladı doğrusu. sağolasın. herkes anasının karnında öğrenmiyorki bu veleti. keşke daha kolay bi yolu olsaydı. elimiz mahkum çalışıcaz artık dimi. :roll:

Veli B.

Bir işlemciyi kullanmaya karar vermeden önce datasheetlerini incelemek zorunludur.
Hangisini kullanacağına yada nasıl kullanacağına bu şekilde karar verebilirsin.
İşlemcileri ezbere bilmen veya registerları bu şekilde kullanabilmen değil, datasheetleri okuyabilmen ve yorumlayabilmen önemli.
Bu işlemci için böyle bir yardım sergilenirse sen yarın başka bir işlemci de bunu yine isteyeceksin.Esas olan sadece almak değil, alırken vermeyi öğrenmek!!!
Vermek için ise araştırabilmeli ve geliştirebilmelisin.
Sevgilerimle...

kanguner

mrb  . dediğiniz gibi araştırdım ve kendime şöyle bi devre kurayım dedim. f877 nin RA0 ucuna voltaj verdim 5 volt max. bunuda 50k lık (elimde bu vardı) pot ile değiştiriyim dedim.

sonra portc nin uçlarına ledler bağladım. giren analog voltajın değerine göre (çıkış değişik dijital bilgilere dönüşeceğinden ) çıkıştaki ledlerde değişik şekilde yanıp sönmeler elde edeyim dedim.

ama ilk defa a/d li kod yazdığımdan kod kısmı tam olmadı herhal.aşağıda yazdığım kodları veriyorum . bi incelerseniz nerde hata yaptım tam kestiremiyorum.

ADVAR VAR WORD
TRISC=%00000000    
TRISA = %11111111


ADCON1=%00000000  
ADCON0=%01000001  
Define ADC_SAMPLEUS 20
PAUSE 500
DONGU:

ADCON0.2=1
WHILE ADCON0.2=1
PAUSE 5                                
ADVAR.HIGHBYTE = ADRESH
ADVAR.LOWBYTE = ADRESL
PORTC= ADVAR.HIGHBYTE
WEND    

PAUSE 10
GOTO DONGU
END

birde ADCS1 VE ADCS0 a 1 ve 0 değerleri vererek 4 değişik durum elde ediyoruz ya. ben mesela yukarda 01 vermişim yani Fosc/8 yaptım. bunu rastgele yaptım. tamam en sondaki rc kullanırsak seçiyoruz herhal. ama ya Fosc/2 Fosc/8 Fosc /32 bunların mantığı nedir.

bu basit uygulamayı yapamadım bi türlü . yardımlarınızı bekliyorum .tşk.

ftsahin

deger var word

DEFINE  LCD_DREG        PORTB
DEFINE  LCD_DBIT        4
DEFINE  LCD_RSREG       PORTB
DEFINE  LCD_RSBIT       1
DEFINE  LCD_RWREG       PORTB
DEFINE  LCD_RWBIT       2
DEFINE  LCD_EREG        PORTB
DEFINE  LCD_EBIT        3

Define   ADC_BITS   10   ' 10 bit ADC
Define   ADC_CLOCK   3   ' Osc tipi (3=rc)
Define   ADC_SAMPLEUS   50   ' Çözünürlük =50 us

      
TRISA = %11111111   
ADCON1 = %10000010   ' PORTA analog
pause 500      

loop:   
 ADCIN 0, deger
 lcdout $fe,1,#deger
 pause 100
 Goto loop
End

Devrenin çalışması için 16f877'nin 1 nolu ucu 10K'lık bir direnç üzerinden  +5V'a bağlanması  gerekiyor. 2 nolu ucuna da ölçüm yapılacak gerilim verilecek. LCD bağlamak istersen :

LCD......PIC
RS........34
RW........35
E...........36
D4(11)...37
D5.........38
D6.........39
D7.........40

1  -
2 +
3 -

kanguner

sayın ftsahin;

verdiğin kodda Define ADC_CLOCK 3 ' Osc tipi (3=rc)  demişsin. şimdi ben devremde 4mhz lik osilatör yerine rc mi kullancam. eğer rc kullancaksam f877 ye rc yi nasıl bağlıyoruz .şimdiden tşk.

SpeedyX

Alıntı yapılan: "kanguner"verdiğin kodda Define ADC_CLOCK 3 ' Osc tipi (3=rc)  demişsin. şimdi ben devremde 4mhz lik osilatör yerine rc mi kullancam.
arkadaş hiç kitap'a bakmazmısın sen?

orada 3 demek int_rc demek yani iç osc frekansı demek, dışarıdan tetikleme olmadan demek...

Alıntı Yap0: External oscillator/2
1: External oscillator/8
2: External oscillator/32
3: PIC internal RC oscillator

sen devam et xt ile. insan önce bi kitaba bakar,devreyi bi dener. :)

kanguner

kusura bakma kardeş. valla bu arlar çok yoğunum .ancak geceleri bakabiliyorum. dikkatimi toplamakta zorluk çekiyorum. ama yinede sağol.

ftsahin 'nin verdiği kodları denedim hemen.(sağolsun.) analog voltajın alındığı yere pot koydum yine. direnç sıfır değerinde 0 değerini artırdıkça yükseldiğini ve en son değerde ise lcd de 1023 değerini gördüm. şimdi anlamadığım bi nokta var. biz sıcaklık değeri ölçmek istesek , illaki programda # işareti ile ascii kodundan faydalanmak mı zorundayız?

# işaretini kaldırdım ve sonuç olarak pot ile oynadığımda ekranda rakamlar,büyük küçük harfler ve bir sürü şekil çıktı.

benim asıl amacım sıcaklık bilgisini ölçmek. bunun içinde pot u çıkardım ve lm35 koydum. (bu arada # işaretini tekrar geri koydum programa.) ekranda 85-90 arası değişen sayısal ifadeler çıktı. forumda bayağ bi gezindiğimden millet lm35 in uçlarına direnç bağlıyormuş. bende lm35 in Vout ucuna 47k ve Vin ucuna 10k bağladım. ekrandaki değer 60 lara düştü.

daha sonra programda ( oda sıcaklığı olsun diye )
ADCIN 0, deger
deger=deger-38
lcdout $fe,1,#deger
şeklinde değiştirdim. ve sayısal değeri 22 lere çektim.

şimdi bu anlattıklarıma göre ben tam olarak bir sıcaklık ölçümü yapmış oldummu? bana sanki eksik mantık hataları var gibi geliyor.

bu anlattıklarım bilenler için çok basit olabilir. lütfen anlayışlı olun. bu a/d dönüştürme olayını tam anlayamadım. siz üstadlar sayesinde inş. kavrayacam bu işi. :)

SpeedyX

selamlar.

a/d çevrim yaparken yaptığın işlemleri ve aldığın değerleri şuna göre düşünmelisin; 10 bitlik çevrimde değer 1023 ise voltaj 5V dur.
yada 8 bitlikte değer 255 ise 5V dur.

lm35 derece başına 10mV çıkış verir.

Veli B.

Bordumuzun arama gibi bir özelliği var.Bunu kullansan, bu konuda yeterli bilgi olduğunu göreceksin.Daha önce bu konuyu detaylı bir şekilde tartıştık.
Arkadaşlar mesaj yazmadan önce bir arama yaptırsanız, aslında soracağınız konuların çoğunun daha önce tartışıldığını ve sonuca bağlandığını göreceksiniz.
Bu sayede ne veri tabanımız şişecek, ne de kimse kimsenin zamanını harcayacak.

kanguner

şimdi arkadaşlar ,  şöyle bir sorun oluştu.

devreyi çalıştırıyorumm. lm35 in üzerine buz koyuyorum. okuduğum ısı değeri artıyor. tersini (ısıyı artırıyorum) yapıyorum bu seferde azalıyor. neden böyle oldu. nasıl düzeltilir bu. :?:

birde lm35 den voltaj ölçtüm. buz koyduğumda çıkardığı voltaj değeri artıyor. bu degerde , lcd ye aktardığımız ascii koduna bağlı olduğuna göre kodun ascii  kısmında değeişiklik mi yapmak lazım. forumu dolaştım(hatta şimdi bi daha dolaşıyorum) ama milletin hiç böyle bir sorunu olmamış galiba. yardımcı olursanız sevinirim.tşk.

Veli B.

:!:  :!:  :!:
Bağlantılarını ve datasheette bulunan örnekleri bir daha incele.Söylediğin şeyler hiç mantıklı değil. :?

Bu arada kullandığın 35 in eki nedir? dz a c cz gibi?
datasheet üzerinden bunları da incele.Adc ye uygulamadan önce ölçü aleti ile ölçtüm diyorsun.O halde hatanın yazılım yada denetleyici tarafında olmadığını fark etmiş olman lazım.
35 C° başına 10 mv veriyor.Demek ki ısıyı 10 C° artırırsan, çıkışta 100 mv luk artış görmelisin.
Negatif ölçüm yapabilen bir model kullanıyorsan, gnd ucunu bir diot ile şaseye bağlamayı unutma.Taban voltajını dioduna göre takriben 600-700 mv yukarı öteleyecektir.Bu sayede 0 C° seviyesini 600-700 mv lara taşıyabilecek ve mesela -20 C° için çıkışta okuyacağın değer 400-500 mv olacaktır.

ftsahin

LM 35 derece başına 10 mv veriyorsa  sıcaklığı şu formülle hesaplaman lazım :

sicaklik = (deger * 500) /1024
lcdout  $fe,1,#sicaklik," C"

kolay gelsin

Veli B.

@Ftsahin,
Yazdığın kodun açıklamasını da yazarsan, başka bilgiye gerek kalmayacaktır sanırım.