PIC 16F877 ADC'den Bilgi Okuma

maamed

Üye
Katılım
31 Ağu 2009
Mesajlar
39
Puanları
1
Yaş
36
selam arkadaşlar pic16f877 kullanarak,kullanılacak 4 buton 3 led ve bir role ile ilişkilendirilecek ve her bir butona basıldığında butonun ilişkili olduğu led veya role lcd ekranın birinci satırında hangi led yanıyorsa veya role atmışsa misal "şu led yanıyor veya role atıyor" diye yazdırılacak daha sonra pic16f877 deki 2 tane adc den gerilim bilgisi okunacak ve bu da lcd nin 2. satırında adc1:***volt adc2:***volt şeklinde yazdırılacak aynı zamanda adclerdeki voltaj değeri bir dac çıkışında da okunabilecek ben pic programlama işini çok iyi bilmiyorum fakat 4 günden beri pic basic kasıyorum iyi kötü bir kod yazdım proteusta ve programda dac haricinde diğer kısımları tasarladım fakat bir türlü çalıştıramadım hata yazılan programda mı yoksa proteustaki kurduğum devrede mi anlayamıyorum cok iyi bilmediğim için amacım ödevi başkalarına yaptırmak değil bu ödev sayesinde pic basic de baya yol kat ettim yoksa çalısacağım yoktu fakat zamanım kalmadı hem hatamı öğrenmek hem de bu işi daha iyi kavrayabilmek adına yardımlarınızı bekliyorum.yazdığım program:
Kod:
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC


DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 2
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50


DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50


TRISA=%00000011
TRISB=%00000000
TRISC=%00001111
TRISD=%00000000


LOW PORTB.2


ADCON1=%10000101


PORTD=0


lcdout $FE,1
PAUSE 500


ADC1_DEGERI var word
ADC2_DEGERI var word
GERILIM1 var word
GERILIM2 var word


anadongu:


IF PORTC.0=0 THEN PORTD.0=1
IF PORTC.1=0 THEN PORTD.1=1
IF PORTC.2=0 THEN PORTD.2=1
IF PORTC.3=0 THEN PORTD.3=1


gosub lcdgoster
gosub adc_oku


GOTO anadongu


lcdgoster:
if portd.0=1 then lcdout $FE,2,"kirmizi led....."
if portd.1=1 then lcdout $FE,2,"sari led........"
if portd.2=1 then lcdout $FE,2,"yesil led......."
if portd.3=1 then lcdout $FE,2,"role atiyor....."


return


adc_oku:
ADCIN 0,ADC1_DEGERI
GERILIM1=ADC1_DEGERI*48/10
LCDOUT $FE,$C0,"ADC1:",#GERILIM1


ADCIN 1,ADC2_DEGERI
GERILIM2=ADC2_DEGERI*48/10
LCDOUT $FE,$C4,"ADC2:",#GERILIM2
pause 250


return


end

ve proteustaki devre:

adszdc.jpg

yardımlarınız ve ilginiz için şimdiden teşekkür ederim saygılarımla...
 
5 V uygulanması gereken noktalara power terminal (vdd) bağlamalısınız, siz sanırım voltaj probu bağlamışsınız.
 
öncelikle cevabınız için çok teşekkür ederim verdiğiniz bilgi üzerine devreyi değiştirdim fakat yine bir sonuç alamadım.
 
sevgili arkadaşlar bu konuda yardımlarınızı bekliyorum mağdur durumdayım.
 
arkadaşlar bilirkişiler su işi bir çözüme kavuştursak olmasa bile hatam nerede onu bi göreyim
 
(Muhtemelen kötü bir kopya).
Lcd pinlerini portb de doğru yerlere bağlamamışsın.(B4-7)
Gereken dosyalar dendiğinde mcs dosyaları verilir sadece text (yeterlidir) değil.
Değişiklikleri yap , lcd yazılarını göreceksin.
Sonra takıldığın yer olursa devam ederiz.
 
Çiziminde ve programında birsürü hata vardı, ama en azından çaba harcamışsın.

-Adcon1 yazmacını porta3 vref olacak şekilde ayarladığından ve porta vdd'ye bağlı olmadığından adc sonuçları sürekli 0 dönüyordu, vref vdd olarak ayarlayınca normale döndü.

-Lcd alt satırlarını tam olarak kullanamamışsın..

-Adc gösteriminde de şöyle bir mantık hatası olmuş: Sonuç değişkenin 16 bit, sen bunu önce 48 ile çarpıp sonra 10'a bölmeye kalkarsan taşmalar sonucunda gerçek değeri kaybetmiş olursun. Mesela pot ortadayken adc 62235/2=32767 verdi diyelim. 32767*48=1572816
Bu sayı 16 bit değişkende saklanamaz, yapmak istediğin her ne ise farklı çözümler bulmalısın. Ben 5 volt karşılığını 5000'e yakın yansıtabilmek için sonucu basitçe 13'e böldüm, bu kısmı biraz daha geliştirmen gerekiyor, tabii değişkenlerde taşmaya sebep olmadan...

Ete ustanın bununla ilgili kodları biryerlerde vardı hatırlıyorum.

C ile çalışıyor olsaydın herşey çok daha kolay olabilirdi...

Başarılar dilerim.
 
sayın kazım uğur bu işi iyi bilmediğimi konunun başında söylemiştim tamamıyla kendi hatam ve kötü bir öğrenci oluşumdan kaynaklanıyor bu proje sayesinde programlamaya eğilim gösterdim yazılan kodların yalnızca bir kısmı kopya ve kopyaladığım yerleri benim değiştirmemden kaynaklanan problemleri size arz ettim verdiğiniz tavsiyeler yardımlarınız için teşekkür ederim yanlış anlamayın size bir sitemim yok fakat bu işte emeğin olduğunu ve herşeyin kopya olmadığını belirtmek istedim size.

sayın yöneticim gösterdiğiniz ilgi için çok çok teşekkür ederim şu an itibariyle bir ccs c kitabı sipariş ettim ve programlamaya ilk bu dille başlamayı seçtim insallah sizinde bilgileriniz sayesinde ve bu sitedeki bilgiler sayesinde hallederim bu programlama işini şu anda çalıştıgım için proje üzerinde duramıyorum yazdıgınız bilgiler üzerine hatalarımı tekrar kontrol edeceğim hepinize teşekkürler saygılarımla...
 
iyi akşamlar ccs c ye çalışmanın verdiği bilgi ve hocamın da yardımıyla bu devrenin bir kısmını hallettim benim gibi mağdur olan arkadaşlar için paylaşıyorum yalnız yardımınızı istediğim bir konu var pic in boşta olan c portundan bir çıkış alarak butona basıldığında lcd ekranda görünen voltaj değerini aynı zamanda bir dac nin çıkışında da manuel olarak ölçmem lazım bu devrede ve yazılımda ne gibi bir değişiklik yapabilirim.
saygılarımla...
 
Piclerde malum dac modülü yok.
İstediğin değeri iki şekilde dışarı yollayabilirsin , tabii digital olarak.
Ya serial bilgi olarak yollarsın yada 8 bit yetiyorsa bir porta yollarsın.
Yok yetmiyorsa bilgiyi low_byte high_byte olarak ikiye ayırıp yollarsın.
Ya da make komutu ile bilgiyi bölebilirsin.
Aldığın kitapda açıklamalar olacaktı.
Mesela PortB=değişken demek yeterlidir.
Tek port yetiyorsa meşhur merdiven gibi dirençler bağlayarak dac yapabilirsin , hatta varsa iki portta olur.

Hedefini tam anlayamadığım için fazla yorum yok.
Analog girişde zaten analog bilgi varken adc yapıp sonra tekrar dac yapmak ne işe yarar ki ?

Edit :
Ek...

http://www.megep.meb.gov.tr/mte_program_modul/moduller_pdf/Mikrodenetleyici 3.pdf
 

Forum istatistikleri

Konular
129,311
Mesajlar
925,214
Kullanıcılar
451,756
Son üye
Chillerservis

Yeni konular

Geri
Üst