Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: Ugur2006 - 02 Eylül 2006, 22:02:39

Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ugur2006 - 02 Eylül 2006, 22:02:39
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.
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: SpeedyX - 02 Eylül 2006, 22:35:24
while içinde break; yazarsanız zaten çıkarsınız.

yada aynısı için;
while(x) {
..
x=false;
..
}
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ugur2006 - 02 Eylül 2006, 23:01:58
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?
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: vsalma - 02 Eylül 2006, 23:30:27
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.
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ugur2006 - 02 Eylül 2006, 23:35:42
Ben CCS'de yeniyim su etiket meselesini aciklarmisiniz?
Nasil yapmaliyim?
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: vsalma - 02 Eylül 2006, 23:59:05
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:
.
.
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: zafzaf82 - 03 Eylül 2006, 01:14:00
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.......
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ugur2006 - 03 Eylül 2006, 01:35:28
Iste olay bu !!   :D  :D
@zafzaf82
cok tesekkürler !!
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: zafzaf82 - 03 Eylül 2006, 01:44:28
@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;
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ziya - 03 Eylül 2006, 02:12:11
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.
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: zafzaf82 - 03 Eylül 2006, 02:39:18
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.
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ugur2006 - 03 Eylül 2006, 21:25:48
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
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ziya - 03 Eylül 2006, 22:52:58
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
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ugur2006 - 03 Eylül 2006, 23:01:59
@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
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ziya - 03 Eylül 2006, 23:48:57
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.
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ugur2006 - 04 Eylül 2006, 01:03:29
Cok tesekkür ederim.
Yarin bu PIC'den alip denemelerimi artik bu PIC ile devam ettireyim.
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: tnen - 04 Eylül 2006, 03:05:52
Bence RS 232 den gelen bilgiye gore birşeyler yapılacak ise burda UART kesmesi aktif yapılıp bununla ilgili kod yazmak daha uygun olur akadaslar . Siz ne dersiniz.
Başlık: While döngüsünden nasil cikabilirim?
Gönderen: Ugur2006 - 05 Eylül 2006, 01:25:53
Alıntı yapılan: "Ziya"
Bacak bağlantıları aynı. Port sayısı da aynı. İstersen 16F84 programlarını ufak bir ekleme ile çalıştırabilirsin (CMCON=7)

CCS Kodu icinde PortA nin bitlerini digital olarak kullanmak icin bu
CMCON=7  komutunu nereye yazmaliyim?
Söyle bir örnegin neresine yazmaliyim?

#fuses XT,NOWDT, NOPROTECT
#include <16F628.h>
#use delay(clock=4000000)
#use rs232(baud=9600,rcv=PIN_A1,xmit=PIN_A0,parity=N,bits=8)

#FUSES NOWDT                 //No Watch Dog Timer
#FUSES INTRC                 //Internal RC Osc
#FUSES NOPUT                 //No Power Up Timer
#FUSES NOPROTECT             //Code not protected from reading
#FUSES NOBROWNOUT             //No brownout reset
#FUSES NOMCLR                 //Master Clear pin used for I/O
#FUSES NOLVP                 //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD               //No EE protection


void main()
{
................
..........
.....
}


Birde dahili RC osilotor kullanmak istedigimde ben bunu yine kodun neresinde belirtmeliyim?