Kararsızlık örneği

Başlatan mutta, 04 Kasım 2006, 21:11:00

mutta

Arkadaşlar nasıl oluyor anlamadığım bir durumla karşı karşıyayım, aşağıdaki örnek en basiti olup bu durumu da çözemediğimi belirtmek isterim

#include<pic.h>
#define yak RB0
main(void)
{
	TRISA=0;
	TRISB=1;
	PORTA=0;
	for(;;)
	{
		if(yak==0)
		{
			RA1=1;
		}
		else
		{
			RA1=0;
		}
	}
}


butona bastığımızda RA1 e bağlı led yanması gerekmiyor mu?
Ama ben butona basmadan da yanıyor bu led,kendi isteğine göre yakıyor söndürüyor,bazen parlak yanmasa da sönük yandığını görüyorum,bu durumu nasıl çözebilirim anlamadım,acaba kristalim mi bozuk dedim ve kristalimi değiştirdim 4 ve 20 Mhz lik kristaller kullandım fakatsonuç yine aynı
>>>Her yere imza atmam<<<

aslan_korhan

Kullandığın Buttondan +5V'ye doğru 4K7 veya 10K direnç ( Pullup ) bağladınmı?
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

gsever

Merhaba,

#include önişlemcisinin hemen altına

__CONFIG (WDTDIS);

satırını ekleyin, muhtemelen WDT iptal olmadığı için işlemci kendini resetliyordur.

mutta

dediklerinizi yaptım fakat yine olmadı gerçi kod u yazmak yerine programdan wdt disable etsek ediyordum
>>>Her yere imza atmam<<<

gsever

Şemayıda eklersen kodla beraber hata nerde daha rahat anlarız.

conavar

header dosyasını da görebilir miyiz...
giriş olarak tanıttığın pini hangi satırda okuyorsun...
watch dog timer ile alakası yok...
.::BiLgi Paylaştıkça Çoğalır::.[/url]

ulaser84

butonu bıraktığın zaman if döngüsündeki işlemleri bir kaç kez tekrarlayabilir.delay ekleyerek bir dene.RB0 ucunu pull up yapmadan butona bağlama.wdt yi kesinlikle devreden çıkar

mutta


arkadaşlar devre bu acaba donanımsal bir hata mı var?
>>>Her yere imza atmam<<<

conavar



bağlantını bu şekiLde yaparsan sorun kalmayacak...tabiki cristal osc de unutma...gerçi ext. da kullanılabilir ama neyse...

main()
{
set_tris_b(0xFF)                          ; // port b yi giriş yap
set_tris_a(0x00)                         ; // port a yi çıkış yap
while(true)
{
  if (!input(PIN_B0))                     ;//buton basılımı test et
      delay_us(250)                       ; //250ms BEKLE 
      output_high(PIN_A1)              ; //basılıysa ledi yak
  else
     output_low(PIN_B0)                ; //basılmamışsa ledi söndür
}
}
.::BiLgi Paylaştıkça Çoğalır::.[/url]

hunter

pil ground ile PIC  ground birbirine bağlanmalı...

piedos

#include<pic.h> 
#define yak RB0 
main(void) 
{ 
   TRISA=0; 
   TRISB=1; 
   PORTA=0; 
   for(;;) 
   { 
      if(yak==0) 
      { 
         RA1=1; 
      } 
      else 
      { 
         RA1=0; 
      } 
   } 
}


Kodda buton olarak kullandığın pin RB0, oysa şematikte butonu RB1 e bağlamışsın. Ve TRISB=1; komutu ile RB1...RB7 arasını output olarak tanımlamışsın.

D1 ledi voltajı 1.8 volt yükseltir tabii 470 ohm da biraz yükseltecektir.
Her ne kadar pic 2.4 volt altını logic 0 olarak algılasa da bu hatalı tasarım kararsızlığa neden olabilir.


Debounce için kodu şöyle değiştirmen işe yarar:

  for(;;) 
   { 
      
      if(yak==0) 
      { 
         RA1=1; 
      } 
      else 
      { 
         RA1=0; 
      }
      delay_us(150); 
   }
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

conavar

şemayı netten buLdum...
kodlama kafama göre yazdım...
ama mantık budur bu şekiLde calışması lazım...
cok yağunum o arada yazdım..
Şemada yanlışlık var...
Led yanlış bağlıydı düzeLtim...
dikkat edelim...
1 giriş 0 çıkıştır...
.::BiLgi Paylaştıkça Çoğalır::.[/url]

mutta

arkadaşlar dediğiniz şeylerin hepsini yaptım fakat yine olmuyor evet devrede hata var devreyi çizerken hata yaptım,devrenin beslemesi tamam,program da çalışıyor fakat bir süre hiç bir şey yapmıyorum işlemci üzerinde led sanki butona basılmış gibi yanıyor ,bazen de devreye enerji verdiğimde direkt yanıyor hala çözemedim :oops:
>>>Her yere imza atmam<<<

conavar

hımmm
ilk olarak o zaman
main içinde
output_low(PIN_A1);
dene...
son kullandığın program ne onu da yaz...
bu cok basit bir uygulama...kesin calıştırman lazım..
main()
{
set_tris_b(0xFF)                          ; // port b yi giriş yap
set_tris_a(0x00)                         ; // port a yi çıkış yap
output_low(PIN_A1);
....}
.::BiLgi Paylaştıkça Çoğalır::.[/url]

mutta

kullandığım program htlpic dediğiniz gibi mainin içine;
RA1=0;
yazdım yine olmadı,analamadığım olay butona basmadan ledin kendi kendine yanıyor olması
>>>Her yere imza atmam<<<