Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: selvi - 08 Eylül 2014, 13:50:19

Başlık: ic ice if dongusu
Gönderen: selvi - 08 Eylül 2014, 13:50:19
  programda 5 tane ard arda kosul sorgulamasini yapmak istiyorum.gelen bilgi ilk 5 kosuldan birini  sagliyorsa program delay_ms(100) komutunu islesin eger gelen bilgi ilk bes kosuldan herhangi birini saglamiyorsa program :rx_data(); fonksiyona dallansin.case komutuyla olabilecegini dusunuyorum ama ben if komutuyla yapmak istiyorum.asagidaki sekilde  yazilabilir mi?degilse nasil yazilabilir?


              if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x05 ))       
              {
                  LED_RX=LED_RX^1;   
              }
                else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x12 ))       
                 {
                       LED_RX=LED_RX^1;   
                 }
                      else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x23 ))     
                      {
                            LED_RX=LED_RX^1;
                      }
                            else if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x09 ))       
                            {
                                 LED_RX=LED_RX^1;
                            }
                                 else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x45 ))     
                                 {
                                      LED_RX=LED_RX^1;
                                  }
                   else
                   {
                     rx_data();     // restart Rx when data is not correct.*//
                    }
             delay_ms(100);
code]
Başlık: Ynt: ic ice if dongusu
Gönderen: Gökhan BEKEN - 08 Eylül 2014, 14:01:50
Öyle olmaz. İlla iç içe olacaksa böyle olmalıdır. Ama iç içe if kullanmak pek hoş görükmüyor.

if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x05 ))       
{
if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x12 ))       
{
if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x23 ))     
{
if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x09 ))       
{
if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x45 ))     
{
                                      LED_RX=LED_RX^1;
}
}
}
}
else
{
rx_data();     // restart Rx when data is not correct.*//
}

delay_ms(100);



Bu arada bu şartlar hiç bir zaman sağlanamaz ilk iki if birbirine ters çünkü
rx_buf[4] değişkeni aynı anda hem 0x05 hem 0x12  olamaz.
Başlık: Ynt: ic ice if dongusu
Gönderen: selvi - 08 Eylül 2014, 14:11:47
  hocam  vericiden butonlara basildiginda aliciya gelen 5 farkli bilgi.bu bilgiler en iyi nasil duzenlenebilir?ic ice if dongusu kullanmak zorunda değiliz.
   kosullardan once asagidaki gibi bir sorgulama var:
  for(i=0;i<5;i++)      // cal Checksum
           chksum += rx_buf[i];
 
Başlık: Ynt: ic ice if dongusu
Gönderen: Gökhan BEKEN - 08 Eylül 2014, 23:35:28
Önce şartın gerçekleşmesi neye bağlı onu tam bilelim.
Gündelik dille anlatın,
mesela:
Alıntı Yap"chksum" değişkeni "rx_buf[4]" değişkenine eşit olduğunda
"rx_buf[0]" değişkeni "0x05" ,"0x12" ,"0x23"  değerlerinden biri olursa
ve aynı zamanda falanca filancaya eşit olursa şart sağlansın
gibi birşey söyleyin

"Alıcıya gelen 5 farklı veri" derken, bu veriler nedir? Hangi veriler gelirse geçerli olacak, bunu yazın.
Bana şu şekilde söyleyin:
Alıntı Yap
butona basınca şu veriler geliyor:
0x23 0xAF 0xE7 0x87 0x42
Başlık: Ynt: ic ice if dongusu
Gönderen: hasankara - 09 Eylül 2014, 01:04:30

if(chksum == rx_buf[4] ){ // chksum uyusur ise
   if( (rx_buf[0] == 0x05) || (rx_buf[0] == 0x12) || (rx_buf[0] == 0x23) || (rx_buf[0] == 0x09) || (rx_buf[0] == 0x45))
   {// dizinin ilk hucresi istenen degerlerden biri ise
   LED_RX=LED_RX^1;
   delay_ms(100);
   } else { // dizinin ilk hucresi istenen degerlerden biri degil ise
   
   }
} else {// chksum uyusmaz ise
rx_data();
}

Başlık: Ynt: ic ice if dongusu
Gönderen: Karamel - 09 Eylül 2014, 01:12:42
hasan hocam aralarda veya degilde ve olmasi gerekmezmi? && ?
Başlık: Ynt: ic ice if dongusu
Gönderen: Kabil ATICI - 09 Eylül 2014, 01:17:52
yazım doğru . gerçi arada farklı bir veri var ama genel olarak doğru.
Ortak olan chksum, diğerleri genel olarak "veya" işlemi . Kullanıcı kendine göre düzenleyebilir.
Başlık: Ynt: ic ice if dongusu
Gönderen: selvi - 09 Eylül 2014, 08:22:20
  vericide 5 tane buton var.her butona basildiginda 5 paket bilgi gonderiyor.her butonun gonderecegi paket bilgileri farklidir.ornegin 1.buton:{0x12,0x13,0x14,0x15,0x54}
