pic c ile tek tus start/stop

Başlatan JOKERAS, 26 Aralık 2005, 19:15:13

JOKERAS

pic c ile tek tus start/stop

selam arkadaşlar :ben elektronikle uğraşıyorum.
elektronik bilgim fena sayılmaz ama programlama ile ilgili
fazla bir bilgim yok.şu an bazı kitaplarla pic programlama  ya
çalışıyorum ama daha en basit bir led i tek bir butonla yakıp söndüremedim. aslında kod çalışıyor ama kararlı değil .
yani tuşa basar basmaz led yanıyor . ama tusa tekrar bastığım zaman
sönmüyor bazen yanıyor bazen yanmıyor  bir kararzızlık var .
acaba bu konu ile ilgili yardım edecek arkadaşlar varsa
yardım edebilirmisiniz teşekkür ederim .yazdığım kod aşağıda.

#include<pic.h>
#define svic RA1// RA1 svic adlı bir ğişkene atandı
      // RA1 (18) nolu bacak 10 k dirençle
      // 5 volt a bağlanmış tuş basılınca
      // RA1(18) bacak şaselenecek şekilde
      // ayarlanmış.
main(void)
{
               TRISA=1;
   TRISB=0;
   svic=1;
   {
   if(svic==0)
   {
      RB1=1;// RB1(7) nolu bacağa led bağlanmış

   while(svic==0);
   }
   if(svic==0)
   {
      RB1=0;
   
   while(svic==0);
   }
   }
}
dediğim gibi bu kod çalışıyor ama kararlı değil.
tuşa basınca bazen yanıyor bazen yanmıyor .
ilgilenen arkadaşlara şimdiden teşekkür ederim.

Erol YILMAZ

Hosgeldin JOKERAS,

Anlattigin durum butonun mekanik problemlerinden kaynaklanmaktadir.
Yani buton cikisi cok kararli bir sekilde 1 ve 0 olmaz.  Gecis asamasinda birkac kez konum degistirir.

Yani buton 0 iken basalim ve sonucu gorelim.

000000000000001010100110011111111111111111

Gordugun gibi. 0 dan 1 e gecis cok basit olmuyor biraz karmasik.
Ama bu sure cok kisa belki 5-10 mS. Tabii PIC bu degisimi bahsi gecen zaman araliginda binlerce kez okuyabilir.
Onun icin butonda okudugun her degisiklikten sonra mesela 20 mS sure ile PIC in okuma rutinini geciktirmen gerekiyor.

JOKERAS

Alıntı yapılan: "Erol"Hosgeldin JOKERAS,

Anlattigin durum butonun mekanik problemlerinden kaynaklanmaktadir.
Yani buton cikisi cok kararli bir sekilde 1 ve 0 olmaz.  Gecis asamasinda birkac kez konum degistirir.

Yani buton 0 iken basalim ve sonucu gorelim.

000000000000001010100110011111111111111111

Gordugun gibi. 0 dan 1 e gecis cok basit olmuyor biraz karmasik.
Ama bu sure cok kisa belki 5-10 mS. Tabii PIC bu degisimi bahsi gecen zaman araliginda binlerce kez okuyabilir.
Onun icin butonda okudugun her degisiklikten sonra mesela 20 mS sure ile PIC in okuma rutinini geciktirmen gerekiyor.
ilgilendiğin çok teşekkür ederim .
onu düşündüm ama kod olarak yapamadım mümkünse kodu yazabilirmisn ...

Erol YILMAZ

Hi-tech dosta calismasi ve fonksiyon fakiri olmasi sebebi ile tarafimdan kullanilmiyor. Onun yerine CCS i tavsiye ederim. CCS i kullaninca Hi-Tech ile ugrasmayacaksin. Onun icin CCS icin ornek bir kod yazdim.
Derleyicisini bulup deneyebilirsin. Ayrica CCS te cok fazla ornek te var.
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)

#define TUS    PIN_B0
#define LED    PIN_B3

void main()
{
output_low(LED);
delay_ms(100);

   while(TRUE)
   {
      if(input(TUS)==0)             // Tusa bastigin an !
      {
         output_toggle(LED);
         delay_ms(20);

         while(input(TUS)==0);      // Tusu birakincaya kadar bekle !        
      }
   }
}


Kodu denemedim ama mantigi anladiysan istedigin gibi duzeltip kullanabilirsin...

Digimensch

@erol
Bende CCS ögrenmeye karar verdim cünkü Kod akisi tam anlayacagim mantikta.
Acaba senden rica etsem bana CCS icin gerekli derleyeciyi Full olarak indirebilecegim bir Link verirmisin?
Yada elinde varsa herhangi bir yere yükleyebilirmisin?
saygilarimla

kurumahmut

senide CCS başlığına alalım aradığın orda....hehe

JOKERAS

selam erol dediğin gibi CCS derleyicisini buldum
ve yazmış olduğun kod u küçük bir editleme yaparak çalıştırdım
ve şu an mükemmel tam istediğim gibi oldu sana çok teşekkür ederim.

***saygılar ***

#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)

#define TUS    PIN_A1
#define LED    PIN_B1

void main()
{
output_low(LED);
delay_ms(200);

  while(TRUE)
  {
     if(input(TUS)==0)             // Tusa bastigin an !
     {
        output_toggle(LED);
        delay_ms(200);

        while(input(TUS)==0);      // Tusu birakincaya kadar bekle !
     }
  }
}