LADDER ve CCS C bilenlere örnekli soru.

Başlatan Melih1802, 17 Haziran 2014, 11:34:26

Melih1802

Ekran alıntısından' da anlaşılacağı gibi 2. satırda bir ( mavi çerçeve içinde ) bir şart var.
Bu şart gerçekleşirse alttaki satırın çalışması engelleniyor.

Soru şu: CCS c de bir şart gerçekleştiğinde işaretlenmiş satırların çalışmasını engelleyecek bir komut varmıdır.
Bir satırın başına "  //  " eklendiğinde bu satır(lar) çalışmıyor program burayı atlıyor,  bende böyle bir konut istiyorum.

Sorumda anlaşılmayan bir yer varsa açıklayabilirim.


Alıntıyı tıklayın tam görünmüyor.


Melih1802

Nasıl eklemem lazım.

Böyle yaptım olmadı;

#include "16f877a.h"
#FUSES XT,NOWDT


void main()

{
bool B0_OUTPUT = D0_INPUT;
bool B1_OUTPUT = (!B0_OUTPUT) && (D1_INPUT)
}

kimlenbu

eğer işlemler bir şarta göre yapılacaksa "if" ile kontrol etmen lazım c'de.

misal

if(Y0==1)
{
//eğer kontak kapalıysa işlemler
}
else
{
//eğer kontak açıksa işlemler
}

Salih

#3
Tam karşılığını şöyle yazabiliriz.

if (input(Pin_B0)) output_high(Pin_C0); else output_low(Pin_C0);
if ((input_state(Pin_C0)&&(input(Pin_B1))) output_high(Pin_C1); else output_low(Pin_C1);


Burada
input_state()


Çıkış olarak ayarlanmış ilgili pinin çıkış özelliğini bozmadan değerini öğrenmek için kullanılır.

Melih1802

#4
Alıntı yapılan: kimlenbu - 17 Haziran 2014, 12:19:10
eğer işlemler bir şarta göre yapılacaksa "if" ile kontrol etmen lazım c'de.

misal

if(Y0==1)
{
//eğer kontak kapalıysa işlemler
}
else
{
//eğer kontak açıksa işlemler
}


Bu yapmıştım fakat sürekli çıkış vermesi gerek bir pin bir satırda yanıyor bir satırda sönüyor. İşte bunu engellemek için satır atlatmayı sordum.

mesaj birleştirme:: 18 Haziran 2014, 02:40:23

Alıntı yapılan: salih - 17 Haziran 2014, 12:28:53
Tam karşılığını şöyle yazabiliriz.

if (input(Pin_B0)) output_high(Pin_C0); else output_low(Pin_C0);
if ((input_state(Pin_C0)&&(input(Pin_B1)) output_high(Pin_C1); else output_low(Pin_C1);


Burada
input_state()


Çıkış olarak ayarlanmış ilgili pinin çıkış özelliğini bozmadan değerini öğrenmek için kullanılır.

Üstad sanırım bu kodlarda sürekli çıkış vermesi gereken yerde ledi yakıp söndürecek.




mesaj birleştirme:: 17 Haziran 2014, 12:52:23

İstediğimin tam anlaşılmadığını düşünerek yeniden yazıyorum.

Senaryo;

D0, D1, D2, D3, D4, D5 giriş.  ( buton )
B0, B1, B2, B3, B4, B5 çıkış.    ( led )

- D0 basılı tutulduğu sürece B0 yanacak,
- D0 basılıyken D1, D2, D3, D4, D5 basılırsa B0 sönecek,

- D1 basılı tutulduğu sürece B1 yanacak,
- D1 basılıyken D0, D2, D3, D4, D5 basılırsa B1 sönecek,

- D2 basılı tutulduğu sürece B2 yanacak,
- D2 basılıyken D0, D1, D3, D4, D5 basılırsa B2 sönecek,

- D3 basılı tutulduğu sürece B1 yanacak,
- D3 basılıyken D0, D1, D2, D4, D5 basılırsa B3 sönecek,

.
.
.
.
.
.
.
.

Böyle devam edecek....

sadogan

@Melih1802
input ve output ların doğrluk tablosunu verebilirmisiniz.

Salih

Üstad senin verdiğin ladder diyagramının tam ccs karşılığını yazdım.
Ama sen başka bir şey kast ediyorsan ben anlamadım herhalde.
Ayrıca ladder'da satır atlama komutları var.

Melih1802

#7
Derleyici hata verdi.



mesaj birleştirme:: 18 Haziran 2014, 03:19:31

Alıntı yapılan: sadogan - 17 Haziran 2014, 12:54:00
@Melih1802
input ve output ların doğrluk tablosunu verebilirmisiniz.



" D " Giriş..      " B " Çıkış..




Salih

Bir parantez eksik kapatmışım örnekte düzelttim.

sadogan

#include <16f877a.h>       
#fuses XT,NOWDT,PUT,NOPROTECT, noBROWNOUT,NOLVP 
#use delay(clock=4000000)

void main()
{
    unsigned int8 buton,but_test;
    setup_CCP1(CCP_OFF); 
    setup_CCP1(CCP_OFF);
     set_tris_b(0b00000000);
     set_tris_d(0b00111111);
   while(TRUE)
   {
     buton=input_d()&0B00111111; //butonları okuduk
     but_test=0;
     for(int8 i=0B00100000;i>0;i>>=1) 
     {
        if(i&buton) but_test++;  // basılı butonları sayalım.
     }
     if(but_test==1) // yanlızca bir butona basılı ise
     {
         output_bit(PIN_B0,input(PIN_D0));
         output_bit(PIN_B1,input(PIN_D1));
         output_bit(PIN_B2,input(PIN_D2));
         output_bit(PIN_B3,input(PIN_D3));
         output_bit(PIN_B4,input(PIN_D4));
         output_bit(PIN_B5,input(PIN_B5));          
     }
     else // birden fazla butona basılı veya hic butona  deyilse
     {
         output_low(PIN_B0);
         output_low(PIN_B1);
         output_low(PIN_B2);
         output_low(PIN_B3);
         output_low(PIN_B4);
         output_low(PIN_B5);
     }

      
   }
}


program anlatıgınızı yapıyor
Dogruluk tablosu anlatığınızdan farklı d5 diğer çıkışlarla aktif oluyor

Melih1802

#10
Derleyici burada hata verdi. Henüz yolun başında olduğumdan bazı sorunları çözemiyorum. Affola.





Edit: :) Aslında bu başlık bu konu ile ilgili açtığım (çaktırmayın) 3. başlık. Aynı senaryo altında boğmak istemedim. Daha sadeleştirerek anlatmaya çalıştım aslında temel mantık aynı.


sadogan

Sanirim deryeiciniz eski versiyon

   unsigned int8 buton,but_test,i;
for(i=0B00100000;i>0;i>>=1)

Bu 2 satırı bu şekilde değiştirin.

Melih1802

#12
#include <16f877a.h>       
#fuses XT,NOWDT,PUT,NOPROTECT, noBROWNOUT,NOLVP 
#use delay(clock=4000000)

void main()
{
       unsigned int8 buton,but_test,i;
for(i=0B00100000;i>0;i>>=1) 
    setup_CCP1(CCP_OFF); 
    setup_CCP1(CCP_OFF);
     set_tris_b(0b00000000);
     set_tris_d(0b00111111);
   while(TRUE)
   {
     buton=input_d()&0B00111111; //butonları okuduk
     but_test=0;
     for(int8 i=0B00100000;i>0;i>>=1) 
     {
        if(i&buton) but_test++;  // basılı butonları sayalım.
     }
     if(but_test==1) // yanlızca bir butona basılı ise
     {
         output_bit(PIN_B0,input(PIN_D0));
         output_bit(PIN_B1,input(PIN_D1));
         output_bit(PIN_B2,input(PIN_D2));
         output_bit(PIN_B3,input(PIN_D3));
         output_bit(PIN_B4,input(PIN_D4));
         output_bit(PIN_B5,input(PIN_B5));          
     }
     else // birden fazla butona basılı veya hic butona  deyilse
     {
         output_low(PIN_B0);
         output_low(PIN_B1);
         output_low(PIN_B2);
         output_low(PIN_B3);
         output_low(PIN_B4);
         output_low(PIN_B5);
     }

      
   }
}



Doğrumu yaptım.




mesaj birleştirme:: 17 Haziran 2014, 14:53:26

Yeni versiyon derleyici indirebileceğim çalışan bir link varmıdır.

sadogan

#include <16f877a.h>       
#fuses XT,NOWDT,PUT,NOPROTECT, noBROWNOUT,NOLVP 
#use delay(clock=4000000)

void main()
{
    unsigned int8 buton,but_test,i;
    setup_CCP1(CCP_OFF); 
    setup_CCP1(CCP_OFF);
     set_tris_b(0b00000000);
     set_tris_d(0b00111111);
   while(TRUE)
   {
     buton=input_d()&0B00111111; //butonları okuduk
     but_test=0;
     for(i=0B00100000;i>0;i>>=1) 
     {
        if(i&buton) but_test++;  // basılı butonları sayalım.
     }
     if(but_test==1) // yanlızca bir butona basılı ise
     {
         output_bit(PIN_B0,input(PIN_D0));
         output_bit(PIN_B1,input(PIN_D1));
         output_bit(PIN_B2,input(PIN_D2));
         output_bit(PIN_B3,input(PIN_D3));
         output_bit(PIN_B4,input(PIN_D4));
         output_bit(PIN_B5,input(PIN_B5));          
     }
     else // birden fazla butona basılı veya hic butona  deyilse
     {
         output_low(PIN_B0);
         output_low(PIN_B1);
         output_low(PIN_B2);
         output_low(PIN_B3);
         output_low(PIN_B4);
         output_low(PIN_B5);
     }

      
   }
}

Yanlış olmuş 2 satırda değişiklik yapmak gerekiyor doğrusu yukarda
derleyemessen
buda hex hali
:1000000000308A000428000003081F39830083168B
:100010001F149F141F159F1107309C008313F0308D
:100020008312970597050030831686003F308800BD
:10003000FF308800831208083F39A100A201203058
:10004000A300A30803192B2823082105031DA20AD6
:100050000310A30C2128220B662883160814831290
:10006000081834280610352806148316061088143C
:10007000831288183D2886103E2886148316861021
:1000800008158312081946280611472806158316F5
:1000900006118815831288194F2886115028861555
:1000A0008316861108168312081A58280612592832
:1000B00006168316061286168312861A6128861281
:1000C00062288616831686127F28831283160610EE
:1000D000831206108316861083128610831606116B
:1000E0008312061183168611831286118316061257
:1000F000831206128316861283128612831618281C
:0201000063009A
:02400E00313F40
:00000001FF
;PIC16F877A
;CRC=24D1  CREATED="17-Haz-14 14:37"

link ccs full indir kanusunda olacak.

Melih1802

Üstad program derlendi. Bir müsait zamanında satırların yanına açıklama yazarmısın. Benim için henüz karmaşık.