while(svic==0)

Başlatan alieren, 22 Şubat 2007, 16:06:54

alieren

while nin kullanimina iliskin soyle bir durum var.if ile svic durumunu kontrol ediyor.svic==0 olmasi anahtarin basili oldugunu gosteriyor.diger yandan while(svic==0) anahtarin birakildigini gosteriyor.ayni durum tanimlanmasina ragmen niye farkli durumlar.
#include <pic.h>
#define svic RA0
main(void)
(
    unsigned char sayi=0;
    TRISB=0;
    TRISA=1;
     PORTB=0;

     for(;;)
     (
               if(svic==0)
               (
                      sayi++;
                      PORTB=sayi;
                      while(svic==0);
                )
       )
)

Analyzer

Selam,

Farklı durumlar değil ki? svic değişkeninin değeri sıfır olduğu müddetçe while'ın  döngüsünü döndürür. Bu haliyle svic bir kez sıfır olduğunda if'in içerisine girecek while'a gelince orada dönüp duracak. svic değeri sıfırdan farklı olunca o döngüden çıkacak. svic değeri eğer buton tahrikli ise; butonu bırakıp tekrar basmadığın takdirde artmaz. Bir çeşit mühür yapmışsın.

Analyzer
Üşeniyorum, öyleyse yarın!

deserteagle

Sayın alieren hocamın verdiği koda benimde kafam takıldı.yeni pic öğrenmeye çalıştığımdandır herhalde.
Biz burada tek bir butonla bir dış kesme yapmışız bu koda göre fakat iki tane veya daha fazla buton kullanarak dış kesmeyi nasıl elde ederiz.Baya kafa yordum ama bulduğum algoritmalar kullanışsız geldi.Mesela 877 kullanarak artır azalt tusu olan sayıcı yapacağım ama kesmeler konusunda fazla bilgim yok.
Saygılarımla...

CLR

alieren ;

Eğer orada while olmasa sürekli olarak sayi registeri arttırılır ve PORTB'de gösterilmeye çalışılır fakat PORTB'de ışık saçmaya çalışan ledler görürsün
Ama hiç biri tam olarak yanmaz.Çünkü 1-2usn içinde ışık verebilecek led yoktur.

if(svic==0)                     // tuşa basıldı mı
(                                   // evet
   sayi++;                    // sayıyı bir arttır
   PORTB=sayi;            // sayıyı portb'de göster
   while(svic==0);        // switch 1 oluncaya kadar hiç bir şey yapma
   (                              // başka bir deyişle tuşu bırakıncaya kadar bekle
   asm("NOP");            //
    )
)
Knowledge and Experience are Power

alieren

sanirim anladim arkadaslar, ilgilerinize tesekurler.
tabi eger boyle değilse;
if(svic==0) 
( 
sayi++; 
PORTB=sayi; //svic 0 oldugu mudetce sayi artirilir ve portb ye atilir
//sonra ise

while(svic==0); //svic 0 ise sonsuz dongu olacak,ama yukarida 

// zaten 0 oldugu icin surekli sayi degiskenini artirma ile mesgul 
//durumda değilmi zaten.


yalniz soyle olsa gerek;

if(svic==0)             // svic 0 sa sayi bir artirilir portb ye atilir ve 
(                        // pesinden donguye girer, ta ki buton 1 yapilip   sayi++;            //yeniden   0 yapilana kadar, dongude kalir
PORTB=sayi; 
while(svic==0);

ikinci dedigim gibi olmasi gerektigini dusunuyorum, yanlis mi dusundum acaba?

Lütfen kodlarımızı verirken Code Tag ları içine alalım