commodore.gen.tr

Genel Kategori => Proje => Konuyu başlatan: Simon (Özay Turay) üzerinde Nisan 24, 2014, 13:38:32 ÖS



Konu Başlığı: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 24, 2014, 13:38:32 ÖS
Kablolu ve kablosuz PS2 joysticklerini çakma Arduino Pro Mini kullanarak JAMMA sistemine bağlama projem çalışır vaziyete geldi, ben de sizlerle paylaşmak istedim.

OuxVxuQ_wD0
https://www.youtube.com/watch?v=OuxVxuQ_wD0 (https://www.youtube.com/watch?v=OuxVxuQ_wD0)

Çalışanlar:

Alıntı
* Açılışta EEPROM'dan tuş sıralamasını okuma (videodan görülebilir)

* Varsayılan tuş sıralamasının EEPROM'a yazılması (video çekerken tek elle L1+L2+L3+R1+R2+R3 tuş bileşimine basmak zor olduğundan videoda yok)

* Tuşlara basma ve bırakma eylemleri (ledlere yavuzg'nin pull-up direnç tekniğiyle bağlandı, JAMMA konnektörüne bağlandığında ters voltaj vermeyecek)

* Led ile durum bildirimi (1 yanıp sönme kontrolcü bulundu hata yok, 2 yanıp sönme kontrolcü bulundu ancak analog mod çalışmıyor, 3 yanıp sönme kontrolcü bulundu fakat komut kabul etmiyor, 4 yanıp sönme kontrolcü bulunamadı)

* Seri porttan durum bildirimi (videoda görülüyor, hata ayıklama amaçlı kullanılabilir)

Yapılacaklar:

Alıntı
* Sol Analog Stick kullanımı eklenecek (çok basit birşey ama başka şeylerden sıra gelmedi)

* Tuş Sırası Programlama modu L1+L2+R1+R2+Select+Start kombinasyonuyla girilecek, her tuşu kaydettiğinde led yanıp sönecek, önceden kaydedilen tuşa tekrar basılırsa kabul etmeyecek (bu biraz çetrefilli)

Görüş, öneri ve tebriklerinizi esirgemeyin. :D


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: atlantis üzerinde Nisan 24, 2014, 13:52:47 ÖS
Videoyu indirdim bakacam müsait zamanda. Bende dedim bu ara kimsenin sesi çıkmıyor acaba neler geliyor diyordum :D


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 24, 2014, 14:52:05 ÖS
YouTube'a upload yapamıyorum. Akşam evden tekrar denicem.

Bu arada videoyu öğlen arasında iş yerinde çektim. :D


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: yavuzg üzerinde Nisan 24, 2014, 15:46:23 ÖS
simon hadi hayırlısı, tebrik ediyorum seni, azmin ve sabrın zaferi :)

şu tuşların yeniden programlanması ve uC üzerindeki eprom'a kaydedilmesi işine bir türlü vakit ayıramıyordum, senin bu özelliği koyman iyi olmuş. Bi ara vakit ayırıp ben de koyayım benim koda...


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 24, 2014, 16:11:53 ÖS
Programlama modu tam bitmedi bitince kaynak kodunu paylaşıcam abi. Zaten Arduino'nun EEPROM.h dosyasını değil avr/eeprom.h dosyasını kullandığım için aynı kodlar Atmel Studio ile de çalışacaktır. ;)


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: wizofwor üzerinde Nisan 24, 2014, 16:17:17 ÖS
Kodları C ile mi yazıyorsun Özay?


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 24, 2014, 16:48:31 ÖS
Evet C ile yazılıyor, ancak Arduino kütüphaneleri kullanıldığından Arduino'ya özgü fonksiyonlar var (genelde kullanılan fonksiyonlar pinMode, digitalWrite, digitalRead, analogWrite, analogRead).


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: cengizermis üzerinde Nisan 24, 2014, 17:37:43 ÖS
@Simon youtube a 1 haftadır upload yapılamıyor DNS ayarı ile. Ama Cyberghostla yavaş da olsa yapılıyor.


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 24, 2014, 18:42:11 ÖS
@Simon youtube a 1 haftadır upload yapılamıyor DNS ayarı ile. Ama Cyberghostla yavaş da olsa yapılıyor.

Söylediğin iyi oldu. YouTube hala kapalı mı yahu? Ben de sabahtan beri tırmalıyorum hep %0'da kalıyor. :D


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: cengizermis üzerinde Nisan 24, 2014, 19:33:53 ÖS
@simon kapalı kapalı. ben de arkadaşın bilgisayardan birşeye bakarken farkettim.


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 24, 2014, 20:10:17 ÖS
Evde Comodo DNS'in adreslerini modeme girmiştim tabletten YouTube açabilmek için, sorunsuz upload etti. :)

İlk mesaj güncellendi.


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: cengizermis üzerinde Nisan 24, 2014, 20:55:36 ÖS
onu nası yapcez :)
var mı link?


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 25, 2014, 01:34:18 ÖÖ
Modeme göre değişiyor DNS girme bölümü. Bilgisayarlardan ayrı, tabletlerden ayrı ayar yapmak yerine bir tek modemden yapıyorsun DNS ayarlarını sorun kökten çözülüyor. ;)

Misal benim modemde ayar şöyle:
(https://dl.dropboxusercontent.com/u/18575245/%23CGTr/ModemDNS.png)


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: cengizermis üzerinde Nisan 25, 2014, 11:22:54 ÖÖ
çok iyimiş denenmeli. uploada yardımcı olacaksa :)


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 27, 2014, 01:34:52 ÖÖ
Bu akşam Amiga 500 ile deneme yaptım. Elimde 9 pin dişi port olmadığı için bir ucu erkek diğer ucu dişi dupont kablolarla yukarı, aşağı, sol, sağ, X, 5V ve GND için gerekli bağlantıları dişi uçları direk joystick portuna erkek uçları ise breadboarda girerek yaptım.

(http://cdn.instructables.com/FCI/OJ5R/GFMC89XW/FCIOJ5RGFMC89XW.MEDIUM.jpg)

Cortex Floppy Emulator ile de P.P.Hammer yükledim, çok güzel oluyor zahmetsizce yüklemek. Ya ben paslanmışım ya da üşenmeyip analog için kodu yazmanın zamanı gelmiş. D-Pad ile çaprazlara atlamak çok zor. :D


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 29, 2014, 11:37:11 ÖÖ
Analog olayını (aynı anda hem sol analog ile hem de d-pad) hallettim, 7DX'e getiricem. Joystick'im olmadığı için Turbo Chameleon 64'de kullanıcam.

Biri analog (true/false) diğeri digital (0-127/128-255) iki kriteri veya işlemine tabi tutmak ne zormuş meğer, lise 1 mantık dersine geri dönüp doğruluk tablosu yapmak zorunda kaldım resmen. En son olmayana ergi yöntemiyle hallettim. :)

Tuş programlamaya da kastım biraz. Önce kendi kendini çağıran (rekursif) fonksiyon denedim olmadı, fonksiyon içinde label ve goto kullandım yine olmadı. C bilgisine güvenen partide yanaşsın da belki birlikte çözeriz. :D


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: wizofwor üzerinde Nisan 29, 2014, 11:49:04 ÖÖ
Tam olarak yapmak istediğin nedir? Bir tuşa basmanı bekleyecek ve bunu L1,L2 diye sırayla kaydedecek değil mi.

Örneğin L1 tuşuna bastığında çağrılan fonksiyonu yazabilir misin?



Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: ozkano üzerinde Nisan 29, 2014, 11:55:07 ÖÖ
@özay birde analog kısmı amiga moue u olarak adapte etsene


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 29, 2014, 12:11:42 ÖS
Programlama moduna girince ilk basılan tuş jamma 1 olacak, ikinci tuşa basıldığında jamma 2 olacak fakat jamma 1 için basılan tuşa basarsan kabul etmeyecek ve ikaz ışığı yanıp sönecek. Bu şekilde 6 tuş için devam edecek.

Kullanılan tuşun kontrolü için bir dizi kullanıyorum. Kodun buton sırası kaydı ile ilgili kısmı şöyle son durumda ama çalışmıyor.



// Default Pins Connected To JAMMA Controller

#define JAMMA_NONE     2

#define JAMMA_UP       3
#define JAMMA_DOWN     4
#define JAMMA_LEFT     5
#define JAMMA_RIGHT    6

#define JAMMA_COIN     7
#define JAMMA_START    8

#define JAMMA_BUTTON1  9
#define JAMMA_BUTTON2  10
#define JAMMA_BUTTON3  11
#define JAMMA_BUTTON4  12
#define JAMMA_BUTTON5  18  // A4
#define JAMMA_BUTTON6  19  // A5