asagidaki kod paket bilgilerin ilk dort bilgisinin toplamini ifade edeiyor.alicilar gelen  kodu kontrol ederken soyle bir sart sorgulamasi yapiyor.
[for(i=0;i<4;i++)      // cal Checksum
           chksum += rx_buf[i];code]

alicilar gelen  kodu kontrol ederken soyle bir sart sorgulamasi yapiyor.yani paket bilgilerden 4 tanesini toplamini chksum degiskenine ataniyor.sonrasinda paketteki 5.bilgi ile paketin ilk dort bilgisi esit mi diye bir sorgulama yapiyor.
[code]chksum == rx_buf[4] /code]

program alicilardan gelen bilgileri sorguluyor ona gore ledi yakiyor.programda 5 tane ard arda kosul sorgulamasini yapmak istiyorum.gelen bilgi ilk 5 kosuldan birini  sagliyorsa program delay_ms(100) komutunu islesin eger gelen bilgi ilk bes kosuldan herhangi birini saglamiyorsa program :rx_data(); fonksiyona dallansin.asagidaki sekilde duzenledim.bu yonlu farkli cevaplarda geldi.bahsettigimi tam karsilamiyor.
[code]
Kod: [Seç]
              if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x05 ))       
              {
                  LED_RX=LED_RX^1;   
              }
                else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x12 ))       
                 {
                       LED_RX=LED_RX^1;   
                 }
                      else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x23 ))     
                      {
                            LED_RX=LED_RX^1;
                      }
                            else if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x09 ))       
                            {
                                 LED_RX=LED_RX^1;
                            }
                                 else if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x45 ))     
                                 {
                                      LED_RX=LED_RX^1;
                                  }
                   else
                   {
                     rx_data();     // restart Rx when data is not correct.*//
                    }
             delay_ms(100);/code]
Başlık: Ynt: ic ice if dongusu
Gönderen: Kabil ATICI - 09 Eylül 2014, 10:25:42
else if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x09 ))   //bu satır doğrumu 5 tane veriden bahsediliyor

chksum == rx_buf[9] --->> ?
eğer bu satırda chksum == rx_buf[4]  ise !!!

if(chksum == rx_buf[4] )
{ // chksum uyusur ise
   if( (rx_buf[0] == 0x05) || (rx_buf[0] == 0x12) || (rx_buf[0] == 0x23) || (rx_buf[0] == 0x09) || (rx_buf[0] == 0x45))
{
delay_ms(100)
}
else
{
rx_data();
}
}

aslında olay VE ve VEYA işlemlerinin dağılma özelliği...
Başlık: Ynt: ic ice if dongusu
Gönderen: selvi - 09 Eylül 2014, 15:21:24
Alıntı yapılan: ambar7 - 09 Eylül 2014, 10:25:42
else if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x09 ))   //bu satır doğrumu 5 tane veriden bahsediliyor

chksum == rx_buf[9] --->> ?
eğer bu satırda chksum == rx_buf[4]  ise !!!

if(chksum == rx_buf[4] )
{ // chksum uyusur ise
   if( (rx_buf[0] == 0x05) || (rx_buf[0] == 0x12) || (rx_buf[0] == 0x23) || (rx_buf[0] == 0x09) || (rx_buf[0] == 0x45))
{
delay_ms(100)
}
else
{
rx_data();
}
}

aslında olay VE ve VEYA işlemlerinin dağılma özelliği...

eger kosul saglanmiyorsa da rx_data(); fonksiyona gitmeli.
if(chksum == rx_buf[4] )/code]

asagidaki sekilde olmaz mi?
[code]if(chksum == rx_buf[4] ){ // chksum uyusur ise
   if( (rx_buf[0] == 0x05) || (rx_buf[0] == 0x12) || (rx_buf[0] == 0x23) || (rx_buf[0] == 0x09) || (rx_buf[0] == 0x45))
   {// dizinin ilk hucresi istenen degerlerden biri ise
   LED_RX=LED_RX^1;
   } else { // dizinin ilk hucresi istenen degerlerden biri değil ise
   rx_data();
   }
} else {// chksum uyusmaz ise
rx_data();
}
delay_ms(100);
/code]