Jump to page: 1 2 3
Thread overview
Karaşimşek kodunda hata
Jul 15, 2012
erdem
Jul 15, 2012
Salih Dinçer
Jul 15, 2012
Kadir Can
Jul 15, 2012
erdem
Jul 15, 2012
Salih Dinçer
Jul 15, 2012
erdem
Jul 15, 2012
Salih Dinçer
Jul 15, 2012
erdem
Jul 15, 2012
Salih Dinçer
Jul 15, 2012
erdem
Jul 15, 2012
Kadir Can
Jul 16, 2012
Salih Dinçer
Jul 16, 2012
erdem
Jul 16, 2012
erdem
Jul 16, 2012
huseyin
Jul 16, 2012
Salih Dinçer
Jul 16, 2012
erdem
Jul 16, 2012
erdem
Jul 15, 2012
erdem
July 15, 2012
import std.stdio;
import core.thread;

void karaŞimşek(short adres, short veri, short beklemesüresi = 500)
{
   for (; veri < 8; ) {
       veri = cast (short) (veri << 1);
       writefln("Ikili   : %.4b", veri);
   }

   for (; veri > 1; ) {
       veri = cast (short) (veri >> 1);
       writefln("Ikili   : %.4b", veri);
   }
}

void main()
{
   short veri = 0b0001;
   short adres = 0b0000;
   writefln("Ikili   : %b", veri);

   for (int i = 0; i < 3; ++i) {
     karaŞimşek(adres, veri);
    }
}

Bu haliyle çalışıyor. @erdem, affına sığınarak bende giriscikis kütüphanesi olmadığınden derleyebilmek için bazı noktaları sildim.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2012
import std.stdio;
import giriscikis;
import core.thread;

void karaŞimşek(short adres, short veri, short beklemesüresi = 500)
{
   for (int i = 1; i < 4; ++i) {
       veri = cast (short) (veri << 1);
       yaz (adres, veri);
       writefln("Ikili   : %b", veri);
       Thread.sleep(dur!"msecs"(beklemesüresi));
   }

   for (int i = 1; i < 4; ++i) {
       veri = cast (short) (veri >> 1);
       yaz (adres, veri);
       writefln("Ikili   : %b", veri);
       Thread.sleep(dur!"msecs"(beklemesüresi));
   }
}

void main()
{
   version (linux)
   {

       /*
           paralel portun adresi
       */
       const uint adres = 0x0c000;

       /*
           göndereceğimiz veri
       */
       ubyte veri = 0b_11111111;
       erişimhakları(adres, 1, 1);
   }

   version (Windows)
   {

       /*
         paralel portun adresi
       */
       short adres = 0x0378;

       /*
           göndereceğimiz veri
       */
       short veri = 0b_00000001;
   }

   yaz(adres, veri);
   Thread.sleep(dur!"msecs"(500));
   writefln("Ikili   : %b", veri);

   for (int i = 0; i < 3; ++i) {
     karaŞimşek(adres, veri);
    }
}

Bu kodun ledleri Micheal Knight'ın arabası Karaşimşek gibi bir sağa bir sola yakıp söndürmesi gerekiyor. Ne cümle oldu ama :-)

Normalde bit kaydırma işleminin de şu şekilde gerçekleşmesi gerekiyor.

'0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
0 1 0 0
0 0 1 0'

Ama programın gerçek çıktısına baktığımızda:

'Ikili : 1
Ikili : 10
Ikili : 100
Ikili : 1000
Ikili : 10000'

normalde gelmemesi gereken değerlere taşdığını görüyoruz. Sizce sorun ne olabilir.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2012

Şu şekilde denedin mi?

writefln("Ikili   : %.8b", veri);

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2012

Alıntı (Salih Dinçer):

