Cihaz tasarlanırken kullanılması düşünülen donanım kabaca yukardaki şekilde görüldüğü gibidir. 16 analog/dijital çevirici(ADC) 16 telefon hattına bağlanmıştır. ADC'lerin data çıkışları PC Printer Port data hattına bağlanmakta ve bunlar 4'ten 16'ya çevirici bir çoklayıcıyla aynı anda sadece biri aktif olacak şekilde seçilmektedir. Bunu sağlamak için ADC'lerin chip select(CS) uçları kullanılmaktadır. Telefon görüşmeleri dijital ses olarak kaydedilirken kullanılacak örnekleme frekansı 8 kHz civarında olmalıdır. Telefon hatlarının bant genişliği yaklaşık 5-6 kHz civarındadır. 8 kHz örnekleme yapılarak kaliteli ses kayıtları elde edilebilir. Bu örneklemenin yapılabilmesi için saniyede 8000 kere, 16 ADC'nin hepsi okunmalıdır. Burada, kullanılan yazılımın saniyede 8000 kere tetiklenmesi durumu ortaya çıkmaktadır. DOS ortamında PC içindeki 8253 programlanarak bunun yapılması mümkündür. Windows'ta tüm donanım sanallaştırıldığı için bunu yapmak mümkün olmaz. WM_TIMER gibi mesaj tabanlı işlemlerle en fazla saniyenin 25-30'da biri gibi çözünürlükler elde edilebilir. MultiMediaTimer kullanılarak saniyenin binde birinde tetiklenecek fonksiyonlar yazılabilse de bu örnekleme frekansıda istenilen frekansın çok altındadır. QueryPerformanceCounter fonksiyonunun döngü içinde kullanımıyla yaklaşık değerler elde edilebilir ama harddiske yazma/okuma işlemleri gibi CPU yükleyen işlemlerde bu çözünürlük kararlı kalmamaktadır. Sonuç olarak Win32 katmanında saniyede 8000 kere çalışabilecek bir fonksiyon bulunamamıştır. Hatta aynı şekilde kernel fonksiyonları içinde de böyle fonksiyon bulunanamamıştır. Bu yöntemler sonuç vermeyince yazılımla yapılması istenen timer fonksiyonu yerine IRQ'lardan yola çıkılarak yeni bir tasarıma gidilmiştir. Bu tasarımın tek bir ADC kullanılarak çalışan blok diagramı aşağıdaki şekilde görüldüğü gibidir.
Burada PC'ye dışardan bağlı bir timer saniyede 8000 IRQ üretmektedir. Oluşan IRQ'lar kernel modda çalışan bir VxD ile işlenmektedir. VxD yüklendiği anda 4K'lık bir sayfayı kendisine ayırmakta ve bu ara bellek dolduğunda Win32 katmanında bulunan ve kendisini yükleyen uygulamaya mesaj göndermektedir. Bu yöntemi test etmek için devre kurmak yerine piyasada bolca bulunan konuşan kapı zilleri kullanılmıştır. Bu ziller Megar tarafından üretilmekte ve Migros'ta satıldıkları için rahatlıkla temin edilebilmektedir. Bu zillerde, üzerinde dijital ses kayıtlı olan 27512 bir eprom bulunmaktadır. Epromun adres bacakları 16 bitlik bir sayıcıya bağlıdır. Zile basıldığında bu sayıcı 0'dan 65535'e kadar saymakta ve epromun üzerinde kayıtlı bulunan sesi bir dijital analog çevrici vasıtasıyla çalmaktadır. Blok diagramı aşağıdaki görülen bu devre test için idealdir.
Zil devresi 9 Volt DC besleme kullanmaktadır. PC'ye bağlantı yapılması için besleme katına bir 7805 ilave edilip besleme gerilimi 5 Volta düşürülmelidir. Bu işlem yapıldıktan sonra 555 entegresinden alınan clock ucu ve epromun data bacaklarından alınan 8 bit data ucu, PC'nin printer portuna girilmelidir. Bu bağlantı kabaca aşağıdaki şekilde gösterilmiştir.
Yazılımla ilgili denemeler yapılırken bu devre kullanılmıştır. Devrede 555 timer entegresinin hızını ayarlamak için bir potansiyometre bulunmaktadır. Bu sayede saniyede oluşan IRQ sayısını arttırıp azaltmakta mümkün olmaktadır. Bu bölümde bahsedilen devreyi ya da benzerini gerçekleştirmek isteyenler (-ki bu bende olabilirim:) için, ADC'ler hakkında bulunan dökümanlar, kaynaklar bölümünde ADC başlığı altında toplanmıştır. Dökümanların çoğu National firmasının web sitesinden alınmıştır. Daha güncel bilgiler elde etmek için bu site kullanılabilir.
Yazılım da atılacak ilk adım PC printer portun data hattının giriş olarak kullanımını sağlamaktır. Standart PC printer portunda data hatları genellikle çıkış olarak kullanılır. Bu durumda BIOS'larda standart ya da normal diye geçen printer portlar işe yaramayacaktır. Problemi çözmek için gidilecek yol yeni PC'lerde ECP olarak tanımlanan standartı incelemektir. ECP, Microsoft ve HP'nin ortak hazırladıkları bir standarttır. Printer porta takılan eski cihazları desteklediği gibi, DMA, çift yönlü bilgi akışı ve saniyede 1MB'a varan yüksek hız sağlar. Bu standartı incelemek için en iyi kaynak ecp_reg.pdf isimli, Microsoft ve HP'nin ortak hazırladıkları dökümandır. Konuyla ilgili diğer dosyalar Kaynaklar bölümünde PC Printer Port başlığı altında bulunabilir. Bu kaynaklardan alınan bilgiyle, ECP modunu desteleyen bir printer portun giriş olarak kullanımının test edilmesi için aşağıdaki test devresi ve kod kullanılmıştır.
Bu sitedeki tüm kaynak kodlar gibi aşağıdaki kodda Delphi 3.0 kullanılarak derlenmiştir. Derlenmiş halini indirmek için burayı tıklayın.
{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y-,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE CONSOLE}
program in_test;
uses
Windows,SysUtils;
const
BaseAdr: word = $378;
procedure WritePort(Addr:word; Value: byte);assembler;register;
asm
xchg ax,dx
out dx,al
end;
function ReadPort(Addr: word):byte;assembler;register;
asm
xchg ax,dx
in al,dx
end;
function InitPort:boolean;
begin
WritePort(BaseAdr+$402, $34);
Sleep(1);
Result := ReadPort(BaseAdr+$402) = $35;
end;
begin
// Check if ECP exists
if not InitPort then
begin
WriteLn('ECP required at ',IntToHex(BaseAdr,4)+'h');
Halt(255);
end;
// This version never ends. Use CTRL+C to terminate it
repeat
WriteLn(IntToHex(ReadPort(BaseAdr),2));
until False;
end.
Test için kullanılabilecek diğer bir yöntemde DOS debug komutunun kullanımıdır.
-o 77a 34 -i 77a 35 -i 378 04Bu şekilde portun giriş olarak kullanılması sorunu çözüldükten sonra sıradaki ikinci sorun, Donanım bölümünde bahsedilen, portun saniyede 8000 defa okunmasıdır. Bunu sağlamak için şu yöntemler denenmiştir.