Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
Sayfa: [1] 2 3 4   Aşağı git
Yazdır
Gönderen Konu: C64 ARDUINO DMA  (Okunma Sayısı 26828 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« : Aralık 12, 2015, 13:08:28 ÖS »

Merhaba

C64 ve Arduino kullanarak BA sinyali DMA yapılmasıyla ilgili bir inceleme - çalışma notları aşağıdadır.

Buradaki amaç ;
1-C 64 DMA nın arduino kullanılarak  yapılmasının mümkün olup olmadığını anlamak, 16 MHZ işlemci ile DMA nın fiziki sınırların ne olduğunu incelemek.
2-Olabilecekse , temel bir yapı kurarak  DMA nın aşamalarını  mümkün olduğunca anlaşılır hale getirmek , daha ileri seviyede yapılabilecek diğer projeleri kolaylaştırmak.

Bu bir kartuş projesi değil. Daha çok  C64 DMA sını anlamaya çalışan bir inceleme. Sonuçlarını gördüğümüzde bir işe yarayıp yaramayacağı hakkında fikir sahibi olacağız.

DMA kısaca bir mikroişlemci sistemi adres ve data yollarının bir başka işlemci ( çoğu zaman bir dış işlemci ) tarafından kullanılmasıdır. (Direct Memory Access = Doğrudan hafızaya erişim). Bir mikro işlemci işlerini yazılım ile yapar. Yazılımlar ram ,rom hafızaları içinde bulunduğundan DMA yapan bir dış işlemci de çoğunlukla  ram hafızaya ulaşarak istediklerini yapar.

Burada kullanılan temel malzemeler  şunlar:
1-Klon arduino: AT 328p pu + 16mhz kristal+2X22pf kondansatör
2-C64 ile bağlantıyı sağlayacak expansion port bağlantı parçası
3-Logic analyzer
4-Entegreler 2X74HC374 +74HC245+ 1X7400, bir button

Öncelikle şunu söylemeliyim: elimizde kahve veya çay bardağı bazılarımız proje yapmaya devam eder bazılarımız sakin gözlerle yapılan projeleri inceler ve olası projeleri değerlendirirken, delimawinin  yanımızdan rüzgar gibi gelip geçtiğini gördük. Oturduğumuz sandalyeden az daha düşüyorduk. Delimawi teknolojinin cpld, logic analyzer.. gelişmiş olanaklarını kullanmanın hem gerekli hem de pek çoğumuz bakımından gecikmiş bir konu olduğunu, bunlar olmadan yapılacak işlerin (biraz) “eskide” kaldığını, bizlerin de bu yönüyle   geride kalmış olduğumuzu gösterdi. O nedenle uğraştığı proje(ler) sonrasında daha anlaşılır oldu ki “hiç bir şey artık eskisi gibi olamayacak”. Delimawi ‘yi birkez daha tebrik edeyim.

Tabi,klasik bilgiler olmadan üzerine gelenleri anlamak mümkün değildir, ayrıca,öncekilerin altından kalkanlar yeterli zamanı ayırabilirlerse yeni olanların da altından kalkarlar,şüphe yok.

Ben bu sürece Logic Analyzer tarafından başlamış oldum. Birkaç bin dolar fiyatı ile satın alınması mümkün olmayan bir cihazdır. Bazı sitelerdeki projelerde kullanıldığını gördüğümde biraz imrenerek bakardım.  Sadece profesyonel işlerde kullananların sahip olabileceği bir cihazdır. Delimawinin projesinde analyzer ekran görüntüleri olan biten her şeyi net anlatıyordu, internette bu markanın  fiyatları .., en ucuzu yine 999 dolar. Mümkün değil. Ama Sürpriz..! Bazı Analyzerların fiyatı birhayli düşük. Daha ayrıntılı aradığımda Çinlilerin yaptığı (klon?) 24 mhz lik 8 kanallı iş görür,kibrit kutusunden biraz küçük “hobbist level analyzer” fiyatının dışarıda 8-10 dolar olduğunu, PIC ile uğraşanların 4-5 sene önce bunları satın alıp kullanmaya başladıklarını gördüm. Bizde de bilinen satış siteleri 45-60 TL ye satıyorlar. Sinyal akışını, frekansını,high – low yüzdelerini,farklı sinyallerin birbirleriyle ilişkisini rahat rahat “karanlık odalara,kör kuyulara” düşmeden izleyebiliyorsunuz,olup biteni,hatanın nerede olabileceğini,yapmak istediğinizin başka şeylerle çakışmasını yada sınırların ne olduğunu.., özetle  digital hardware konuları  ile uğraşanlara övmekle bitirilemeyecek bir yardımcı cihaz. 
Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #1 : Aralık 12, 2015, 13:18:24 ÖS »

Logic Analyzer



* Logic Analyzer.JPG (221.6 KB, 800x600 - Görüntüleme: 2536 kez.)
« Son Düzenleme: Aralık 12, 2015, 18:37:51 ÖS Gönderen: Simon (Özay Turay) » Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #2 : Aralık 12, 2015, 13:22:23 ÖS »

Konuya dönersek;
Genel bilgi olarak DMA da kullanılan C64 expansion port pin yapıları ve iç ilişkileri aşağıdadır. (adres ve data bus larını göstermedim..)



*  (869.23 KB, 1286x1715 - Görüntüleme: 2654 kez.)
« Son Düzenleme: Aralık 12, 2015, 18:39:29 ÖS Gönderen: Simon (Özay Turay) » Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #3 : Aralık 12, 2015, 13:33:53 ÖS »

C64 DMA sını yapabilmek için 3 ayrı aşamayı yapmak gerekiyor.İlki DMA low sinyalini göndermek,6510’na kenarda kal,bir şeye karışma demek,ikincisi C64 RAM ‘e yazma veya okuma işlemini yapmak (şimdilik yazma ile ilgileniyoruz), üçüncüsü DMA low sinyalini kaldırıp her şeyi yine C64 6510 ‘a terk etmek.
Bu üç aşamaya yakından bakınca her sürecin  ardışık ama bağımsız olduklarını , birbirlerine müdahale etmediklerini gördüm. Bu şu anlama geliyor: aşamaları yaparken logic kullanmayabilirsiniz!?

1.AŞAMA DMA ‘ya GİRİŞ:

Butona basılmasıyla Bir arduino İNPUT pini(B2) start (low)sinyalini algılayarak DMA sürecini başlatıyor. İlk olarak BA nın LOW olması bekleniyor. Bu VIC entegresinin 6510 u adres ve data buslarından ayırması demek. BA Low ,Logic Analyzer da bakıldığında 43 mikro saniye kadar sürüyor. C64 1 mhz hızla yani bir clock peryodu 1 mikrosaniye olduğu düşünülürse 40+3 =43 cycle zaten 43 mikro sn olmalı. BA Low olduktan sonra 3 cycle beklemek lazım.  Normal koşullarda sayma işlemleri logic entegrelerle yapılır. Burada işi arduinonun yapmasını istedim; 3 cycle yani yaklaşık 3 mikrosniye sonrasında 40 cycle içinde bir yerde DMA sinyalini göndermek yeterli.Yaklaşık 5 mikrosaniyelik bir oyalanma ile DMA Kilit Low sinyalini göndermeyi tercih ettim.( İsteyen 5  mikro sn yerine daha ayrıntılı NOP lar kullanabilir.) Bu Low sinyali bütün işlerimizi tamamlayıp çıkıncaya kadar orada kalacak.

Şunu yapıyoruz:  Arduino’nun bir INPUT pini (C1) sürekli okuma ile BA yı izliyor ve onu Low olduğunu gördüğünde alt satıra geçip 5 mikrosn gecikme yapıyor. Bu da tamamlandığında alt satırda  başka bir arduino pini OUTPUT olarak(B0) low sinyalini C64 DMA pinine iletiyor. Bukadar. Böylece VİC in başlattığı 6510 izole sürecini biz uzatıp istediğimiz zamana kadar erteliyoruz.

3. AŞAMA  DMA’dan ÇIKIŞ : Bu aşamaya yazılım kendisi işlerini tamamlayıp bitirdikten sonra geliyor. Dışarıdan herhangi bir müdahale yok. Yapılan iş benzer. Yine BA sinyalini ve yine Low durumunu izliyoruz.Yukarıdaki aynı INPUT pini (C1) sürekli okuma yapıyor ve Low gördüğünde alt satıra geçip 5 mikrosn oyalanıyor. Ardından alt satırda  OUTPUT ile DMA Low sinyalini devam ettirmekte olan pini (B0) INPUT yapıyoruz. Bu işlem Arduino pininin C64 DMA ucu ile olan bağlantısını ‘koparıyor’. Arduino C64 DMA ucuna uyguladığı Low sinyalini kaldırmış oluyor. Serbest kalan 6510 tamamlanan BA( 43 cycle) sonrasında işine kaldığı yerden devam ediyor.

Aşağıdaki basit yazılım bu iki işlemi kapsıyor. Çalıştığında ekran görüntüsünde imleç donuyor, DMA’ya girdik yani,6510 izole edildi. Bir süre sonra imleç yanıp sönmeye devam ediyor,yani DMA dan çıktık. DMA dan çıkıldığında 6510 tekrar işleri eline alıyor, bu ara zamanı kullanarak bir toplama programı yazdım,ve run.., dma ya girildiğinde duruyor, sonra tekrar devam.. Aradaki uzun zamanlar imleç görselliğini ve programı yazmak için konuldu, aksi halde görebilmek mümkün değil. (Tabi analyzer görüntülerini saymazsak.., analyzer görüntüsünde DMA ya girildiğini  şöyle anlıyoruz R/W pini artık hiç low’a düşmüyor. R/W low , 6510 data bus’a data yazıyor demek. Sadece VİC çalışıyor, o da data yazmaz yalnızca okur, R/W high tarafındadır. Bundan sonra 6510 yerine dişarıdaki bizim mikroişlemcimiz arduino R/W low’u yaparak data bus’a (RAM’e) yazacak. (tabi , isterse okuma da yapabilir).
Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #4 : Aralık 12, 2015, 13:36:35 ÖS »

DMA giriş-çıkış programı

*  (29 KB - Yükleme: 272 kez.)
Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #5 : Aralık 12, 2015, 13:41:02 ÖS »

DMA GİRİŞ



*  (114.73 KB, 800x451 - Görüntüleme: 2520 kez.)
« Son Düzenleme: Aralık 12, 2015, 18:40:10 ÖS Gönderen: Simon (Özay Turay) » Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #6 : Aralık 12, 2015, 13:41:46 ÖS »

DMA ÇIKIŞ



*  (118.72 KB, 800x451 - Görüntüleme: 2539 kez.)
« Son Düzenleme: Aralık 12, 2015, 18:41:17 ÖS Gönderen: Simon (Özay Turay) » Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #7 : Aralık 12, 2015, 13:47:25 ÖS »

DMA Görseli

DMA GİRİŞ ÇIKIŞ

« Son Düzenleme: Aralık 12, 2015, 18:42:34 ÖS Gönderen: Simon (Özay Turay) » Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #8 : Aralık 12, 2015, 13:51:37 ÖS »

Buraya kadar işleri arduino yaptı.
Artık Bundan sonrası DMA nın en önemli 2. aşamasının yapılması.
Kullandığım Temel yapı şöyle Önce Arduino’nun pin konfigurasyonu:




*  (573.33 KB, 1055x1406 - Görüntüleme: 2582 kez.)
« Son Düzenleme: Aralık 12, 2015, 21:13:02 ÖS Gönderen: msvstpl » Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #9 : Aralık 12, 2015, 13:55:33 ÖS »

Hardware Şeması



*  (133.45 KB, 997x963 - Görüntüleme: 2649 kez.)
« Son Düzenleme: Aralık 12, 2015, 18:43:40 ÖS Gönderen: Simon (Özay Turay) » Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #10 : Aralık 12, 2015, 14:00:05 ÖS »

Hardware tarafında entegreler için bilinen klasik bir yapı kullandım; adres buslarını kilitleyip tutan 2adet 74374, Data bus’a datayı yazan (data yönünü seçerek hem yazma hemde okumaya olanak sağlayan) 74245. Burada  Logic kullanabiliriz;  1X7400 logic için.

Pin konfigürasyonunu oluştururken SPI ve I2C pinlerini Boş veya bu amaçla kullanabilmeye olanak sağlayabilecek şekilde düzenledim. Bir bellek veya master slave ilişkisi..vb. mümkün durumda.


* C64 ARDUINO DMA YAZMA PROGRAMI.doc (35.5 KB - Yükleme: 202 kez.)
Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #11 : Aralık 12, 2015, 14:03:58 ÖS »

Bu 2.aşamada Arduino yazılımla şunu yapıyor:

1-Önce acelesi olmadan bir INPUT pin ile (C1), BA nın HİGH olduğu, (VİC’in her şeyi eline aldığı BA low dışı) durumu bekliyor. Bu bölge 6510 ‘un kullandığı bölge. Onun yerine Arduino kullanacak. Yaklaşık 500 mikro saniyelik rahat bir bölge,( ayrıca yaklaşık7600 mikro saniyelik ayrı uzun bir bölge de var, hangisi olursa..).Bunu gördüğünde alt satıra geçiyor,Burada OUTPUT PB5 ve OUTPUT PB3 , her ikisi de low  yapılıyor. 74374’e adresler lowdan high’a geçerken yüklenebiliyor. Bunların hazırlığı.

2- PDO..PD7 ye alt adresi yazıyor ve bir high clock (PB5) ile alt adres(A0..A7) 1. 74374’e kilitliyor.

3-PD0..PD7 ‘ye bu kez üst adresi yazıyor ve bir high clock (PB3) ile üst adres(A8…A15) 2.74374’ e kilitliyor.

4-PD0..PD7’ye son olarak ( yukarıdaki adresteki C64  hafızasına konulacak) data yı yazıyor.Bu data 74245’ giriş pinlerinde beklemede..

Şimdi şöyle bir durum var;  iki 74374 de RAM adres değeri hazır. Data da hazır. Ama her üç entegrenin çıkışı yani C64 tarafı kapalı HI-Z durumunda. Buradan oraya, oradan buraya geçiş yasak.  Ama artık hazırlık tamamlandı C64’e bağlanmayı bekliyorlar.
 
Bundan sonrası şimdiye kadar yapılanların hepsini boşa çıkarabilecek kritik bir aşama. Belki de olmayacak ?

16Mhz işlemci hızlı olmaya dair bütün özelliklerini burada kullanacak.

5-Bir İNPUT Arduino pini (C0) C64 clock unu izliyor,onun High olmasını bekliyor.Bunu gördüğünde R/W pinini (B1) (OUTPUT Low) yapıyor. Bu Ram’e yazılacak sinyalinin C64’ e iletilmesi demek.(Farklı bir şey yapıyoruz; Arduino pinleri şimdiye kadar ya INPUT yada OUTPUT olarak kullanılmıştı. Pın (B1) INPUT (Low) olarak beklerken durum değiştirip OUTPUT haline getiriliyor. Diğer deyişle HI-Z de beklerken durumunu değiştirip C64’e Low sinyalini gönderiyor).
 
6- OE (Output Enable) low sinyalinin 2x74374 ve 74245 e gönderilerek onların C 64 ‘e bağlı pinlerindeki HI-Z kaldırılması ve C64 adres ve data bus’na bağlanılması. OE low gönderiliyor. OUTPUT Pin C3 Low.
 
7-Bir süre beklenmesi (RAM’e yazılıyor).

8-Pin C3 OE Low sinyalinin değiştirilerek High yapıyor. (İşlem tamamlandı).C 64  Adres ve data buslarına bağlantı kaldırılıyor. HI-Z durumuna dönülüyor.
9-R/W pininde de benzer işlem yapılıyor.Pin (B1) OUTPUT dan INPUT durumuna getiriliyor. HI-Z durumu.

Adrese (Hafıza adresine ) bir data (sayı) yazdık ve çıktık.
10- Bundan sonra kaç adrese yazmak istiyorsak  en başa 1’e dönerek o kadar LOOP yapıyoruz. 
Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #12 : Aralık 12, 2015, 14:06:24 ÖS »

Görüntü şöyle;



* C64 ARDUINO DMA YAZMA.jpg (218.81 KB, 1022x576 - Görüntüleme: 2492 kez.)
« Son Düzenleme: Aralık 12, 2015, 18:44:21 ÖS Gönderen: Simon (Özay Turay) » Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #13 : Aralık 12, 2015, 14:10:19 ÖS »

Gelelim asıl soruya C64 hafızasına yazabildik mi? Cevabı söyleyeyim ; Hem evet, hem hayır..!

Kolaylığı bakımından C64 ekran hafızası 1024 ‘e bir B harfi gönderdim.( aynı yere A harfini çok uzun zaman önce assembly ile yazarak - inanılmaz bir işi -  yapmıştım! Bu da A dan sonra B’si..) B harfi bana bakıyor. Tamam, oldu. Ama bir dakika, 1024 den sonraki adreslere de B yi gönderdiğimde , bazıları boş ,bazıları başka karakter.. vs , yani olmadı. Hem evet hem hayırın bizim dünyamızda bir anlamı vardır ama mikroişlemciler dünyasında  bu doğrudan  hayır anlamına gelir.
Şimdi..? Geri dönüp bakacağımız kontrol edeceğimiz yerler olmalı ? Hata nerede olabilir ?  a) hardware b) software c) hiçbiri arduino yetersiz kalıyor? Önce hardware bakmalı.