>
> writefln("Ikili   : %.8b", veri);
> ```

>

Evet bu kod gösterim açısından daha güzelmiş ama uygulamada gene 'Ikili   : 10000' değerine taşıyor. Acaba tür dönüşümü kullandığımız için mi..

Aslında teker teker değerleri ikili olarak gönderdiğim zaman kod çalışıyor. Ama o  da çok uzun bir kod oluyor ve gereksiz kod tekrarı yapmış oluyoruz.

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
July 15, 2012

Öncelikle yazdığın kodu beğendiğimi söylemeliyim. Hatta bazı kısımlarını kullanacağım :)

Ama uygulamada bir kere ledleri yakıyor ondan sonra takılıp kalıyor.

'Ikili : 0001
Ikili : 0010
Ikili : 0100
Ikili : 1000
'

Sorunun ya iş parçacığıyla, ya tür dönüştürmeyle ya da for döngüsünün kapsamı ile ilgili olduğunu düşünmeye başladım :rolleyes:

Aslında benim de paralel port üzerinde denemeden önce yazdığım kod senin koduna çok benziyor ve bu da çalışıyor.

import std.stdio;
void karaŞimşek (short veri)
{
   for (int i = 1; i < 4; ++i) {
       veri = cast (short) (veri << 1);
       writefln("Ikili   : %.4b", veri);
   }

   for (int i = 1; i < 4; ++i) {
       veri = cast (short) (veri >> 1);
       writefln("Ikili   : %.4b", veri);
   }
}

void main()
{
   short veri = 0b_00000001;
   writefln("Ikili   : %.4b", veri);

   for (int i = 0; i < 5; ++i) {
       karaŞimşek (veri);
   }
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2012

Eğer 8 bitlik (adetlik) ışıkları kaydırarak (SHL ve sonra SHR) yakacaksanız ubyte veya char kullanmalısınız. Tabi LED adetini bilmiyorum belki de short işinizi görüyordur. Önerim char kullanmanız çünkü bazı yerlerde tür dönüşümü gerekmeden çalıştığını (faydalarını) gördüm.

Bu arada, af buyrun buradaki sorunu hala net olarak anlamış değilim...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2012
extern (C)
{
   void Out32(short PortAddress, short data);
   short Inp32(short PortAddress);
}

Maalesef paralel porta erişmek için kullandığımız DLL dosyasında bu işlevler 'short' olarak tanımlandığı için 'short' kullanmak gerekiyor.

4 tane led kullanıyoruz. Bilgisayarın paralel portundaki D0, D4 arası veri pinlerinin her birinin ucunda 220 ohm'luk dirençler bağlanmış. Onların uçlarında da birer tane led takılı. Ledlerin - uçları da toprağa bağlı.

Sorun şu ki teorik olarak çalışması gereken uygulamamız deneme kartı breadboard üzerinde çalışmıyor. Bir kere 1. ledden başlayarak 4. lede kadar ledleri yakıyor ve duruyor.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2012

Peki sadece 4 LED var o zaman hiç bir döngüye sokmadan 5 LED (5.'si bir önceki 3. LED) yapmayı denediniz mi? Yani sadece 5 satır yazacağız ve işleve sırayla 4 LED'i yaktıktan sonra karaŞimşek'deki gibi geri döndüğü (toggle) durumuna adım atacağız. Eğer burada bir sıkıntı yoksa aşağıdaki gibi bir şeyi deneyebilirsiniz. Şahsen ben olsaydım böyle yapardım tabi short gerekiyorsa char yerine değişiklik yapabilirsiniz:

import std.stdio;

char karaŞimşek(ref char LEDler, bool solaDön = true) {
   if(solaDön) LEDler <<= 1;
   else LEDler >>= 1;
   return LEDler;
}

void main() {
   char veri = 1; // Sadece en sağdaki LED yanıyor...
   bool xKay = true;
   uint xKez = 3;

   do {
     writefln("%.8b", karaŞimşek(veri, xKay));
     if(veri == 1 || veri == 128) {
       xKay = xKay ? false : true;     // toggle olayı...
       xKez--;
     }
   } while(xKez);
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2012

İşin ilginç tarafı paralel porta erişim sağlayan kütüphane tarafında da bir problem yok gözüküyor.

Örneğin biraz kod hamallığı yaparak karaşimşek işlevini bu şekilde yazarsak istediğimiz gibi çalışıyor.


void karaŞimşek(short adres, short veri, short beklemesüresi = 500)
{
   veri = 0b_00000010;
   yaz (adres, veri);
   writefln("Ikili   : %.4b", veri);
   Thread.sleep(dur!"msecs"(beklemesüresi));

   veri = 0b_00000100;
   yaz (adres, veri);
   writefln("Ikili   : %.4b", veri);
   Thread.sleep(dur!"msecs"(beklemesüresi));

   veri = 0b_00001000;
   yaz (adres, veri);
   writefln("Ikili   : %.4b", veri);
   Thread.sleep(dur!"msecs"(beklemesüresi));

   veri = 0b_00000100;
   yaz (adres, veri);
   writefln("Ikili   : %.4b", veri);
   Thread.sleep(dur!"msecs"(beklemesüresi));

   veri = 0b_00000010;
   yaz (adres, veri);
   writefln("Ikili   : %.4b", veri);
   Thread.sleep(dur!"msecs"(beklemesüresi));

   veri = 0b_00000001;
   yaz (adres, veri);
   writefln("Ikili   : %.4b", veri);
   Thread.sleep(dur!"msecs"(beklemesüresi));
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2012

Tamamdır, Ali hocam da katıldı ve şu son hamallıktan anladık ki bu sorun tür uyumsuzluğu. Hocama katılıyorum, bence de bizim işaretli değerlerden kurtulmamız lazım.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2 3