int ButtonArray[16][3] =  // Default Button Order & States
{
//  PS2X BUTTONS     JAMMA BUTTONS  STATE
//  ------------     -------------  -----
  { PSB_PAD_UP,     JAMMA_UP,       false },
  { PSB_PAD_DOWN,   JAMMA_DOWN,     false },
  { PSB_PAD_LEFT,   JAMMA_LEFT,     false },
  { PSB_PAD_RIGHT,  JAMMA_RIGHT,    false },
  { PSB_SELECT,     JAMMA_COIN,     false },
  { PSB_START,      JAMMA_START,    false },
  { PSB_CROSS,      JAMMA_BUTTON1,  false },
  { PSB_CIRCLE,     JAMMA_BUTTON2,  false },
  { PSB_SQUARE,     JAMMA_BUTTON3,  false },
  { PSB_TRIANGLE,   JAMMA_BUTTON4,  false },
  { PSB_R1,         JAMMA_BUTTON5,  false },
  { PSB_R2,         JAMMA_BUTTON6,  false },
  { PSB_R3,         JAMMA_NONE,     false },
  { PSB_L1,         JAMMA_NONE,     false },
  { PSB_L2,         JAMMA_NONE,     false },
  { PSB_L3,         JAMMA_NONE,     false }
};

int JAMMADefaults[6] = { JAMMA_BUTTON1, JAMMA_BUTTON2, JAMMA_BUTTON3, JAMMA_BUTTON4, JAMMA_BUTTON5, JAMMA_BUTTON6 }; // Default JAMMA Button Order

boolean RecordStates[6] = { false, false, false, false, false, false }; // Default Record States

boolean UsedButtons[6] = { false, false, false, false, false, false }; // Default Used Buttons For Programming Mode


// Wait For Button Press and Record It To Specified Index

void RecordButton(int index)
{
  startover:
  for (int i=0; i<6; i++)
  {
    if (Controller.ButtonPressed(ButtonArray[i+6][0]))
    {
      if (!UsedButtons)
      {
        ButtonArray[i+6][1] = JAMMADefaults[index];
        UsedButtons = true;
        RecordStates[index] = true;
        #ifdef DEBUG
          DebugPrint("Button Recorded:  ", index, i+6);
        #endif
      }
    }
  }

  if (RecordStates[index])
  {
    BlinkLed(STATUS_LED, 1);
    #ifdef DEBUG
      DebugPrint("Used or Wrong Button");
    #endif
  }
  else
  {
    goto startover;
  }
}

    if (Controller.Button(PSB_L1) && Controller.Button(PSB_L2) && Controller.Button(PSB_START))
    {
      RecordButtonOrder();
      WriteButtonOrder();
      #ifdef DEBUG
        DebugPrint("Buttons Recorded");
      #endif
    }



Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 29, 2014, 12:14:20 ÖS
@özay birde analog kısmı amiga moue u olarak adapte etsene

Özkan iyi fikir, o dediğini yapabilirsem bu projenin kırpılmışı olacak olan PS2X_DB9 projesine ekleyebiliriz. Sağ analog ve tetikleri fare yapıp çift DB9 ile güzel proje olur. :)


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: wizofwor üzerinde Nisan 29, 2014, 12:53:47 ÖS
Mesela default olarak PSB_CROSS'u JAMMA_1'e ayarlamışsın ya. Kodun programlanabilir tuşlar olmayan versiyonunda PSB_CROSS'a bastığında çağrılan bir event handlar olması lazım. O event handler'ı merak etmiştim.

Pointer kullanarak yapmayı düşündün mü? Çok daha kolay olabilir.



Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 29, 2014, 13:04:40 ÖS

void SetJAMMAButton(int pin, boolean pressed)
{
  if (pressed)
  {
    pinMode(pin, OUTPUT);  // Connect JAMMA Button To Ground
  }
  else
  {
    pinMode(pin, INPUT);  // Switch To Hi-Z State To Mimic Not Connected
  }
}

    // Check Left Analog Stick
   
    if ((Controller.Analog(PSS_LY) > 108) && (!Controller.Button(ButtonArray[0][0])))
    {
      ButtonArray[0][2] = false;
      #ifdef DEBUG
        // DebugPrint("Released: ", 0);
      #endif
    }
    else
    {
      ButtonArray[0][2] = true;
      #ifdef DEBUG
        DebugPrint("Pressed: ", 0);
      #endif
    }

    if ((Controller.Analog(PSS_LY) < 148) && (!Controller.Button(ButtonArray[1][0])))
    {
      ButtonArray[1][2] = false;
      #ifdef DEBUG
        // DebugPrint("Released: ", 1);
      #endif
    }
    else
    {
      ButtonArray[1][2] = true;
      #ifdef DEBUG
        DebugPrint("Pressed: ", 1);
      #endif
    }

    if ((Controller.Analog(PSS_LX) > 108) && (!Controller.Button(ButtonArray[2][0])))
    {
      ButtonArray[2][2] = false;
      #ifdef DEBUG
        // DebugPrint("Released: ", 2);
      #endif
    }
    else
    {
      ButtonArray[2][2] = true;
      #ifdef DEBUG
        DebugPrint("Pressed: ", 2);
      #endif
    }

    if ((Controller.Analog(PSS_LX) < 148) && (!Controller.Button(ButtonArray[3][0])))
    {
      ButtonArray[3][2] = false;
      #ifdef DEBUG
        // DebugPrint("Released: ", 3);
      #endif
    }
    else
    {
      ButtonArray[3][2] = true;
      #ifdef DEBUG
        DebugPrint("Pressed: ", 3);
      #endif
    }

    // Check Button Presses and Releases By Button Order
   
    for (int i=4; i<16; i++)
    {
      if (Controller.ButtonPressed(ButtonArray
  • ))
      {
        ButtonArray[2] = true;
        #ifdef DEBUG
          DebugPrint("Pressed: ", i);
        #endif
      }

      if (Controller.ButtonReleased(ButtonArray
  • ))
      {
        ButtonArray[2] = false;
        #ifdef DEBUG
          DebugPrint("Released: ", i);
        #endif
      }
    }

for (int i=0; i<16; i++) SetJAMMAButton(ButtonArray[1], ButtonArray[2]);



Normalde 4'ten başlayan döngü de 0'dan başlıyordu ama analog için 0,1,2,3'ü ayırdım.

Bir de en sondaki tek satırlık döngü yerine yukarıdaki döngülerdeki true veya false yaptığım yerlerde direk SetJAMMAButton çağırabilirim ama game loop tekniklerinden bunun daha iyi bir yöntem olduğunu düşünüyorum.


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Nisan 29, 2014, 13:05:20 ÖS
Pointer'lar konusuna pek hakim değilim maalesef. :(


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: wizofwor üzerinde Nisan 29, 2014, 13:14:41 ÖS
C'yi okuldan beri hiç kullanmadım hatırlamam biraz zor oluyor. Hatırladığım kadarıyla pointer 6502'deki indirect adressing tarzı bir şey. Değer olarak bir başka değişkenin bellek adresini tutuyor. Pointer değişince değişken de değişiyor. Aynısının tersi de geçerli.

Bu tuş programlama işini pointerları değiştirerek kolayca halledebilirsin gibi.


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: i_r_on üzerinde Haziran 05, 2015, 03:55:33 ÖÖ
Bir hort da ben yapayım bari :)

PS2 ve PS1 kollarını jamma'ya uyarlayan devre kullanılıp bu kolları başka yerlerde kullanmaya çalışıyorsun anladığım kadarıyla. Doğru mu anlamışım?

C'deki pointer mevhumu tam baş belasıdır bu arada. Belleğin herhangi bir bölgesine erişmek mümkün olduğu için. İsteyince güzel ancak programın bug'ı dolayısıyla istenmeyen yerlere erişildiğinde sıkıntı yaratır.

Pointer'ın kendi içeriğinin (adres içeriği) değiştirilmesi anlamında diğer değişkenlerden farkı yoktur. Ancak diğer değişkenlerden farklı olarak özel bir işlevleri vardır. İçerikleri bellek adresleridir ve hangi tipte verinin pointer'ı olduklarına göre 1'er artıp azaldıklarında aslında kaç byte artıp azaldıkları da değişir.

Özel işlevleri olduğundan özel syntax'ları da vardır. Bir Pointer'ın işaret ettiği değere ulaşmak için pointer'ın başına * konur. Benzer şekilde bir pointer'a bir değişkenin değerini adres olarak koymak yerine pointer'ın artık bu değişkene işaret etmesini sağlamak için de & sembolü kullanılır.

8 byte bellek kullanan program düşünelim. Bellek alanı ile program alanı farklı olsun. Integer'ların 2 byte yer tuttuğunu düşünelim. (Arduino uno'daki ATMEGA328 gibi, tabii orada bellek 2KB)
Kod:
int *p; //pointer tanımlanırken başına * koyuluyor pointer olduğunu ifade etmek için.
int value = 100;

Program buraya kadar çalıştığında belleğin durumu şöyle

Kod:
|_0_|_0_|100|_0_|_0_|_0_|_0_|_0_|
____p_____value___________________
value değişkeni int, iki byte'da saklandığını varsayalım. p başta NULL yani C literatüründe 0 değerine sahip. herhangi bir adres set edilmedi p'ye. Adreslerin de iki byte'da tutulduğunu varsayalım. ki bütün bunlar işlemciden işlemciye değişir aslında. Yine bir integer değerin hangi byte dizilimi ile saklanacağı da endianness olarak geçer ve bazı işlemcilerde (atmega da bunlardan) yüksek anlamlı byte düşük anlamlı byte'tan önce saklanır. yani little endian.

şu çalışsın bundan sonra, value değişkeninin bellekte tutulduğu adresi p pointer'ına koy demek.

Kod:
p = &value;

bellek görünümü şöyle oldu,
Kod:
|_2_|_0_|100|_0_|_0_|_0_|_0_|_0_|
____p_____value___________________

ilk adresin 0'dan itibaren başladığını düşünürsek value değişkeni 2 adresinde. p değişkenine bu adresi set etmiş olduk.

şimdi şöyle yaparsak,

Kod:
*p=255;
*(p+1) = 256;
*(p+2) = 512;

ne yapmış olduk? p'nin gösterdiği adresteki değeri 255 yap. p'nin bir işaretlediği int lokasyondan bir sonraki int lokasyonun değerini 256 yap. bir sonrakini de 512 yap.

Kod:
|_2_|_0_|255|_0_|_0_|_1_|_0_|_2_|
____p_____value___________________

bu arada p'nin kendi değerini yani hangi adresi işaret ettiğini hiç değiştirmedik. onu değiştirince bellek görüntüsü aşağıdaki gibi oluyor.

Kod:
p = 4;


|_4_|_0_|255|_0_|_0_|_1_|_0_|_2_|
____p_____value___________________


dikkat edilirse p'nin eski gösterdiği değere bir şey olmadı.

peki en sonunda *(p+1) değerini yazdırmak istesek nereye erişiriz?

p'nin değeri 4, buna 1 tane int ekleyelim yani 4 + 1*sizeof(int) = 4 + 1 * 2 = 6. 6. konumdaki integer'ın değeri 512, bu değeri gösteririz.

Temelde mantık bu. Pointer tü kakadır falan ama sonrasında gelen dillerde de işlevleri kullanılmıştır. Misal .net'te data tipleri temelde ikiye ayrılır value tipler ve reference tipler şeklinde. Bunlardan ikinci tipte olanlar temelde pointer gibi davranırlar ancak bu dillerde artık kafanıza göre bu referanslara doğrudan adres set etmenize artık izin verilmez.

C'de pratikte en çok işe yaradıkları yerler veri yapılarıdır, ağaçlar, listeler, linkli listeler vesaire. Ne tip kullanımlarda elzem oluyorlar derseniz şunu derim. Belleğe değişkenler öbeği değil de veri öbeği olarak bakmak istediğinizde pointer'lar size büyük esneklik sağlıyor. Sallıyorum dört tane değişik tipte değişkeni belleğe arka arkaya koydunuz. Değişkenlerle güzel güzel erişiyorsunuz. Fakat hepsini bir byte array içerisine yedeklemek istediniz diyelim. Pointer olmadan nasıl yaparsınız?

Kod:
short x = 5; 
int y = 3;
long z = 1000000;
byte yedek[7];

yedek[0] = (byte) x;
yedek[1] = (byte) y>>8;
yedek[2] = (byte) y&255;
....
....

şeklinde her birini byte bileşenlerine ayırmanız lazım (4 byte tutan long'u yazmaya üşendim),

pointer ile şu şekilde kolayca yaparsınız,

Kod:
byte *p = &x;
for (int i = 0;i<7;i++) {
 yedek[i] = *p++;
}


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: scorpion üzerinde Haziran 05, 2015, 07:57:20 ÖÖ
süpersin kardeşim...


Konu Başlığı: Ynt: PS2X_JAMMA - Arduino Versiyonu
Gönderen: Simon (Özay Turay) üzerinde Mart 24, 2020, 09:40:15 ÖÖ
Kaynak kodunu eklerim demişim ama PCB işlerine dalınca bu öksüz kalmış. ::)

İlk mesaja kaynak kodu eklendi. Tuş programlama özellikleri çalışmıyor ama bu özelliğin kırpıldığı Lite versiyon kullanılabiliyor diye hatırlıyorum. ;)