Hata devrede mi yoksa programda mı?

Başlatan spirtless, 15 Mayıs 2016, 02:18:05

spirtless

arkadaşlar merhaba ;

    Öncelikle size yapılacak olan uygulamayı anlatmak isterim. Elimde bulunan 5k6 ve 750R değerlerinde bulunan dirençlerin ölçümünü yapmak istiyorum. Anahtar( 1-0-2)  ile hangi tip direnç ölçülecek ise onun seçimi yapılacaktır. Ayrıca girişte ölçümü probuna ait 2 adet seri switch mevcuttur. Buradaki amaç probun , direnç ölçme esnasında tam temas edip etmediğini kontrol etmektir. Ölçümü yapılacak olan direnç devrede bulunan Rx direncidir. Ölçülen direnç değeri belirlenen tolerans aralığında ise LCD'de "ok" , değil ise "uygun değil" ve açık devre durumu var ise "açık devre var" yazacaktır.Ayrıca ölçülen direncin değeri de ekran üzerinde yazacaktır. Bununla beraber direnç değeri uygun ise 1 saniye boyunca yeşil led yanacak ve buzzer  çalacaktır. Direnç değeri uygun değilse veya açık devre durumu var ise 1 saniye boyunca  kırmızı led kesik kesik yanacak ve buzzer kesik kesik çalacaktır. Uygulamaya ait devre şeması ve micro denetleyici programı aşağıda yer almaktadır.
    Ben bu uygulamayı devreye aktarıp programını yazdım. Ancak 16F877A hiçbir girişteki bilgiyi alıp çıkışına aktarmadı. Ne LCD , ne led ne de buzzer aktif oldu. Bununla beraber girişte bulunan buton ve direnç değerinin bilgisini de okuyamadım. Bu konuda sizlerin naçizane fikirlerine ihtiyacım var. Acaba sorun nerede devrede mi programda mı?
    Yardımlarınız için şimdiden teşekkür ederim.



#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 değil ");
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 değil ");
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 
} 
}
 
 
İletiyi düzenle

sifirzero

Kardesim lcd.c  ikincu satira yazarmisin.16f877 altina.ole denermisin
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

dursuncemal

devrenizi gercek ortamdami simulasyon ortamindami deniyorsunuz.?
eger gercek ortamda deniyor iseniz osilator ayalarindan iyice emin olun.
:=

sifirzero

Dursun hocam lcd.c oradayazildigi icin calismaz devre.siz nediyorsunuz.

mesaj birleştirme:: 16 Mayıs 2016, 10:59:58

@dursuncemal
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

dursuncemal

main in ustunde herhangi bir yer onemli diil program derlemede hata vermiyor ise sikinti yok.
:=

sifirzero

Bende aynisi oldu.degistirince duzelmisti.hocamsin
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

dursuncemal

c de include etigimiz bir heder veya c dosyasinin hata vermesi, calismamasi  icin include etmeden once programda kulanmaya kalkmamiz lazim.
yani  #include <lcd.c> satirini yazmadan once  lcd_init(); yada baska bir lcd fonksiyonunu cagirmaya kalkarsak zaten ilk once derleyici derlemez. harici durumlarda cok ozel bir sey olmasi lazim.
:=

spirtless

Arkadaşlar ,

Şunu söylemek isterim. Programı derleyip hex dosyasını pic'e attım. Devre simülasyon ortamında sorunsuz çalışıyor. Ancak gerçekte devre çalışmıyor. Belirli ölçümler yaptım. Osilatör frekansının 0 olduğunu gördüm yani problem burada gibi görünüyor. Ancak bunu nasıl çözebilirim onu bilemiyorum. Program üzerinde osilatör ayarlarını değiştirerek çok denedim. Fakat herhangi bir frekans yok. Bu konuda sizden bir fikir alabilir miyim?

spirtless

lcd.c dosyasını dediğiniz yere yazarak derledim. Ancak devrede bir değişiklik yok. Osilatör frekansı "0" dır. 4MHz kristal kullanmıştım.

sifirzero

Kardesim isis dosyasinida verirmisin eve gidince deneyim.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

spirtless

linklerden indirebilirsiniz.  Bugün denemediğim yol kalmadı. Programda ama hiçbir şekilde pic'i çalıştıramadım.

http://s2.dosya.tc/server/90oa3r/direnc_simulasyon.rar.html

http://www.dosyaupload.com/2AIm

sifirzero

sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

spirtless

Evet çalışıyor. Fakat gerçekte pic hiçbir işlem yapmıyor.

dursuncemal

pic in beslemelerini iyice kontrolet osilastor baglantilarini iyice kontrol et asilator calismaz ise pic asla calismaz pic in kalbi osilatordur.data sheet e bakarak beslemeleri eksiksiz bagladigindan emin ol.devren board uzerinde kurulu ise 22 pf leri cikartip birde oyle dene.
:=

spirtless

Aslında devreye enerji vermeden önce uç testi yaptım. Elemanlar arası kısa devre var mı yok mu? devre yollarında iletim var mı diye ama bir problem yoktu. Benim şüphem ccs c de yazdığım programın konfigürasyon ayarlarında. Acaba programda void main kısmına kadar ki yerde hata mı yapıyorum diye düşünüyorum. 3 kez devre kurdum çalışmadı. Board üzerinde denedim yine aynı bir çok varyasyonu uyguladım. Geriye program kısmı kaldı gibi.