Mesajları Göster
|
|
Sayfa: [1] 2 3 ... 5
|
|
1
|
Genel Kategori / Proje / Ynt: C64 ARDUINO DMA
|
: Şubat 27, 2016, 15:07:12 ÖS
|
|
Bu sinyal örneklerini C64’e dair sahip olduğumuz teorik bilgilerin ve 500 nsn ile ilgili kurduğumuz cümlelerin pek de sağlam olmadığına dikkati çekmek için koydum.VIC BA low olduğu bölgede kendisine karışılmasına izin vermiyor,ama, BA High bölgesinde kendine ait Ø2 low 500 nsn aralığına girilmesinde de sorun çıkartmıyor. Buraya daha yakından bakmak gerekir.
|
|
|
|
|
3
|
Genel Kategori / Proje / Ynt: C64 ARDUINO DMA
|
: Şubat 27, 2016, 15:05:00 ÖS
|
|
Son olarak; Denediğim biri yazma diğeri okuma sinyal örneklerinden ikisi aşağıda. Bu örneklerde VIC’e ait olan Ø2 low 500 nsn bölgelerinden iki adedi (yazmada)R/W sinyali Low yapılarak,ayrıca adres ve data busları C64 e bağlanmış haliyle tamamen kapatarak, işgal etmiş durumda. VIC burada okuma yapacaktır. (R/W high gereklidir), ayrıca adres ve data buslarını kullanacaktır. Bu örneklerin doğal sonucu “crash”, bilgisayarın çökmesidir. Oysa hatasız 8Kyazma ve okuma örnekleridir.Programlardaki ara NOP gecikmesinin 40 NOP’a çıkartılmasıyla elde edilmiştir, DMA çıkışında da 6510 işine devam etmiştir.
|
|
|
|
|
4
|
Genel Kategori / Proje / Ynt: C64 ARDUINO DMA
|
: Şubat 27, 2016, 15:03:40 ÖS
|
|
8 Kbyte yazma 55milisn, okuma 54 milisn. Bu süreler 5-10 milisn daha düşürülebilir ama önemli değil. Program hakkında kısa bilgi vereyim; 1-Girişte ilk düzenlemeler ; integer sayıların atanması 5 sn gecikmeyle C64 açılış sonrası kararlı hale gelmesinin beklenmesi, 2-Loop başlangıcında, uzun BA high bölgesinin bulunması, 3-DMA nın ilk kısa BA High da başlatılması, 4-8 K yazmanın kısa ve uzun BA high bölgelerinde yapılması 5-Okuma için ilk BA kısa high bölgesinin bulunması 6-8 K okumanın kısa ve uzun BA high bölgelerinde yapılması 7-DMA ‘dan çıkış 8-Serial Monitor’a okuma toplamının gönderilmesi 9-C4’e (input) test için bir buton bağlandı. Low olduğunda(basıldığında) loop tekrarlıyor. 10-2. Loop integer hazırlıkları
Programda Okuma silindiğinde Yazma, Yazma silindiğinde Okuma olur..
Amacım C64 DMA’sının 16 Mhz işlemci Arduino ile yapılıp yapılamayacağı ,mümkün ise bunun sınırları hakkında bilgi sahibi olmaktı . Sade diyebeceğimiz bir yapıda 1X74245 ,2X 74374 3 adet entegre kullanarak arduino (atmega 328p-pu) ile DMA yapılabilir durumda.
Sonrası bir sd kart veya bir serial ram, flash vs.bağlamak olur. Donanım olarak bunu yapmak kolay, yazılım ise zaman alacak bir iş. Galiba sona geldik ,sanıyorum bu kadarı yeterli.
|
|
|
|
|
7
|
Genel Kategori / Proje / Ynt: C64 ARDUINO DMA
|
: Şubat 27, 2016, 14:10:17 ÖS
|
|
Şimdi Okuma tarafını çözmeye çalışıyorum. Analyzer bu yetersiz haliyle bile her şeyin anahtarı. Okuma sinyallerine dikkatli baktığımda sinyallerin sürekliliği içinde bazı belirsiz bozulmalar var (8 K nın içinde belirli demek pek mümkün olmuyor..!). Bazan iki okuma OE sinyali arası açılıyor, bazan OE sinyali süresi birkac Ø2 sinyalini kapsayacak şekilde uzuyor. Bir düzensizlik var.Bu tür aksamaları mikroişlemci bir tek nedenle yapar, birşeylerle meşgul olur,yani kendi iç işlerine bakar, yani interrupt..
Kullanmakta olduğum timer’lı test programı yerine saymalı program tipine döndüm, girişte interrupt’ı kapattım. Sonuç : Okuma toplam rakamları serial monitorde aynı olarak akmaya başladı. Boş RAM okuyorum. C64 açıldığında RAM FF,00 ve bazı adreslerde rastgele sayılarla doluyor. Her açıp kapamada farklı bir 8 K yı ama tekrarlayarak aynı sayıyı okumaya başladı.
Bu kez yazma _okuma programına geçtim. Daha once ROM okuyup RAM ‘e yazıyorduk. Şimdi RAM’e yazıp, okuyoruz. 0 dan 255 ‘e tekrarlayarak 8K yazıyoruz, Kontrol toplamı yine 1044480. Hatasız 200 adet yazma_ okuma. Tuhaf bir durum var: temiz bir yazma okuma elde ettik ama C64’ e kapat aç yaptığımda bazan birden bozulma başlıyor. Yine aynı sorudayız; ne olabilir? Yazılıma bakıyorum, hardware ‘i inceliyorum, birşey gözükmüyor. 100-200 defa sorun çıkmıyor,sonra birden arka arkaya bozulma başlıyor. Böyle birşey sinyal yapısından olmaz, softwareden de olmaz hardwarede olmalı. Nihayet buluyorum; üzerinde pek önemle durmadığımız, entegrelerin önüne bazan koyduğumuz bazan koymadığımız şu küçük 104 kondansatörlerinden birini Hardware karmaşasında grnd ucunu boşta bırakmışım. Hatalı yazmalar ucu toprağa bağladığımda düzeliyor, ayırdığımda hemen başlıyor.
|
|
|
|
|
8
|
Genel Kategori / Proje / Ynt: C64 ARDUINO DMA
|
: Şubat 27, 2016, 14:08:07 ÖS
|
|
Biraz ara verirsem; Başlarken amaçlarımdan biri arduino ile yapılacak DMA sınırlarının ne olduğunu anlamaktı. Bu sınırlardan ilki ortaya çıkmış oldu:
C64 Clock tek başına kullanılabilir durumda değil. Yeni bir clock oluşturmak gerekiyor. Bir mikroişlemci sadece loop içindeki yazılımı yürütebilir. Yazma yada okuma işini yaparken diğer yandan C64 clock’u ile ilgili bir işlem yapamaz. iki farklı işi ancak FPGA gibi paralel işlemler yürütebilen entegreler yapabilir. Şimdiye kadar yapılan C 64 DMA larında (sadece) bir mikroişlemci kullanarak yapılmış proje yok. (Ya da ben görmedim ?) DMA nın olduğu yerde proje başka işleri yapabilecek değişik özelliklere de sahip olması gerekecektir. Yani kestirmeden mikroişlemciyi ikinci plana atmak zorunda kalırsınız ,daha yüksek clock kullanmanın avantajları , adres ve data bus için bol miktarda pin, istenilen değişik logic leri oluşturabilme olanağı..vb de diğer üstünlükler olur. DMA kullanan kartların CPLD türlü entegrelerle yapılmasının sebepleri bunlar olmalı. ……………………………
Konuya dönersek; Test yapmak yazılım ve donanımda önemlidir. Düşük hata yüzdeleriyle çalışan projelerin bir zamanlar epey olduğunu zannediyorum. C64 kartuşlarda yaptığımız gereksiz resetlemeleri hatırlıyorum. Büyük olasılıkla testi yeteri kadar yapılmamış yazılım veya donanım hatalarından ileri gelen resetlemelerdi. C64 ‘ün (ekmek kasa ) içini açıp baktığımda kenarda el ile lehimlenmiş diyodları görüp gülümsediğimi hatırlıyorum. Biraz da böyledir, herşeyi yetiştiremezsiniz, bazı şeyleri düzeltmek sonraya kalabiliyor,..
Neyse, biz elimizden geldiğince daha iyisini anlamaya ve yapmaya çalışalım.
Ara verip dönüp baktığımda işleri yavaşlatan şeyin yetersiz test şartları olduğunu gördüm, konuyu çabuk toparlayabileceğimi düşünmüştüm. Ama durum öyle değil. Yazmayı kontrol için her seferinde uzun basic satırını yazmak gerekiyor. Okuma için ise yazmanın doğru olduğunu varsayıp yine aynı şekilde basic satırlarıyla RAM okuması yapmak gerekiyor. Yazma tarafındaki yazılımı tekrarlı şekline çevirdim (yazılı basic satırı yerinde kaldığından, beklemeli de olsa return ‘e basarak yazma toplamı kontrol edilebiliyor).
Okuma tarafını yazmadan bağımsız hale getirmek gerekiyor. Bunun yolu ttl-usb dönüştürücüsü, FTDI kullanmak,serial monitor’den izlemek. (Başlangıçta uzak durmuştuk). FTDİ için pin 12 ve 13 ü (B4 ,B5 ) software serial ile birlikte kullandım. B4 input R(X), B5 Output T(X) oldu. B4 zaten boşta, B5 ise Output ve clock74374 yükleme (OE high kaldığından, B5 in sinyal değiştirmesinin C64’e ulaşma durumu yok).
|
|
|
|
|
9
|
Genel Kategori / Proje / Ynt: C64 ARDUINO DMA
|
: Şubat 27, 2016, 14:04:08 ÖS
|
|
OE ve R/W e girmeden once bir kez daha bitRead (BA)== high satırı koydum.Daha once BA low’un birkaç clock ileride içinde kalabilen sinyaller ortadan kalktı ama yine de bazı durumlarda BA low ilk clock’unda OE ve R/W sinyalleri olabiliyor.
Bu kez algoritmayı değiştirdim:
a-DMA giriş öncesinde BA’nın yukarıdaki 24 X kısa ve 1X Uzun olan High düzeninden uzun High düzenini yakalayan ve onun bittiği yeri bulan bir ek koydum. Böylece yazma veya okuma loop’unun her zaman ilk kısa BA High ile başlamasını sağladım. Nerede başlandığı bilinir hale geldi.
b-Başka bir ek ile kısa ve uzun BA high bölgelerine onların uzunlukları ile orantılı ayrı işlem yapan biri timer kullanan diğeri ise belirli sayıda işlemle ( iki ayrı yöntemle) BA Low içine sinyallerin düşmesini engelledim.
Sayılı işlem yönteminde kısa ve uzun high için ayrı ayrı belirlisayıda çevrim yaptırıyorsunuz, kullanışlı değil. Test yapmaktayız, yazılım eklemeleri ile sayılar değişiyor. Pratik olmuyor. Ama bu yöntem final aşamada tercih edilebilir çünkü en hızlı yazma veya okuma işlemi bu yöntemle gerçekleşiyor.
Diğer yöntem timer kullanmak. Arduino Timer yapılan okuma ,yazma sürelerini uzatıyor 3-4 Ø2 clock ile gerçekleşen yazma veya okuma 10-11 Ø2 clock na çıkıyor. 35 milisn olan 8K işlemi 115milisn ye çıkıyor. Bu yöntem ile Test yapmak kolaylaşıyor. Ek yazılım satırlarının herhangi bir engellemesi olmadan timer BA high süreleri bitime yakın iken işlemi durduruyor.
Bunların ardından şu sonuçları elde ettim: 1- Ekrandaki karakter gözükmeleri ortadan kalktı, 2- Yazma biri ekmek kasa iki C64 de hatasız hale geldi. Ikisinde de 100 defa denediğimde 100 defa doğru yazma yaptı. Okumada hala sorun var. yaklaşık % 10 hata veriyor. Yazma tamam ama hala %100 anlamına gelmiyor, henüz test devam ediyor!
|
|
|
|
|
11
|
Genel Kategori / Proje / Ynt: C64 ARDUINO DMA
|
: Şubat 27, 2016, 13:59:14 ÖS
|
|
Kayıp ise bir adet fazladan C64 clock’u oldu. Biri ekmek kasa iki farklı c64 de denedim. Her ikisinde de ( Ø2 ile ilişkili) aynı kaymalara sahip sinyal örneği elde ediliyor.
6510’un R/W Timing ‘ne dönersek TRWS ve TADS nin 100 – 300 nsn arasında olabileceğini söylüyor.
Buradan baktığımızda yazma sinyal dizileri için ortada bir sorun yok. C64 bu dizileri (bazılarını değiştirerek denedim) centilmence , hatta cömertce kabul ediyor.16 mhz işlemcinin sinyal yetiştirememe diye bir sorunu da yok ,her şey yolunda yani.
Problemin çıktığı yer Ø2 veya dot Ø. Her ikisinde de erken ve geç clock yükselme yada düşme kenarları meydana geliyor. Herşeyi birkenara bırakıp c64 clock’nu terbiye etmeye çalışıyorsunuz. PLL tarzı birşeye girmeniz gerekecek , bu ise dış frekans ,fark bulucu..vs gerektirir basitlikten uzaklaşırız. Yukarıdaki 200 nsn cıvarındaki kaymayı ve sinyal yapısını kullanmaya devam edeceğiz.
8k yazma denemelerinde görünen şu : %90-95 doğru yazma , %5-10 ekranda (düşey olarak ekranın soldan itibaren 5-6 karakter genişliğinde bir tarafında) 5-8 gelişigüzel karakter gözükmesi oluyor. Bu %5-10 durumu daha önceleri de hatalı yazmaya neden oluyordu.Kaymayı (gezinmeyi) 200nsn içine çektiğimde hatalı yazma azaldı ama hala var.
Bir konu : BA sinyali 24 defa(yaklaşık 500mikrosn high- yaklaşık 50mikrosn low) high-low dan sonra yaklaşık 7,7 milisn uzunbir high ve tekrar 24 high-low düzenine geçiyor. 24 lük peryot (25 adet Low), ekran oluşturma ile ilgili. Diğeri ile birlikte tümü bir iç standart olmalı. 8k yazma hemen 2-3 kez bu 24 lik peryodun içinden( burayı da kullanarak) geçiyor.
Normal akış nesnasında yazılım BA ‘nın High olduğunu gördüğünde ilerliyor.BA low ise bekliyor. BA low olmak üzere High ın kenarına geldiğinde ise high ‘ı görüp herşeyi normal kabul ederek yoluna devam ediyor ve OE, R/W sinyallerini gönderiyor. Son sinyaller birçok zaman BA low’un içine düşüyor.
BA low VİC’e ait. Ø2 clock hem high hem low iki tarafını da kullanıyor.Müdahale etmiş oluyoruz.
|
|
|
|
|
12
|
Genel Kategori / Proje / Ynt: C64 ARDUINO DMA
|
: Şubat 27, 2016, 13:56:17 ÖS
|
|
Şimdiye kadar yaptığımız sinyallere bakılırsa kurcalayarak da olsa hem yazmada hem de okuma_yazmada 1 no lu gereklere uymuş durumdayız. Adres Bus (OE) ve R/W peşpeşe olabildiğince erkenden gönderiliyor.
Data bus ise Adres bus ile beraberce OE ‘nin içinde açıyoruz, yani, data bus’a erkenden bağlanıyoruz. 2. Şarta pek uymuyoruz. Bir arduino pinini daha kullanıp 74245 OE sinyalini ayırıp Data bus’ı daha geç gönderip erişim zamanını ileriye alabiliriz (Bu, başka bir zamana kalsın ). Şimdilik bir sorun çıkmıyor. Devam edelim.
Bir not ; Analyzer kullanımında bu kadar çabuk sınıra geleceğimi düşünmemiştim.24 mhz olarak kullanmak genellikle mümkün olmuyor, 16 Mhz’e düşürmek gerekiyor.Sabırla kullanıldığında 24mhz ile 1000/24=41.6 nsn ölçüm hatası var. Arduinonun kendisinde de Ø2 high yakalarken 62.5 nsn clock hatası var.Yani max 100nsn cıvarında ölçüm hatası var. Ø2 den kaynaklanan hatanın seviyesini ise bilmiyoruz. C64’ü değiştirdim ekmek kasaya bağladım. Okuma_yazma programı hata veriyor. Başa döndüm: Önce yazma programını ele aldım.Ekmek kasada bu program da zaman zaman hata veriyor.
Hatanın sebebi nedir? Bütün yazma döngüsü daha once de söylediğim gibi bir başlangıç noktasından ileri doğru 4-6 yazma işlemi boyunca kayıyor. Sonra bir c64 clock’u atlayıp yeniden başa geliyor. Yani yazma sinyalleri istenilen bölgenin dışına çıkıyor. Gezinme aralığı 416nsn ‘ye kadar çıkıyor. Bukadar hareketli bir sinyal yapısında yazmanın doğru olması bile şaşırtıcı. 7414 entegresi temiz olmayan,parazitli sinyalleri temiz hale sokan her derde deva bir entegredir.Daha once kullandığımda bir işe yaramamıştı ama o zaman uygun bir sinyal yapısı elimde yoktu.Şimdi herşey daha izlenebilir durumda. Ø2 yi iki adet not kapısıyla arduino’ya gönderdim. İnanması zor bir durum. Hiç bir faydası olmadı. Aynı gezinme devam ediyor.
7414 Ø2 clock’u analyzer ile aynı fazda, Analyzer Ø2 high ve low geçişlerini 7414 ile aynı yerde yakalıyor.
Epeyce dot Ø ile ilgilendim, bazan 2-4-8 ‘e bölerek Ø2 ile ilişkiye sokarak clock yapılarını izledim. dot Ø de aynı kayma davranışını gösteriyor.Yararsız.. Eldeki imkanlar fazla değil , bu aşamada işe yarar birşeyler yapmak gerekiyor. Sonunda şöyle birşey denedim: yazma veya okuma başlangıcında Ø2 High durumunu while(bitRead(PINC,0)==0) ile okuyoruz . Bunun altına while(bitRead(PINC,0)==1) satırını koydum. while(bitRead(PINC,0)==0); while(bitRead(PINC,0)==1); şeklini aldı. İlkinde Ø2 high durumu,ikincisinde low durumu algılanıyor. Bir türgecikme. Bu işlem işe yaradı : Kayma aralığı 200nsn’ye düştü. Bazan random bazan periyodik denilebilecek ama öncekinin yarısı bir gezinme. Şimdiye kadar karşılaştığım en iyi durum.
|
|
|
|
|
15
|
Genel Kategori / Proje / Ynt: C64 ARDUINO DMA
|
: Şubat 27, 2016, 13:51:27 ÖS
|
|
Tekrar merhaba, Konu biraz ağır gitmiş, ama elden gelen birşey yok. Ne kadar basitleştirsem ancak bu kadar olabilmiş. Farklı şeyler söyleyeyim, havayı biraz yumuşatayım. Kısa bir hikaye: ...... Evimize misafirliğe gelen arkadaşımın 3-4 yaşlarındaki afacan kızı biz içeri girip yerleştikten bir sure sonra yabancı yerde olmanın çekinikliğini üzerinden attı . Annesinin yanından ayrılıp salonda ortalığı kolaçan etmeye , oynayabileceği işe yarar birşeyler aramaya başladı. Küçük çocuklar için evde verilecek oyuncaklar vardı ama bunlar onun yaş grubuna uygun değillerdi. Bir süre bakınıp dolaştıktan sonra annesinin yanına geldi. Ortamın kendisine pek elverişli olmadığını anlamanın can sıkıntısıyla bezgin bakınmaya başladı. Ne yapacağını bilmez bu durum çok fazla sürmedi. Sonra , uzakça biryerde, masanın arkasında işıklı bir şeyi fark etti, sandelyeleri itekleyip çekiştirerek oraya ulaştı. Bir beta video cihazı. Önce durdu, tereddütle baktı, kararını verdi parmağını uzatıp bir düğmeye bastı. Video cihazı bütün marifetini göstererek kaseti içeri alıyormuş gibi mekanik hareketleri başlattı, birtakım ard arda gürültüler patırtılar,vınlamalar, aynı anda yanıp sönmeye başlayan ışıklar, tam bir şölen.. Annesi bozar deyip yerinden yerinden kalktı,ben bir şey olmaz, cihaz bozulmaz, bozulsada önemli değil dedim. Bizim afacan oyuncağını bulmanın , yeni şeyler keşfetmenin merakıyla bütün düğmeleri denedi ışıkları seyretti hevesini alıncaya kadar video ile oynadı. Aradan birkaç ay geçti. Tekrar bizde toplandığımız bir gün yine içeri salona girdik, henüz oturma düzeni almaya çalışırken, afacan yanımızdan sıyrılıp doğru videoya yöneldi. Hiç vakit kaybetmeden düğmelere basıp ışıkları seyretmeğe başladı.Hepimiz ona bakıp gülüyoruz.. …………….. İnsan beyni böyle davranıyor; birşeyi başlatıp ilerletip ara verdiğinde tutuyor,saklıyor. Daha sonra imkan olduğunda veya elverişli bir zaman yada ortam bulduğunda “.. kaldığı yerden devam ediyor “. Şimdi ben de öyle yapayım kaldığım yerden devam edeyim.
Başka şeyleri toplamaya çalışırken bazı bilgileri atlamışım:
6510 Write ve Read clock timing aşağıda. Arduino’nun yapacağı timing’in bunun bir benzeri olması gerekir.
1-Hem okumada hem de yazmada R/W sinyali ve Adres Bus beraberce ve önceki Ø2 low’un içinde ‘erkenden’ gönderiliyor. 2-Data bilgilerine Ø2 High’ın ikinci yarısında başlayan ve Ø2low’un içine taşan bir zamanda ulaşılıyor.
|
|
|
|
|
|