Forum: Ders Arası RSS
Karaşimşek kodunda hata
Sayfa:  1  2  sonraki 
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Karaşimşek kodunda hata
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.
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şu şekilde denedin mi?
writefln("Ikili   : %.8b", veri);
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.
Kadir Can #4
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
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 mesaj Kadir Can tarafından değiştirildi; zaman: 2012-07-15, 14:37.
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ö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);
    }
}
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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); 
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #9
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İş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));
}
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Tam incelemedim ama herhalde işaretli türün değerini sağa kaydırdığın için oluyordur.

Çözümler:

  • >>> işlecini kullan

  • 'unsigned' bir tür kullan; işaretli türlerin en soldaki biti sağa kaydırmada değerini korur.

  http://ddili.org/ders/d/bit_islemleri.html

(Bunun geçerli bir nedeni var: öyle olunca sağa kaydırma işlemi sıfırdan küçük sayılarda da yarıya bölme anlamına gelir.)

Ali
Avatar
Salih Dinçer #11
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #12
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Maalesef ushort ve işaretsiz sağa kaydırma işleci kullanmama rağmen gene aynı durum oluşuyor.
import std.stdio;
import giriscikis;
import core.thread;
 
void karaŞimşek(ushort adres, ushort veri, ushort beklemesüresi = 500)
{
    for (int i = 1; i < 4; ++i) {
        veri = cast (ushort) (veri << 1);
        yaz (adres, veri);
        writefln("Ikili   : %b", veri);
        Thread.sleep(dur!"msecs"(beklemesüresi));
    }
 
    for (int i = 1; i < 4; ++i) {
        veri = cast (ushort) (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
        */
        ushort adres = 0x0378;
 
        /*
            göndereceğimiz veri
        */
        ushort 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);
     }
}
acehreli (Moderatör) #13
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Linux için de 1 ile ilklersem ilk mesajındaki sonuçları görüyorum:

        ubyte veri = 1;

Bir de 8 genişlikte gösterdim:

    writefln("Ikili   : %08b", veri);


Ikili   : 00000001
Ikili   : 00000010
Ikili   : 00000100
Ikili   : 00001000
Ikili   : 00000100
Ikili   : 00000010
Ikili   : 00000001
Ikili   : 00000010
Ikili   : 00000100
Ikili   : 00001000
Ikili   : 00000100
Ikili   : 00000010
Ikili   : 00000001
Ikili   : 00000010
Ikili   : 00000100
Ikili   : 00001000
Ikili   : 00000100
Ikili   : 00000010
Ikili   : 00000001


Ali
Kadir Can #14
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bana sorun işaret sorunu değil gibi geliyor. short türü 16 bit, 16. bit işaret biti ama biz burada sadece ilk 4 biti değiştiriyoruz. Bu konuda atladığım bir yer mi var acaba?
Avatar
Salih Dinçer #15
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Başka işletim sisteminde denemekte fayda görüyorum. Eğer Linux ise bir de Windows'a bakmalı. Ayrıca kaydırma işlemi yapmak şart mı? Sanırım bu bir ödev ve farklı yöntemler kullanmamak gerekiyor...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  sonraki 
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 13:02:11 (UTC -08:00)