Telefon Görüşmeleri Kayıt Sistemi



1.Giriş

1999 yılında çalıştığım borsa aracı kurumu Boyut Menkul Değerler, müşterilerin telefonla dealerlara verdikleri alım satım emirlerini kaydetmek için telefon görüşmelerini kaydeden bir cihaz satın almak istedi. Bilgi İşlem bölümünde görev yaptığımız için bu cihazın piyasa araştırmasını biz yaptık. RACAL ve SYS gibi birkaç firmadan teklif aldıktan sonra bu cihazların fiyatlarının çok yüksek olduğunu gördük ve satın almaktan vazgeçtik. Daha önce bu türden uygulamalarla ilgilendiğim için bu cihaza benzer bir sistem geliştirme işiyle amatörce ilgilenmeye başladım. Yaklaşık bir ay içinde deneme sonuçlarını aldım. Cihazı tamamlamak şimdiye kadar mümkün olmadı ama Windows programcılığı açısından önemli olduğunu düşündüğüm gibi konuların pratik uygulamalarını bu cihaz sayesinde gerçekleştirdim. Satın alınması düşünülen cihazın özellikleri aşağıdaki gibiydi. Bu özellikler aynı zamanda bu türden bir cihazın sahip olması gereken en temel özelliklerdir. İstenilen bu özellikleri sağlamak için bir PC, işletim sistemi olarak Windows 95 ve telefon hatlarının bilgisayara girilmesi içinde PC Printer Port kullanmayı uygun gördüm. Daha önce benzer sistemleri DOS kullanarak gerçekleştirdiğim halde bu cihazda Windows kullanmak istememin temel sebebi ağ ortamını desteklediği içindir. Bir diğer sebeb Windows'un son derece popüler ve ucuz olmasıdır.

2.Donanım

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.

3.Yazılım

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
04
Bu ş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.

PC içindeki 8253 Timer Chipinin programlanması

4.Sonuç

5.Kaynaklar


[ sayfa başı ] [ ana sayfa ] [ projeler ] [ programlar ] [ şarkılar ] [ linkler ] [ e-mail ]
Hosted by www.Geocities.ws

1