While döngüsünden nasil cikabilirim?

Başlatan Ugur2006, 02 Eylül 2006, 22:02:39

Ugur2006

Arkadaslar,
ben bir while döngüsünden BCB'de bool tanimlayip bu tanimladigim degiskeni true yapiyor bu sekilde döngüyü olusturuyor sonra istedigim zaman while döngüsünden bu degiskeni false edip cikabiliyordum.
Söyle:
bool ugur=true; 
void whilestop(); //Whileyi durdur funksiyonu 
void main() // Ana funksiyon 
{ 
while(ugur) 
{ 
........... 
......... 
....... 
} 
} 

whilestop() 
{ 
ugur=false; // While döngüsü durduruluyor 
}  


Yukardaki BCB'de yaptigim islemi CCS'de nasil yapabilirim?
CCS'de while döngüsünden nasil cikabilirim? Forumda bir yazi buldum fakat birsey anlamadim.

SpeedyX

while içinde break; yazarsanız zaten çıkarsınız.

yada aynısı için;
while(x) {
..
x=false;
..
}

Ugur2006

While döngüsüne disardan müdehale ederek durdurmak istiyorum.
Örnegin While döngüsü su sekilde baslamis olsun
break;
komutu koyulmamais olsun.
While(true)
{
.........
.......
.....
}
Bu Whileyi döngüsünü nasil durdurabilirim?
Yapmak istedigim su:
Ben RS232 üzerinden 'a' karekteri yollayinca  PIC'e bagli Led sinyal vermeye basliyor.
Yani döngü icinde Led yanip sönüyor.
Simdi ben 'b' karekterini gönderince bu Döngü Dursun Led sönsün istiyorum.
Söyle bir kod yazdim:
#use standard_io(A)
#use standard_io(B)
#byte PortA=5
#byte portB=6


void sinyalver();
void stop();

int8 x=1;
void main() {
char gelen;
//printf("Lambayi Yakmak icin 1 Söndürmek icin 0 Giriniz.\r");
SET_TRIS_A(0b00010);
SET_TRIS_B(011011111);
PortA=PortB=0;
while(true)
{
gelen=getch();
switch (gelen)
{
//case 'a': output_high(PIN_B4);break;;
case 'a': sinyalver();break;;
case 'b': stop();break;;
}
}
}

void sinyalver()
{
While(x)
{
output_high(PIN_B4);
delay_ms(200);
output_low(PIN_b4);
delay_ms(200);
}
}
void stop()
{
if (x==1)
x=0;
else
return;
}


'b' karekterinin gelmesiyle Döngüyü nasil durdurmaliyim?

vsalma

Case deki mantıksal denetlemeden sonra goto kullanın. While ın dışına etiket verin bi tane. Güzel bir kod olmaz ama işinizi görür sanırım.

Ugur2006

Ben CCS'de yeniyim su etiket meselesini aciklarmisiniz?
Nasil yapmaliyim?

vsalma

asm veya basicde kullandığımız gibi ama programı oldukça yavaşlatır kod takibini zorlaştırır.

kullanım şekli:  
while(1){
 if(gelen == "b")         // burada gelen degiskeninin tipine dikkat edilmeli
 goto buradandevam;
}

.
.
.
buradandevam:
.
.

zafzaf82

while veya for döngülerinden çıkmanının en basit yolu break komutudur.
Şu şekilde yapabilirsin.
while(true)
{
     if(x==0)
     {
          for(;;)
          {
           output_high(PIN_B0);
           delay_ms(100);
           output_low(PIN_B0);
           delay_ms(100);
                  if(x==1) break;
           }
      }

      if(x==1)
      {
          for(;;)
          {
           output_high(PIN_B1);
           delay_ms(100);
           output_low(PIN_B1);
           delay_ms(100);
                  if(x==2) { x=0; break; }
           }
       }   
}

kolay gelsin.......
Mikroişlemci bi araçtır, amaç değil.....

Ugur2006

Iste olay bu !!   :D  :D
@zafzaf82
cok tesekkürler !!

zafzaf82

@Ugur2006 bişey değil....
aynı olay arkadaşların dediği gibi etiketlede yapılabilir.
tekrar:
     if(x==0)
     {
          for(;;)
          {
           output_high(PIN_B0);
           delay_ms(100);
           output_low(PIN_B0);
           delay_ms(100);
                  if(x==1) goto tekrar;
           }
      }

      if(x==1)
      {
          for(;;)
          {
           output_high(PIN_B1);
           delay_ms(100);
           output_low(PIN_B1);
           delay_ms(100);
                  if(x==2) { x=0; goto tekrar; }
           }
       }   
goto tekrar;
Mikroişlemci bi araçtır, amaç değil.....

Ziya

Alıntı yapılan: "Ugur2006"Iste olay bu !!   :D  :D
@zafzaf82
cok tesekkürler !!
while içerisinde bir de switch-case bloku açmış isen (yada if-elseif-elseif-...-endif) bir tane break ile muhtemelen case (if blokunu)blokunu kırarsın fakat while döngüsünden çıkamazsın. Her ikisinden de çıkabilmek için iki defa break; break; yapman gerekir.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

zafzaf82

Ziya hocam dogru söylüyosun zaten bende örnegi sadece while için vermiştim. swich case + while'den çıkmak için dediğin gibi 2 tane break gerekiyor.
Mikroişlemci bi araçtır, amaç değil.....

Ugur2006

Yukardaki Kodu verilen bilgiler seklinde söyle düzelltim.
#include <16F84A.h>
#include <string.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,PUT, NOPROTECT
#use rs232(baud=9600,rcv=PIN_A1,parity=N,bits=8)


#use standard_io(A)
#use standard_io(B)
#byte PortA=5
#byte portB=6

void main()
{
char x;
SET_TRIS_A(0b00010);
SET_TRIS_B(011011111);
PortA=PortB=0;

x=getch();
while(true)
{
     if(x=='0')
     {
          for(;;)
          {
           output_high(PIN_B4);
           delay_ms(100);
           output_low(PIN_B4);
           delay_ms(100);
                  if(x=='1') break;
           }
      }

      if(x=='1')
      {
          for(;;)
          {
           output_high(PIN_B5);
           delay_ms(100);
           output_low(PIN_B5);
           delay_ms(100);
                  if(x=='2') { x='0'; break; }
           }
       }
}
}


Serial Portdan Veri olarak '1' geldiginde  RB5'e bagli Led sinyal versin, Serial portdan '0' geldiginde RB4'e bagli Led sinyal versin istiyorum.
Su haliyle Program bir döngüye girdigi zaman diger bir döngüye girmiyor.
Yani söyle :
Simdi RS232'den bir '0' Karekteri gönderdigimde PIC bunu algiliyor ve RB4 ayagina bagli olan Led lambayi sinyal verdirmeye basliyor burda bir döngü basliyor.
Sonra ben RS232'den '1' karekterini yolladigimda , gelen karekteri Kod fark etmiyor bile.
Cünkü Döngüde.
Yani program Led'e sinyal verdirmek icin Döngüye girdiginde , artik RS232'den
gelen diger baska karekteri fark etmiyor.
iste bahsettigim Nokta bu.Programi döngüden cikartip baska bir döngüye yöneltmek nasil olacak.
Biz önce döngüye sokup RB4 ayagina bagli Lede sinyal verdirecegiz sonra bu döngüden cikip
RB5 ayagina bagli olan diger Lede sinyal verdirecegiz.
Hangi karekteri gönderiyorsam(1 veya 0) o karektere göre PIC islem yapsin istiyorum.
Devre icin DSN Dosyasi ve C kodunu buraya yükledim deneyip bana yardimci olmak isteyen devre falan cizimi icin zaman kaybetmememsi icin buraya hazirladim.
http://www.hemenpaylas.com/download/1489948/X_Y.rar.html

Ziya

Ugur,

Gönderdiğin DSN dosyan boş çıktı. Ben yenisini çizdim.

16F84 ile bu işi yapamazsın. Aradaki delayler nedeniyle bilgiyi okuyamazsın. Onun yerine 16F628 kullan. İçerisinde donanım uart motoru var. Kendi kendine gönderir alır. Güdümlü füzeler gibi "at ve unut" !

Çalışan program burada (hemenpaylas açılmadığı için rapidshare'e gönderdim)

http://rapidshare.de/files/31842878/X_Y.rar.html
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

Ugur2006

@ziya hocam tesekkür ederim.
Demek ki ben sabahtan beri bosuna ugrasmisim.
Neyse ögrendigim iyi oldu.
Ben bu konularda yeni oldugum icin 16F84 ile basladim.
En iyisidedigin gibi bir üst PIC'e gecmek.Onlarla devam etmek.
16F628'in 16F84 'e göre fazlaliklari nelerdir?
Bildigim kadari ile 2'den fazla Port var.
Ayni PIC16F84'e CCS ile yazdigim Komutlari PIC16F628'de yaptirabilirim değilmi?
saygilarimla

Ziya

Alıntı yapılan: "Ugur2006"16F628'in 16F84 'e göre fazlaliklari nelerdir?
Bildigim kadari ile 2'den fazla Port var.
Ayni PIC16F84'e CCS ile yazdigim Komutlari PIC16F628'de yaptirabilirim değilmi?
saygilarimla
Bacak bağlantıları aynı. Port sayısı da aynı. İstersen 16F84 programlarını ufak bir ekleme ile çalıştırabilirsin (CMCON=7)

16F628 de 2 K program alanı var. Donanımında CCM/pwm, uart motorları var. Bir de port A başlangıçta analog karşılaştırıcılar olarak ayarlı. Fakat CCS ile yazıyorsan CMCON=7 yapmana gerek yok. Kafadan PortA yı analog comparatör özelliklerini ayarlamazsan dijital io olarak düzeltiyor.

Son olarak, istersen kristal bağlamayıp, kristalin bağlandığı bacakları io olarak kullanabilirsin. Dahili 4MHz kristali (çok hassas olmamakla birlikte uart için yeterli) seçerek hem malzemeden tasarruf, hem de io pini kazanmış olursun. MCLR bacağını da isterseniz içeriden mclr up seçeneğini seçerek sadece input olarak kullanabilirsin. Üç adet timer'i var. Özellikle timer1 16 bitlik ve ilave olarak 3 bit postscaler var.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey