877 sorgulama hatası

Başlatan xxlxxl, 06 Aralık 2011, 11:25:30

xxlxxl

if(temp=='a')   // gelen veri  a ise
      {
         //Su islemleri yap
         output_bit(PIN_A3,1);
         output_bit(PIN_A2,0);
         temp=0X00;
      }

yukarıda verilen örnekte gelen veri a olarak geliyor bu gelen veriyi a b c şeklinde nasıl tanımlarız bride alt alt alta tüm pinler için if deyimleri yaptığımda ilk 2 led yandı fakat diğerleri yanmadı 30 defa gönderdikten sonra bir led yandı



enable_interrupts(GLOBAL);
while(true)
{  enable_interrupts(int_rda);
if((getc()=='1') & (getc()=='1'))
{temp=0X00;
output_bit(PIN_B0,1);
}
if((getc()=='2') & (getc()=='1'))
{temp=0X00;
output_bit(PIN_B1,1);
}

şeklinde örnek yaptım fakat 1 1 gönderiyorum led yanıyor 2 1 gönderiyorum B1 yanmıyor 2 1 verisini peş peşe 10 defa gönderince yanıyor işin içinden çıkamadaım ISIS de deniyorum

Kabil ATICI

bu tür konular benimde sorunum olmuştu. Bunu da basitçe şöyle çözmüşktüm.

Çünkü eğer gelen verilerin sıralamasında bir hata olursa işlemci gelen komutu hata olarak görür. Bazen bizden veya programdan kaynaklanabilen hatalar olabiliyor

(assembler kullandığımdan mantik farklı olabilir) gerektiğinde bunu bit işlemleri ile birlikte kullanıyorum.

1. veri için veriyi bir tampon belleğe atıyorum.  (daha doğrusu istediğim veri gelmişse değişkene benim belirlediğim bir değer atıyorum)böylece 2. veri geldiği zaman sadece o tamponla birlikte karşılaştırıyorum. Böylece gelene ikinci veri sistem için geçerli değilse tambon belleği siliyorum.

burada dikkate ettiğim nokta ilk gelen verinin mümkün olduğu kadar 2. veri grubunun dışında kalmasıdır.  (tabii bu bir ölçüm sonucu iletmekte bazı sorunlara yol açabiliyor).
ambar7

xxlxxl

hocam bişi anlamadım bir örnekle açıklarmısnız tek istediğim şu ben pc den gönderdiğim bilgiye dataya göre led yakmak tek gönderimli datalarda sorun yok mesela 1 datasını gönderdiğim zaman veya A led yanıyor fakat  a ve b bilgisine denk gelen ledi yakamıyorum illaki 30 defa göndermek gerek basit bir uygulama yokmu saygılarımla

basitçe kod aşağıda.

if((getc()=='2') & (getc()=='1'))
{temp=0X00;
output_bit(PIN_B1,1);
}

neden 21 datasını 30 defa göndermek zorundayım led yanması için

Kabil ATICI

değişken ak olsun.
ak=0 olsun

gelen 1. veriyi karşılaştır uygun ise ak=1 olsun

sonraki gelen veri ile birlikte ak karşılaştır.
bu durumda ak=1 olduğundan önce grup oluşturup ak=1 için karşılaştır sonraki karşılaştırmaların sadece 2. veri için olur.
pek programlama kurallarına uymadan



if ak='1'
{
if veri='1'
{
...
}
if veri='2'
{
...
}
...
ak='0'
veri=' '
}

if veri='t'
{
ak='1'
}

burudaki t verisinin 2. gelen veri aralığının dışında seçtiğinizi varsaymak yerinde olur.

her seferinde işlemciye her iki veriyi aynı anda test ettirmek aslında baya yüksek iş yükü getirebilir.

ambar7

xxlxxl

#4
hocam güzel fakat yine bişi anlamadım maruz görün beni bunu ccs ye uyarlanmış hali nasıl olucak kafam durdu
tam uyarlanmış hali nasıl olucak

xxlxxl

hocam neden cevap gelmiyor analdım bu kadar adam bilmiyor nasılsa ne yaprsan yap mı oldu şimdi yukarda açıklaması olan koda neden bir örnek verilmiyor........

Kabil ATICI

main başlığı altında
int ak, veri
ak=='0'



while başlığı altında

veri=getc()  //kesme başlığı altında gerçekleştirilebilir
if (ak=='1')
{
if  (veri=='1')
{
komutların
}
else if (veri=='2')
{
komutların
}
else if (veri=='3')
{
komutların
}
ak=='0'
}

if (veri=='t')
{
ak=='1'
}

en azından bir fikir verebilir..
ambar7

xxlxxl

hocam bişi sormak istiyorum ben rs232 den 2 haneli bilgi gönderiyorum örnek : ab pic bunu algılamasını istiyorum fakat mevcut kodlarda nedense olmuyor olsada sorun oluyor burdada tek haneli veriler geliyor sanırım denicem şimdi

xxlxxl

int ak=0;
int veri;
void main()

   while(true)
//output_bit(PIN_B0,1);
veri=getc()  //kesme başlığı altında gerçekleştirilebilir
if (ak=='1')
{
if  (veri=='1')
{

}
else if (veri=='2')
{

}
else if (veri=='3')
{

}
ak=='0'
}

if (veri=='t')
{
ak=='1'
}
}
     


olmuyor mevcut kodların aynısı benim istediğim analataamdım ehrhalde gelen verileri alt alta if değimlerini alt alta sıraldığım zaman bri komutun işlemesiiçin göderdiğim datayı en az 30 defa göndermek zorunda kalıyorum   

xxlxxl

arkadaşlar ccs de yazılmış bir örnek varmı .... lütfen ... fikir vercek tüm kodalrı denedim olmuyor sizin fikir diye vermiş olduğunu kodlar denenmeden etmeden koyuluyor koymayın çalışır denenmiş örneklere ihtiyacım var ben oturup burda deniyorum ama verilen kodalr denenmeden etmeden konuyor olmuyor...


istediğim şu örnek:  ab komutunu algıladığı zaman led1  / b c komutunu aldığı zaman led2 yansın

gelen veri 2 adet özellikle belirtiyorum lütfen fikir verici kod koyulmaşın çalışır uygulama gönderilen ver data 2 veya fazla ola bilir .. tek haneli datalarda sıkıntı yok sıkıntı 1 den fazla datası olanalrda örnek uygulama koyun lütfenn fikir kodlar koymayın

xxlxxl

 c = getc();   // Wait for a key to be pressed.
if(c=='1')
{
output_high(PIN_B1);// b1 açık
}
else if(c == '2')
{
output_high(PIN_B2); // b2 açık b1 kapat
}
else if(c == '3')
------------------------------------------------------------ bu kodda sıkıntır yok


if((getc()=='4') & (getc()=='0'))  bu kodda sıkıntı var 40 gönderdiğim zaman led yanıyor fakat bu sorgulama alt alta koyduğum zaman çokolduğu zaman ledler yanmıyor bir ledi yakana kadar 30 defa 40 komutunu gönderiyorum hangi data geliyosa oled yansın umarım anlata bildim


Kabil ATICI

aslında işin başında sormam gerekirdi, seri porttan gelen veriyi nasıl alıyorsun, kesme ile mi?
Kesme (interrupt) kullanmıyorsan sen kontrol edene yani gelen veriyi işleyene kadar gönderdiğin verileren sonraki ilk gelen verinin üzerine yazar.

Özellikle uzun if kontrol rutinleri bu işlemin aksamasına neden olabilir. bu nedenle her ikisi aynı olan 1,1 ve 2,2 gibi veri grupları kolayca işlenebilir. ama 1,2 gibi veri grubu ise ancak şansa kalmıştır.
ambar7

xxlxxl

hocam kaynak kodu gönderiyim size isterseniz ama benim istediğim sonuç enden istediğim ledi yakamıyorum onu anlamadım tek adet li datalarde sorun yokm ama çift gönderdiğim datalarda sorun var farklı bir yol yöntem