PİC 16F877A ile ADC ve LCD uygulaması çok acil yardım!!!...

spirtless

Üye
Katılım
25 May 2009
Mesajlar
45
Puanları
1
Yaş
36
Adsız.png
Adsız.png

arkadaşlar merhaba
çok acil yardıma ihtiyacım var. şimdi elimde bulunan iki farklı direncin ölçümünü yapmak istiyorum. 1-0-2 anahtarla seçimini yapıcam ölçme direnci devredeki RX direncidir. çıkışta kırmızı , yeşil led , buzzer ve lcd var. devreyi isiste kurdum similasyonda lcd bana değeri veriyor fakat ok durumunda sürekli , açık devre ve uygunsuz durumunda kesikli çal dediğimde her iki durumda kesikli çalıyor tabi bunlar similasyonda . pratiğe geçtiğimde ise pici programladım devreyi kurdum. pic girişi okuyup çıkışa hiç birşey aktarmıyor. ne lcd , ne led ne buzzer çıkış veriyor. girişi de okumuyor. Yardıma çok ihtiyacım sorun nerede devrede mi programda mı?



#include <16f877A.h>
#DEVICE ADC=10 //10 BİT ADC
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
#use fast_io(a)
#use fast_io(e)


unsigned int16 adcbilgi=0; //16 bitlik işaretsiz adcbilgi adında bir degisken tanımladık...
float voltajdeger=0; //ondalıklı voltaj adında bir degisken tanımladık
float R3 = 0.51 , Vcc = 5;
float direnc = 0;

#define LCD_ENABLE_PIN PIN_d3 //lcd enable pini d3
#define LCD_RS_PIN PIN_d1 //lcd rs pini pin d1
#define LCD_RW_PIN PIN_d2 //lcd rw pini pin d2

#define LCD_DATA4 PIN_d7 //lcdnin data4 pini pind7
#define LCD_DATA5 PIN_d6 //lcdnin data5 pini pind6
#define LCD_DATA6 PIN_d5 //lcdnin data6 pini pind5
#define LCD_DATA7 PIN_d4 //lcdnin data7 pini pind4

#include <lcd.c> // lcd dosyalarını yükler

void main()

{
set_tris_a(0b000001); //a0 pini giriş ...
setup_adc(adc_clock_div_32); //adc clock frekansı fosc/32
setup_adc_ports(AN0); //AN0 ANALOG GİRİŞ

set_tris_e(0xff); //e portu giriş
set_tris_d(0x00); //d portu cıkıs
set_tris_b(0x00); //b portu cıkıs
output_d(0x00); //d portunu sıfırla
output_b(0x00); //b portunu sıfırla
lcd_init(); //lcd dosyalarını yükle


while(1) //sonsuz döngüye giriliyor..

{
printf(lcd_putc,"\f"); //lcd'yi temizle
lcd_gotoxy(2,1);printf(lcd_putc," Direnc "); //lcd 1.satır 2.sütundan YAZ.
lcd_gotoxy(2,2);printf(lcd_putc," Olcme ");
delay_ms(1500); //2.SATIR 2.sütundan itibaren yaz.1.5 sn bekle
printf(lcd_putc,"\f");

set_adc_channel(0); //adc kanalı 0 aktıf
delay_us(20); //20 us bekle
adcbilgi=read_adc(); //adc oku adc bilgiye ata
voltajdeger=adcbilgi*0.00488828125; //5/1024=0.0048828125 ADIM voltajı...
direnc =((voltajdeger * R3)/(Vcc - voltajdeger)); // printf(lcd_putc,"\f"); //lcd'yi temizle


if (input(pin_e0) && input(pin_e1)) // e0 ve e1 lojik 1 ise
{
if(direnc >= 5.04 && direnc <= 6.16) // direnç değeri belirtilen aralıkta ise değeri yaz ve ok yaz
{
Output_high(pin_b0); //yesil led yak
Output_high(pin_b2); //buzzer çal
delay_ms(1000);
lcd_gotoxy(2,1);printf(lcd_putc,"DIRENC=%fkOhm",direnc); //direnc bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc,"******OK******* ");
delay_ms(1000); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
printf(lcd_putc,"\f"); //lcd'yi temizle
}
else if (direnc > 20) //eğer ki bu şartların dışında ise açık devre var demektir.
{
lcd_gotoxy(2,1);printf(lcd_putc,"SONSUZ DIRENC "); //açıklama bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc,"ACIK DEVRE VAR");
delay_ms(1000); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
printf(lcd_putc,"\f");
output_high(pin_b1); //kırmızı ledi yak
output_high(pin_b2); // aralıklı buzzer çal
delay_ms(500);
output_low(pin_b2);
delay_ms(500);

}
else //eğer ki belirtilen aralıkta değilde değeri yaz ve uyarı ver
{
lcd_gotoxy(2,1);printf(lcd_putc,"DIRENC=%fkOhm",direnc); //direnc bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc," UYGUN DEGIL ");
delay_ms(1000); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
printf(lcd_putc,"\f");
output_high(pin_b1); //kırmızı ledi yak
output_high(pin_b2); // aralıklı buzzer çal
delay_ms(500);
output_low(pin_d2);
delay_ms(500);

}
}
else if (input(pin_e0) && input(pin_e2)) // e0 ve e2 lojik 1 ise
{
if(direnc >= 0.75 && direnc <= 0.85) // direnç değeri belirtilen aralıkta ise değeri yaz ve ok yaz
{
Output_high(pin_b0); //yesil led yak
Output_high(pin_b2); //buzzer cal
delay_ms(1000);
lcd_gotoxy(2,1);printf(lcd_putc,"DIRENC=%fkOhm",direnc); //direnc bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc,"******OK*******");
delay_ms(1000); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
printf(lcd_putc,"\f"); //lcd'yi temizle
}
else if (direnc > 20) //eğer ki bu şartların dışında ise açık devre var demektir.
{
lcd_gotoxy(2,1);printf(lcd_putc,"SONSUZ DIRENC "); //direnc bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc,"ACIK DEVRE VAR"); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
delay_ms(1000);
printf(lcd_putc,"\f");
output_high(pin_b1); //kırmızı ledi yak
output_high(pin_b2); // aralıklı buzzer çal
delay_ms(500);
output_low(pin_b2);
delay_ms(500);

}
else //eğer ki belirtilen aralıkta değilde değeri yaz ve uyarı ver
{
lcd_gotoxy(2,1);printf(lcd_putc,"DIRENC=%fkOhm",direnc); //voltaj bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc," UYGUN DEGIL ");
delay_ms(1000); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
printf(lcd_putc,"\f");
output_high(pin_b1); //kırmızı ledi yak
output_high(pin_b2); // aralıklı buzzer çal
delay_ms(500);
output_low(pin_d2);
delay_ms(500);

}
}
else
output_d(0x00); //d portunu sıfırla
output_b(0x00); //b portunu sıfırla
}
}
 
programı incelemedim ama compile ederken frekans gerçekte kurudugunuz devreyle aynı mı? osilatör seçimi doğru mu
 
MCLR/Vpp ucunu 4k7 ile VCC ye bağlamayı deneyebilirmisin ?
Ayrıca "winston bridge" kurman gerekir(direnç ölçümünde), bağlanılan direncin skalasını neden işlemciye tarattırıyorsun ?
 
ölçmek istediğim direnç değeri belirli aralıkta ise ok değilse uygunsuz olduğunu görmek istiyorum. ben hassas okuma için gerilim bölücü ile adc okuma yapmayı amaçlamıştım ancak şuanda devrede ne bir giriş nede bir çıkış var. MCLR/Vpp ucunu 10k ile VCC ye bağladım. bir çok yerde böyle yapıyorlar ama sorun nedir bilemiyorum. ya programda eksik var yada devrede bir eksik var.
 
Komik olacak ama VCC ve VSS bağlı mı ? Programın doğru bir şekilde yüklendiğine emin misiniz ? Analog girişe pot bağla (test amaçlı), ayrıca analog girişe 100nf kapasitör bağlayabilir misin ?
Hazır yüz bulmuşken : Fiziksel olarak bir kristal bağlamadın umarım... @spirtless
 
Son düzenleme:
bağlantılar arasında bir problem yok uç testi yaptım iletim tamamında var gerilim değerlerini de ölçtüm o da tamam fakat bir hata var ama çözemedim programı bir kaç kez yükledim onda da sorun çıkmadı ama pic hiç bir şekilde devrede değil kafayı yiyeceğim. acaba devre şeması mı yanlış. 100nf vdd ile vss arasına koydum.
 
Toptan devrede hata bulmak zordur. Devreyi ledlerle kur (lcd iptal et) Buzzer yerine sarı-kırmızı-yeşil led kullan ayrıca işlemcinin loop döngüsüne geçip geçmediğini nası anlayacaksın ? Bir devreyi yaparken (misal seninki gibi) önce LED yakıp söndür sonra LCD çalıştır en sonunda da analog giriş/çıkış ekle , her bir adımda bir led yak ki döngülerin yada işlemcinin takıldığı noktayı anla !
Ayrıca while döngüsü bir Main objesi alt elemanı olmak zorunda değil mi ?
 
programda while döngüsü void main içerisindedir. ledle kursam bile aynı durum söz konusudur. çünkü sanki işlemciye hiç enerji gelmiyor gibi girişindeki bilgiyi çıkışa hiçbirşekilde aktar mıyor bu durumda ya besleme sorunu ya osilatör sorunu ya da program sorunu gibi görünüyor.
 
hala çözemedim @seagate
clock harici dediğin sanırım cristal osilatörü soruyorsun evet pic'e bağlı 4MHz lik cristal ve ona bağlı 22pF lık kapasiteler var. Devre şemasını birebir plakete kurdum. Zaten 16f877a nın dahili osilatörü bulunmamaktadır.
 

Yeni mesajlar

Forum istatistikleri

Konular
128,158
Mesajlar
915,526
Kullanıcılar
449,904
Son üye
teknikbilimlers31

Yeni konular

Çevrimiçi üyeler

Geri
Üst