Expansion port bağlantısı? Bozduğum Simon’s Basic kartuştan oluşturmuştum, iyi durumda değildi, lehimler bakırla beraber sıyrılmaya başlamışlardı.Lehim ekleyip güçlükle eğri bir şekilde porta sokabilmiştim üzerinde bir tak-çıkart soket var birkısım pini kıstırarak buradan almıştım, karışık bir şey, sorun bağlantıda olabilir, port adaptörünü çıkardım, dağıttım.  Diğerleri Final 3 ve kafa ayar kartuşları var, kıyamam.  Asetatlı kalem sayesinde hiç beceremeyeceğim halde ilk PCB mi yaptım: expansion port adaptörü. Kimya konusunda bilgim vardır, biraz onun kolaylığı oldu, perhidrol ve HCL yi kullandım. Eritme sonrası ortaya çıkan yol bakırların üzerini lehimle kapladım ve kabloları lehimledim, yakışıklı bir şey olmadı ama iş görür, tek tek  kontrol ettim.., bu tamam. Kullandığım bread board bağlantı kabloları yeni, pinli idi, güvenilmez olabilir, eski yöntem pinsiz sade  kablo ile değiştirdim. Parazit engelleyici bir iki 100n kondansatör koydum. Data ve adres bus bağlantılarının entegrelerdeki durumlarını, arduino pin uç bağlantılarını kontrol ettim . Tekrar denedim. Cık… olmadı , aynı yanlış yazmalar devam ediyor.


*  (676.28 KB, 1372x1029 - Görüntüleme: 277 kez.)
Logged
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #14 : Aralık 12, 2015, 14:13:07 ÖS »

Bu da yenisi



*  (830.21 KB, 1354x1016 - Görüntüleme: 2546 kez.)
« Son Düzenleme: Aralık 12, 2015, 18:45:40 ÖS Gönderen: Simon (Özay Turay) » Logged
Sayfa: [1] 2 3 4   Yukarı git
Yazdır
Gitmek istediğiniz yer: