1
TUGAS AKHIR
ELEKTROKARDIOGRAF BERBASIS PC
(PC BASED ECG)
Diajukan untuk memenuhi salah satu syarat memperoleh gelar
Sarjana Teknik pada Program Studi Teknik Elektro
Fakultas Teknik Universitas Sanata Dharma
Disusun oleh:
Johan Arief
NIM: 015114047
Program Studi Teknik Elektro
Fakultas Teknik
Universitas Sanata Dharma
Yogyakarta
2007
id5907390 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com
2
3
4
PERNYATAAN KEASLIAN KARYA
Saya menyatakan dengan sesungguhnya bahwa tugas akhir yang saya tulis ini
tidak memuat karya atau bagian karya orang lain, kecuali yang
telah disebutkan dalam kutipan dan daftar pustaka, sebagaimana
layaknya karya ilmiah
Yogyakarta, 7 Agustus 2007
Johan Arief
5
MOTTO HIDUP
"Cogito ergo sum"
HALAMAN PERSEMBAHAN
Karya ini kupersembahkan untuk
Ayah dan Ibu
Saudara-Saudariku
Kemajuan Bidang Elektromedis
6
Judul: Elektrokardiograf Berbasis PC
Nama Mahasiswa: Johan Arief
No. Mahasiswa: 015114047
INTISARI
Electrocardiograph merupakan instrumen elektromedis yang berfungsi memberikan data grafis potensial listrik yang ditimbulkan jantung saat berkontraksi. Sinyal elektrokardiograf memiliki amplitudo ± 1mV dan terdiri dari beberapa sinyal tunggal dengan rentang frekuensi 0.05Hz sampai dengan 150Hz dan sangat retan terhadap noise. Agar dapat diinterpretasikan maka sinyal ini perlu dikondisikan dan di-filter agar dapat terbaca oleh instrumen pengukur. Pada tugas akhir ini, dibahas mengenai sistem instrumentasi EKG berbasis PC. Sistem dirancang untuk menampilkan sinyal EKG pada program aplikasi di PC dengan masukan dari simulator EKG. Instrumentasi EKG ini terdiri dari: selektor analog yang di dalamnya terdapat rangkaian Wilson, pengendali selektor, penguat instrumentasi, filter-filter analog yang terdiri dari HPF 0.5Hz, LPF 150Hz, dan filter notch 50Hz, konverter analog ke digital, modul USB, dan program aplikasi yang dapat memplot masukan ADC. Sinyal-sinyal pada pengukuran berasal dari Simulator EKG. Setelah melewati rangkaian Wilson, sinyal akan diproses secara analog untuk dikuatkan dan ditapis pada penguat instrumentasi dan sejumlah filter analog. Pengkondisi sinyal akan mengubah agar sinyal yang dihasilkan dapat berada pada range yang dapat diakuisisi oleh ADC. Sinyal digital yang diperoleh ditransfer ke PC melalui interface USB. Suatu program aplikasi Delphi kemudian akan menampilkan bentuk gelombang yang diperoleh secara kontinu. Dalam implementasi tugas akhir ini, terdapat kendala berupa perangkat keras yang belum beroperasi dengan baik. Instrumen ini belum mampu menghasilkan 12 lead sinyal EKG standar. Dengan pengujian menggunakan simulator EKG, instrumen yang dibangun baru dapat menampilkan satu sinyal EKG. Kata kunci: EKG, penguat instrumentasi, instrumentasi biomedis, filter analog.
7
Title: PC Based ECG
Student Name: Johan Arief
Student ID Number: 015114047
ABSTRACT
Electrocardiograph is a medical instrument which can give graphical data of electrical potentials from heart. ECG signals have ±1mV amplitude and consist of some signals which have frequency range 0.05Hz to 150Hz. This attribute is very closely to property of noise. To capture right ECG pattern, is needed to build signals conditioner to transform it into range of measure instrument. This final paper cover about PC based Electrocardiograph. This instrument is designed to capture signal from ECG Simulator and plot ECG signal continuously on PC using an application program. This instrument consist of analog selector which has Wilson circuit, control multiplex, instrumentation amplifier, analog filter using HPF 0.5Hz, LPF 150Hz, and notch filter 50Hz, analog to digital converter, USB module, and an application program to plot digitalized data from ADC. For measurement purposes, signal comes from ECG Simulator. After pass Wilson circuit, signal will be processed on analog block and a signal conditioner will convert it to ADC input range. PC continuously plot data from USB to form this ECG signal. In implementation of this final paper, some parts of hardware didnt work properly. This instrument cant produce 12-leads standard ECG signals yet. Using ECG Simulator, this student project can produce only one pattern of ECG signal. Keywords: ECG, instrumentation amplifier, biomedical instrumentation, analog filter.
8
KATA PENGANTAR
Puji syukur kepada Tuhan atas segala karunia-Nya sehingga penulis dapat
menyelesaikan penulisan skripsi ini. Skripsi ini berjudul: Elektrokardiograf berbasis
PC. Melalui karya tulis ini, penulis mencoba memberikan gambaran tentang penerapan
elektronika pada bidang medis, yaitu berupa perancangan instrumen elektrokardiograf.
Skripsi ini ditulis untuk memenuhi salah satu syarat dalam memperoleh
gelar sarjana teknik pada program studi Teknik Elektro Universitas Sanata Dharma.
Penulisan skripsi ini didasarkan pada hasil-hasil yang penulis peroleh pada saat
perancangan alat, pembuatan alat, pengujian alat, dan pengembangan berdasarkan hasil
pengujian.
Penulisan skripsi ini dapat terselesaikan berkat bimbingan, bantuan, dan
dorongan dari berbagai pihak. Pada kesempatan ini penulis ingin mengucapkan terima
kasih kepada :
1. Bapak B. Djoko Untoro Suwarno, S.Si., MT. selaku dosen pembimbing yang
telah bersedia membimbing, memberikan saran, ide, dan waktu dengan penuh
kesabaran dalam menyelesaikan tugas akhir ini.
2. Bapak dan Ibu dosen jurusan Teknik Elektro yang telah mengajar dan
memberikan pengetahuan kepada penulis selama kuliah.
3. Bapak Djito dan seluruh karyawan Sekretariat Teknik Universitas Sanata Dharma.
4. Karyawan Laboratorium Teknik Elektro Universitas Sanata Dharma.
5. Ayah dan Ibu penulis yang selalu mendukung pentingnya suatu idealisme.
6. Saudara-saudariku dan seluruh keluargaku.
7. Teman-teman Teknik Elektro Sanata Dharma.
8. Semua pihak yang tidak dapat penulis sebutkan satu per satu disini, terima kasih
atas segala ide yang telah diberikan kepada penulis.
9
Penulis menyadari bahwa penulisan skripsi ini masih banyak terdapat
kekurangan. Segala kritik dan saran dari berbagai pihak penulis terima untuk
perkembangan selanjutnya. Semoga karya tulis ini dapat bermanfaat bagi pembaca.
Terima kasih.
Yogyakarta, 7 Agustus 2007
Penulis
Johan Arief
10
DAFTAR ISI
Halaman judul ........................................................................................................... i
Halaman Pengesahan oleh Pembimbing ................................................................... ii
Halaman Pengesahan oleh Penguji ........................................................................... iii
Lembar Pernyataan Keaslian Karya ........................................................................ iv
Halaman Persembahan dan moto hidup .................................................................... v
Intisari ....................................................................................................................... vi
Abstract ..................................................................................................................... vii
Kata Pengantar .......................................................................................................... viii
Daftar Isi ................................................................................................................... x
Daftar Gambar .......................................................................................................... xiv
Daftar Tabel ............................................................................................................. xviii
Bab I Pendahuluan ..................................................................................... 1
1.1. Latar Belakang .......................................................................... 1
1.2. Perumusan Masalah .................................................................. 1
1.3. Tujuan dan Manfaat .................................................................. 2
1.4. Batasan Masalah ....................................................................... 3
1.5. Metodologi Penelitian ............................................................... 3
1.6. Sistematika Penulisan ................................................................ 4
Bab II Dasar Teori ....................................................................................... 7
2.1. Sinyal Biopotensial Jantung dan Pengukurannya ..................... 7
2.1.1. Sistem Konduksi Elektrik Pada Jantung ........................ 8
2.1.2. Sinyal Elektrokardiogram ............................................... 9
2.1.3. Penempatan Elektroda .................................................... 11
11
2.2. Elektrokardiograf ...................................................................... 13
2.2.1. Elektroda ......................................................................... 14
2.2.2. Rangkaian Wilson dan Einthoven ................................... 16
2.2.3. Penguat Instrumentasi ..................................................... 18
2.2.4. Filter ................................................................................ 20
2.2.4.1. Metode Sallen-Key ............................................. 21
2.2.4.2. Metode State Variable ........................................ 23
2.2.4.3. Uniform Capacitor .............................................. 25
2.2.4.4. Metode Active Twin-T ....................................... 26
2.2.5. Pengolah Data ................................................................. 27
2.2.5.1. Fitur-Fitur AT90S2313 ...................................... 27
2.2.5.2. Hardware ........................................................... 28
2.2.5.3. Arsitektur AT90S2313 ...................................... 28
2.2.5.4. Universal Serial Bus .......................................... 31
Bab III Perancangan Instrumentasi EKG ...................................................... 34
3.1. Spesifikasi ................................................................................. 34
3.2. Diagram Blok ............................................................................ 34
3.3. Perancangan ............................................................................... 36
3.3.1. Selektor Analog ................................................................ 36
3.3.2. Pengendali Selektor .......................................................... 38
3.3.3. Modul Penguat dan Filter ................................................. 39
3.3.3.1. Penguat Instrumentasi .......................................... 40
3.3.3.2. Filter ..................................................................... 41
3.3.3.2.1. High Pass Filter .................................... 42
3.3.3.2.2. Low Pass Filter ..................................... 46
3.3.3.2.3. Notch Filter .......................................... 54
3.3.3.3. Penguat Akhir dan Offset .................................... 59
3.3.4. Catu Daya ......................................................................... 61
3.3.5. Konverter Analog ke Digital ............................................ 62
3.3.6. Modul Akuisisi USB ........................................................ 63
3.3.7. Program Pengendali Selektor ........................................... 65
12
3.3.8. Program Konversi Analog ke Digital ............................... 65
3.3.9. Program Akuisisi USB ..................................................... 66
3.3.10. Program Aplikasi Delphi ................................................ 66
Bab IV Hasil dan Pembahasan ........................................................................ 72
4.1. Pengujian Sistem ....................................................................... 72
4.2. Selektor Analog dan Pengendali ................................................. 77
4.3. Penguat Instrumentasi ................................................................. 79
4.4. High Pass Filter .......................................................................... 81
4.5. Low Pass Filter ........................................................................... 83
4.6. Filter Notch ................................................................................. 85
4.7. Penguat Akhir dan Offset ........................................................... 86
4.8. Catu Daya ................................................................................... 89
4.9. Modul Konversi ......................................................................... 90
Bab V Kesimpulan dan Saran ....................................................................... 91
5.1. Kesimpulan ................................................................................ 91
5.2. Saran ........................................................................................... 91
Daftar Pustaka ............................................................................................................ 93
Lampiran .................................................................................................................... 94
13
DAFTAR GAMBAR
Gambar 2-1. Struktur sistem konduksi elektrik jantung
Gambar 2-2. Sinyal EKG standar
Gambar 2-3. Perjalanan terbentuknya sinyal EKG
Gambar 2-4. Penempatan elektroda pada tubuh
Gambar 2-5. Sistem instrumentasi EKG
Gambar 2-6. Suction cup electrode
Gambar 2-7. Body surface electrode
Gambar 2-8. Arus dari kopling kapasitans yang menyebabkan common voltage
Gambar 2-9. Rangkaian 3 OpAmp pembentuk penguat instrumentasi
Gambar 2-10. Skema INA114 yang terdiri dari 3 OpAmp
Gambar 2-11. Rangkaian dasar konfigurasi LPF Metode Unity Gain
Gambar 2-12. Rangkaian normalisasi HPF Metode Unity Gain
Gambar 2-13. Rangkaian normalisasi Filter State Variable
Gambar 2-14. Op-amp tambahan untuk Filter Notch
Gambar 2-15. Topologi UAF42
Gambar 2-16. Rangkaian dasar LPF Uniform Capacitor
Gambar 2-17. Topologi Active Twin-T
Gambar 2-18. Konfigurasi pin AT90S2313
Gambar 2-19. Blok diagram AT90S2313
Gambar 2-20. Arsitektur AT90S2313
Gambar 2-21. Konektor USB tipe-A dan B
Gambar 2-22. Topologi sistem USB
Gambar 3-1. Diagram blok perancangan perangkat keras sistem instrumentasi EKG
Gambar 3-2. Diagram blok Selektor
Gambar 3-3. Rangkaian selektor analog
Gambar 3-4. Rangkaian pengendali selector
Gambar 3-5. Diagran blok Modul Penguat dan Filter
Gambar 3-6. Rangkaian Right Leg Driven (RLD)
Gambar 3-7. Rangkaian dasar konfigurasi Low Pass Filter
14
Gambar 3-8. Normalisasi ke bentuk High Pass Filter
Gambar 3-9. Rangkaian implementasi HPF menggunakan metoda Unity Gain
Gambar 3-10. Simulasi metode Unity Gain untuk HPF menggunakan EWB
Gambar 3-11. Rangkaian implementasi HPF menggunakan metoda Multi-Purpose State
Variable
Gambar 3-12. Simulasi metode Multi-Purpose State Variable untuk HPF menggunakan
EWB
Gambar 3-13. Rangkaian dasar konfigurasi LPF
Gambar 3-14. Rangkaian implementasi LPF menggunakan metoda Sallen-key
Gambar 3-15. Simulasi metode Sallen-key untuk LPF menggunakan EWB
Gambar 3-16. Rangkaian implementasi LPF menggunakan metoda Uniform Capacitor
Gambar 3-17. Simulasi metode Uniform Capacitor untuk LPF menggunakan EWB
Gambar 3-18. Rangkaian implementasi LPF menggunakan metoda Multi-Purpose State
Variable
Gambar 3-19. Simulasi metode Multi-Purpose State Variable untuk LPF menggunakan
EWB
Gambar 3-20. Rangkaian implementasi Notch Filter menggunakan metoda Twin-T
Gambar 3-21. Simulasi metode Twin-T untuk Notch Filter menggunakan EWB
Gambar 3-22. Rangkaian implementasi Notch Filter menggunakan metoda State Variable
Gambar 3-23. Simulasi metode State Variable untuk Notch Filter menggunakan EWB
Gambar 3-24. Skematik inverting summing amplifier
Gambar 3-25. Rangkaian implementasi penguat akhir & offset
Gambar 3-26. Simulasi penguat akhir & offset menggunakan EWB
Gambar 3-27. Rangkaian catu daya positif
Gambar 3-28. Rangkaian catu daya negatif
Gambar 3-29. Rangkaian konversi analog ke digital
Gambar 3-30. Fase transaksi USB
Gambar 3-31. Rangkaian Modul USB
Gambar 3-32. Flowchart program pengendali selektor
Gambar 3-33. Flowchart program konversi analog ke digital
Gambar 3-34. Flowchart program akuisisi USB
15
Gambar 3-35. Flowchart program plot-waveform Delphi
Gambar 3-36. Layout tampilan saat ECG belum terpasang
Gambar 3-37. Layout tampilan program plot-waveform setelah ECG beroperasi
Gambar 4-1. PC mendeteksi adanya devais berbasis USB
Gambar 4-2. PC menentukan protokol komunikasi yang digunakan
Gambar 4-3. Pemilihan lokasi driver oleh user
Gambar 4-4. Proses pencarian driver ECG USB
Gambar 4-5. Instalasi driver ECG USB
Gambar 4-6. Proses instalasi driver berlangsung dengan sukses
Gambar 4-7. ECG USB telah dapat digunakan
Gambar 4-8. Simulator ECG
Gambar 4-9. Sinyal EKG standar
Gambar 4-10. Pengujian satu sinyal EKG standar
Gambar 4-11. Grafik CMRR INA114 terhadap frekuensi
Gambar 4-12. Grafik Atenuasi HPF Unity Gain terhadap frekuensi
Gambar 4-13. Grafik Atenuasi LPF metode State Variable dengan UAF42
Gambar 4-14. Grafik Atenuasi Filter Notch menggunakan UAF42
Gambar 4-15. Grafik penguat sinyal dengan OPA2227
Gambar 4-16. Respon Modul Koversi saat nilai potensio tidah berubah
Gambar 4-17. Respon Modul Koversi terhadap perubahan masukan
16
DAFTAR TABEL
Tabel 1-1. Metode Pengujian
Tabel 2-1. Interval EKG
Tabel 2-2. Tabel kebenaran multiplexer CD4052
Tabel 2-3. Karakteristik high (H) dan low (L) multiplexer CD4052
Tabel 2-4. Deskripsi pin AT90S2313
Tabel 2-5. Fungsi pin-pin pada konektor USB
Tabel 3-1. Spesifikasi perancangan bagian perangkat keras sistem instrumen EKG
Tabel 3-2. Bit-bit Kontrol Rangkaian Selektor Analog
Tabel 4-1. Hasil Pengujian AT90S2313 sebagai control multiplex
Tabel 4-2. Data Pengujian Selektor Analog
Tabel 4-3. Perbandingan perancangan dan hasil pengujian selektor analog
Tabel 4-4. Data Pengukuran CMRR INA114
Tabel 4-5. Pengujian HPF dengan Metode Unity Gain
Tabel 4-6. Pengujian LPF dengan UAF42
Tabel 4-7. Data pengujian filter notch metode State Variable
Tabel 4-8. Pengukuran penguat akhir sinyal dengan OPA2227
Tabel 4-9. Pengukuran offset dengan OPA2227
Tabel 4-10. Pengukuran inverter OPA2227
Tabel 4-11. Pengukuran keluaran catu daya
Tabel 4-12. Pengukuran kestabilan arus
17
BAB I
PENDAHULUAN
1.1. Latar Belakang
Electrocardiograph merupakan instrumen elektromedis yang berfungsi
memberikan data grafis potensial listrik yang ditimbulkan jantung saat berkontraksi.
Pengukuran sinyal jantung menggunakan Electrocardiograph merupakan salah satu
pemeriksaan diagnostik yang penting. Beberapa kelainan jantung sering dapat diketahui
melalui data EKG.
Seperti instrumen pengukuran biomedis lainnya, EKG harus mampu
memberikan hasil yang merepresentasikan kondisi jantung pasien. Saat ini yang
digunakan sebagai standar pengukuran kondisi jantung adalah 12-lead EKG, yang
mampu memonitor sinyal EKG pasien secara kontinu. Karena pentingnya instrumen ini,
penulis tertarik untuk merancang suatu sistem instrumentasi EKG.
1.2. Perumusan Masalah
Instrumen EKG berfungsi untuk menampilkan data grafis dari potensial
listrik yang dihasilkan jantung. Dua belas sinyal EKG standar diperoleh dengan cara
menempatkan 10 elektroda pada 10 titik tertentu pada tubuh. Keduabelas sinyal EKG
tersebut terdiri dari: 3 sinyal unipolar, 3 sinyal bipolar, dan 6 sinyal sagital. Untuk dapat
memperoleh 12 sinyal EKG tersebut, maka diperlukan adanya rangkaian switching yang
dapat memenuhi:
1. Kaidah Wilson
2. Kaidah segitiga Einthoven (Einthovens Triangle Theorem).
Data grafis yang dibutuhkan berupa sinyal mixed hasil penggabungan
besar tegangan (V) yang dihasilkan oleh sejumlah titik pengukuran pada tubuh yang
berubah terhadap waktu (t). Oleh karena itu ada beberapa parameter listrik yang perlu
18
diperhatikan pada sumber sinyal analog (dalam hal ini adalah jantung) agar dapat
diperoleh sinyal EKG standar, yaitu:
1. Besar tegangan yang dihasilkan saat jantung berkontraksi (V) berkisar antara
0.2mV 1mV.
2. Rentang frekuensi (f) sinyal EKG, yaitu antara 0.05Hz 100Hz.
3. Noise (N) dari jala-jala listrik yang besarnya dapat mencapai 10mV.
4. Resistansi kulit yang tinggi (R), sehingga membutuhkan teknik penyadapan yang
baik.
Berdasarkan spesifikasi sinyal sumber, terlihat bahwa diperlukan adanya
pengkondisi sinyal agar berada pada rentang yang dapat diukur. Instrumen EKG yang
dirancang akan berbasis PC. Pemilihan PC sebagai unit penampil sinyal EKG adalah
karena penggunaan PC yang sudah universal dan fleksibilitas untuk pengembangan,
misalnya untuk pengolahan dan analisis lebih lanjut secara digital (digital signal
processing). Untuk dapat diterima oleh PC, maka sinyal EKG analog perlu diakuisisi
menjadi sinyal digital.
Selanjutnya agar dapat memberikan data grafis sinyal EKG, maka
instrument EKG berbasis PC ini harus memiliki program aplikasi yang mampu
mengambil data tegangan sinyal EKG analog yang telah di-digitalisasi dan menampilkan
bentuk sinyal EKG yang berhasil diambil dari elektroda penyadap.
1.3. Tujuan dan Manfaat
Tujuan dari penelitian ini adalah membuat suatu sistem instrumentasi
EKG berbasis PC dengan interface USB. Perancangan instrumen EKG ini diharapkan
dapat memberikan beberapa manfaat sebagai berikut:
1. Bagi civitas akademika Teknik Elektro Sanata Dharma:
a. Menambah wawasan mengenai penerapan elektronika pada bidang
kedokteran.
b. Dapat menjadi bahan pembelajaran di laboratorium dan bagi perancangan alat
elektromedis lainnya.
2. Bagi kalangan akademisi dan praktisi elektronika:
19
c. Sebagai literatur referensi tentang peralatan elektromedis.
d. Memberikan pengenalan mengenai biopotensial dan teknik akuisisinya.
3. Bagi perkembangan ilmu pengetahuan dan teknologi:
e. Sumber bagi pengembangan peralatan medis lainnya berbasis PC.
1.4. Batasan Masalah
Perancangan instrumen EKG ini dibatasi pada hal-hal sebagai berikut:
1. Sumber sinyal masukan berasal dari Simulator-EKG.
2. Probe pasien menggunakan 10-electrode patient cable dari ECG Cardisuny
keluaran Fukuda.
3. Rancangan EKG adalah 12-lead EKG.
4. Perancangan multiplexer untuk memenuhi Kaidah Wilson dan Kaidah Segitiga
Einthoven menggunakan multiplexer analog terkendali digital.
5. Pengendali digital untuk multiplexer dengan mikrokontroler.
6. Unit pengkondisi sinyal berupa:
a. Penguat Instrumentasi INA114 dan rangkaian Right Leg Driven (RLD).
b. Filter analog: HPF, LPF, dan Filter Notch.
c. Penguat akhir dan rangkaian Offset untuk menyesuaikan ke level tegangan
ADC.
7. Pengolah sinyal adalah mikrokontroler AVR AT90S2313.
8. Cara pengiriman data ke PC dengan protocol USB
9. Program aplikasi menggunakan Delphi terbatas pada menampilkan plot-waveform
dari sinyal EKG (bukan bersifat recording/tidak dapat disimpan).
10. Sinyal yang ditampilkan/ di-plot dipilih secara otomatis oleh perangkat keras dan
bukan bersifat software selectable.
1.5. Metodologi Penelitian
Penelitian ini dilakukan dengan langkah-langkah sebagai berikut:
1. Pengumpulan literatur pendukung.
20
2. Perancangan perangkat keras terdiri:
a. Perhitungan komponen menggunakan rumus-rumus pada dasar teori dan
program Filter42.
b. Simulasi hasil perhitungan dengan program EWB.
c. Perancangan skematik dan layout PCB dengan ORCAD 9.2.
d. Pembuatam masing-masing modul perangkat keras.
3. Perancangan perangkat lunak untuk pengendali selektor, ADC, dan modul USB
menggunakan STK500 dan AVR Studio 4.
4. Pembuatan program aplikasi Delphi yang dapat menerima data melalui interface
USB.
5. Pengujian masing-masing bagian (lihat Tabel 1-1).
6. Pengujian keseluruhan.
7. Pembuatan laporan
Metode pengujian masing-masing bagian beserta parameter yang diukur diperlihatkan
pada Tabel 1-1.
1.6. Sistematika Penulisan
Tugas akhir ini terdiri dari lima bab. Sistematika penulisan tugas akhir ini
adalah sebagai berikut:
BAB I PENDAHULUAN
Memuat latar belakang, perumusan masalah, tujuan dan manfaat, metodologi
penelitian, dan sistematika penulisan.
BAB II DASAR TEORI
Berisi dasar-dasar Elektrokardiograf, bioampifier, pengkondisi sinyal,
mikrokontroler, dan teori-teori lainnya yang diperlukan untuk merancang suatu
instrumen EKG.
BAB III PERANCANGAN INSTRUMENTASI EKG
Membahas perancangan instrumen EKG meliputi perancangan perangkat keras
dan perangkat lunak. Perangkat keras terdiri dari: selektor analog dan
21
pengendalinya, penguat dan filter, catu daya, konverter analog ke digital, dan
modul USB. Perangkat lunak terdiri dari program assembler untuk pengendali
selektor, konverter analog ke digital, dan akuisisi USB serta program aplikasi
waveform plotter berbasis Delphi.
BAB IV HASIL DAN PEMBAHASAN
Berisi hasil pengukuran dan pembahasan pada implementasi rancangan
instrumen EKG.
BAB V KESIMPULAN DAN SARAN
Berisi kesimpulan dan saran.
22
Tabel 1-1. Metode Pengujian
No
Nama modul
Keterangan
Parameter
yang diuji
1. Pengendali
Selektor
Modul ini berfungsi mengeluarkan 6 bit secara
bersamaan (paralel) sesuai dengan konfigurasi
selektor yang dibutuhkan. Pengujian dilakukan
dengan cara mengukur level tegangan pada
masing-masing port (L/H) dan pengujian simultan
menggunakan 6 LED
Level tegangan
untuk high dan
low (V), waktu
perubahan
konfigurasi
LED (t)
2. Selektor
Analog
Modul ini diuji dengan masukan 6 bit dari
Pengendali Selektor.
Selektor yang
terpilih.
3. Penguat
Instrumentasi
Pengujian dilakukan dengan cara mengukur
kestabilan CMRR pada rentang frekuensi EKG
CMRR (dB)
4. HPF Rangkaian filter pelewat rendah ini dirancang
dengan menggunakan beberapa metode dan setiap
metode diuji atenuasi-nya pada fc = 0.5Hz
Atenuasi (dB)
5. LPF Filter pelewat rendah dirancang dengan beberapa
metode dan diuji atenuasi-nya pada fc = 150Hz
Atenuasi (dB)
6. Filter Notch Filter Notch ini diuji dengan cara mengukur
atenuasi pada fc = 50Hz
Atenuasi (dB)
7. Penguat akhir
dan offset
Pengujian dilakukan pada rangkaian dengan cara
mengukur penguatan sinyal, offset, dan inverter.
Asinyal, Aoffset,
Ainverter.
8. Catu daya Pengujian kestabilan catu daya Vout
9. Modul
Konversi
(ADC, USB,
dan program)
Modul-modul ini diuji secara bersamaan karena
hasil akuisisi sinyal analog ke PC tidak dapat
dilihat tanpa program aplikasi dan sebaliknya.
Dapat mem-
plot grafis
perubahan
sinyal analog
0 5V, waktu
perekaman 1
siklus (t).
23
BAB II
DASAR TEORI
Pengukuran sinyal jantung dengan menggunakan elektrokardiograf
merupakan salah satu pemeriksaan diagnostik yang penting. Beberapa kelainan jantung
sering dapat diketahui berdasarkan data elektrokardiograf (EKG), walau tetap harus
memperhatikan faktor lainnya. Sinyal-sinyal EKG merupakan hasil rekaman grafis
potensial listrik yang ditimbulkan jantung saat berkontraksi.
Elektrokardiograf merupakan alat elektronika kedokteran untuk mengukur
potensial biolistrik yang disebabkan oleh aktifitas listrik otot jantung. Arus elektrik
timbul pada saat otot jantung melakukan kontraksi dan menghasilkan suatu medan listrik
yang berubah terhadap waktu. Hal ini mengakibatkan munculnya potensial biolistrik di
kulit manusia. Elektroda-elektroda yang ditempelkan pada kulit mengambil potensial
listrik ini sebagai masukan bagi instrumen EKG. Sinyal yang ditangkap elektroda itulah
yang dinamakan sinyal bioelektrik jantung.
Penjelasan mengenai potensial biolistrik tubuh, sinyal EKG yang
ditimbulkan, cara pendeteksian sinyal EKG, serta apa dan bagaimana prinsip dan cara
kerja elektrokardiograf , akan dijelaskan pada bab ini.
2.1. Sinyal Biopotensial Jantung dan Pengukurannya
Pembahasan sinyal biopotensial jantung ini dibagi menjadi beberapa hal
utama, yaitu penjelasan mengenai bagaimana sistem konduksi elektrik pada jantung,
apakah yang disebut sebagai sinyal elektrokardiograf, dan bagaimana sistem penempatan
elektroda pada tubuh untuk mendapatkan data-data yang diperlukan dokter untuk
melakukan diagnosa.
24
2.1.1. Sistem Konduksi Elektrik pada Jantung
Ada sebuah titik pada jantung yang bertugas untuk membangkitkan
potensial aksi. Titik tersebut disebut titik SA (Sino-Atrial), berada di serambi kanan
jantung. Apabila potensial aksi terjadi, tejadi propagasi menyebar ke seluruh bagian
jantung dan mengakibatkan kontraksi dan aksi systole-diastole. Untuk lebih jelasnya akan
dijelaskan berikut ini.
Ada dua jenis otot halus yang membentuk 4 ruang di dalam jantung, yaitu
serambi kanan (right atrium), serambi kiri (left atrium), bilik kanan (right ventricle), dan
bilik kiri (left ventricle). Darah dari jaringan tubuh masuk ke serambi kanan, mengalir ke
bilik kanan untuk kemudian dipompa ke paru-paru. Sedangkan darah yang berasal dari
paru-paru memasuki jantung melalui serambi kiri, bergerak ke bilik kiri, dan akhirnya
dipompa ke sistem sirkulasi tubuh.
Jantung merupakan sumber potensial biolistrik. Hal ini disebabkan oleh
aktifitas listrik otot jantung yang merupakan suatu sistem konduksi elektrik. Sistem
konduksi elektrik jantung terdiri dari Sinoatrial (SA) node, Bundle of His,
Atrioventricular (AV) node, suatu jaringan yang disebut Bundle Branches, dan Purkinje
Fibers. Struktur sistem konduksi elektrik jantung ditunjukkan pada Gambar 2-1.
Gambar 2-1. Struktur sistem konduksi elektrik jantung
25
SA-node berfungsi sebagai pacemaker yang menentukan frekuensi denyut
jantung. Hal ini disebabkan oleh kemampuanya menghasilkan depolarisasi yang akan
merambat ke sel-sel lain dalam jantung. Potensial aksi yang dihasilkan SA-node
dikendalikan oleh sistem saraf pusat sehingga laju deyut jantung dapat diatur secara
otomatis.
Depolarisasi yang dihasilkan SA-node merambat ke seluruh serambi,
menyebabkan serambi berkontraksi, dan darah mengalir ke bilik jantung melalui katub
jantung . sinyal depolarisasi ini mencapai AV-node dalam waktu 40 ms. Rendahnya
kecepatan konduksi pada jaringan AV-node menyebabkan proses depolarisasi tiba di
purkinje sistem setelah 110 ms, yang diikuti oleh kontraksi bilik jantung. Darah yang
terdapat di bilik kanan dipompa ke paru-paru sementara bilik kiri memompa darah ke
sistem sirkulasi tubuh. Periode kontraksi ini disebut systole.
Potensial aksi berada di bilik jantung selama 200 250 ms. Selang waktu
ini memungkinkan bilik jantung memompa seluruh darah yang ada di dalamnya ke
pembuluh nadi. Jantung kemudian mengalami repolarisasi selama periode istirahat, yang
disebut sebagai diastole. Periode diastole bertahan sekitar 550 ms dan siklus di dalam
jantung berulang.
2.1.2. Sinyal Elektrokardiogram
Sinyal EKG yang ditunjukkan pada Gambar 2-2 diberi label P, Q, R, S, T,
yang mengindikasikan kodisi-kondisi tertentu pada jantung.
Tabel 2-1. Interval EKG
Interval Waktu (s) Kejadian
Interval PR 0.12 0.20 Depolarisasi atrium dan hantaran melalui simpul AV.
Kompleks QRS
0.08 0.10 Depolarisasi ventrikel dan repolarisasi atrium.
Interval QT 0.40 0.43 Depolarisasi ventrikel + repolarisasi ventrikel.
Interval ST 0.31 -0.33 Repolarisasi ventrikel.
Interval RR 0.60 1.00 Satu siklus
26
Gambar 2-2. Sinyal EKG standar
Gelombang P timbul pada saat terjadinya depolarisasi pada serambi
(atrium), sementara kompleks QRS timbul pada saat proses depolarisasi terjadi di bilik
jantung (ventricle). Amplitudo gelombang R pada kompleks QRS berkisar antara 1 mV.
Gelombang T terbentuk dari proses repolarisasi otot-otot bilik jantung. Waktu yang
dibutuhkan untuk setiap interval beserta penyebabnya dapat dilihat pada Tabel 2-1
27
berikut. Gambar 2-3 memperlihatkan perjalanan terbentuknya sinyal elektrokardiograf
berserta gambar vektornya.
Gambar 2-3. Perjalanan terbentuknya sinyal EKG
2.1.3. Penempatan Elektroda
Pengukuran sinyal bioelektrik jantung dilakukan dengan menempatkan
elektroda-elektroda di sekeliling jantung. Kaidah umum yang dipakai sekarang adalah
kaidah Wilson dan segitiga Einthoven. Gambar 2-4 adalah penempatan elektroda EKG
pada tubuh dengan kedua metode tersebut diatas, ditambah 6 lead sagital.
28
Gambar 2-4. Penempatan elektroda pada tubuh
Kaidah segitiga Einthoven dinyatakan dalam tiga lead badan bipolar yaitu
lead I, II, dan III dengan ketentuan sebagai berikut:
1. Lead I : elektroda pada tangan tangan kiri terhubung dengan masukan non-
inverting dari penguat dan elektroda tangan kanan terhubung pada masukan
inverting.
2. Lead II : elektroda pada kaki kiri terhubung dengan masukan non-inverting dari
penguat dan elektroda tangan kanan terhubung pada masukan inverting (elektroda
tangan kiri terhubung singkat dengan kaki kanan).
29
3. Lead III : elektroda pada kaki kiri terhubung dengan masukan non-inverting dari
penguat dan elektroda tangan kiri terhubung pada masukan inverting (elektroda
tangan kanan terhubung singkat dengan kaki kanan).
Sementara kaidah Wilson dinyatakan dalam tiga lead badan unipolar,
yaitu lead aVL, aVR, dan aVF dengan ketentuan sebagai berikut:
1. Lead aVR : elektroda tangan kanan ke masukan non-inverting, masukan dari
tangan dan kaki kiri dijumlahkan dan masuk ke masukan inverting.
2. Lead aVL : elektroda tangan kiri ke masukan non inverting, masukan dari tangan
kanan dan kaki kiri dijumlahkan dan masuk ke masukan inverting.
3. Lead aVF : elektroda kaki kiri ke masukan non inverting, masukan dari tangan
kanan dan kaki kiri dijumlahkan dan masuk ke masukan inverting.
Untuk lead V1 V6 diletakkan mengitari tulang rusuk dada sebelah kiri ,
ditunjukan untuk mendapatkan informasi sagital jantung.
Sinyal dari jantung tersebut masih lemah, berkisar 500 ìV 4 mV
sehingga harus diperkuat dulu sebelum dapat diolah, selain itu perlu juga
dipertimbangkan hal-hal lain dalam pengolahan sinyal, seperti derau dari otot dan derau
dari jala-jala yang semuanya masuk dalam suatu sistem EKG.
2.2. Elektrokardiograf
Pada dasarnya, elektrokardiogram mengambil potensial biolistrik tubuh
sebagai masukan dan meneruskan sinyal EKG pada media penampil. Namun proses yang
terjadi di dalam instrumen EKG tidak sesederhana itu. Potensial bio listrik jantung yang
direkam sangat kecil (berkisar 1 mV) sehingga sangat terpengaruh oleh sinyal-sinyal
elektrik yang ada di sekitarnya. Untuk mendapatkan sinyal EKG yang dapat memberikan
informasi optimal mengenai kondisi jantung pasien, instrumen EKG harus mengolah
potensial biolistrik jantung terlebih dahulu sebelum meneruskannya ke media penampil.
30
Elektroda digunakan sebagai alat perekam sinyal EKG. Untuk
mendapatkan potensial biolistrik jantung, elektroda harus dipasang pada bagian-bagian
tubuh tertentu. Rendahnya nilai potensial biolistrik jantung menyebabkan ECG-amplifier
merupakan sub-sistem terpenting dalam instrumen EKG. Beberapa sub-sistem penting
dari EKG adalah sebagai berikut:
a. Elektroda
b. Rangkaian Wilson dan Einthoven
c. Penguat instrumentasi
d. Filter
e. Pengolah data
Diagram blok suatu sistem instrumentasi EKG diperlihatkan pada Gambar 2-5 berikut.
Gambar 2-5. Sistem instrumentasi EKG
2.2.1. Elektroda
Untuk mendapatkan potensial biolistrik tubuh, elektroda harus mengubah
arus ionik yang mengalir di dalam tubuh menjadi arus elektron yang dapat mengalir
melalui kabel pengantar.
31
Salah satu jenis elektroda yang biasanya digunakan untuk proses
perekaman jangka pendek adalah suction cup electrode, yang ditunjukkan pada Gambar
2-6. Sementara untuk proses perekaman jangka panjang, seperti yang biasa digunakan
bagi pasien dalam perawatan intensif pada bagian ICU (Intensive Care Unit), digunakan
body-surface electrode. Jenis body-surface electrode yang biasa digunakan ditunjukkan
pada Gambar 2-7.
Gambar 2-6. Suction cup electrode
Gambar 2-7. Body surface electrode (a) tipe topi (b) penampang lintang (c) tipe disposable
Elektroda ini terdiri dari plat logam Ag-AgCl yang terletak di bagian atas
kolom berisi gel konduktif. Kolom berisi gel konduktif ini digunakan untuk menjaga agar
32
plat logam Ag-AgCl tidak bergeser pada saat pasien bergerak. Struktur kolom ini
dikelilingi oleh karet yang salah satu permukaannya berlapis bahan perekat.
2.2.2. Rangkaian Wilson dan Einthoven
Perekaman sinyal EKG harus memenuhi Kaidah Wilson dan Kaidah
Segitiga Einthoven. Agar dapat memenuhi hal tersebut, maka diperlukan suatu rangkaian
yang bersifat sebagai switching yang dapat menyalurkan lead-lead yang diiginkan.
Secara elektronis, Kaidah Wilson dan Einthoven dapat diterapkan sebagai berikut.
33
Keterangan: RA = right arm RL = right leg
LA = left arm LL = left leg
Untuk menyalurkan lead-lead seperti kofigurasi diatas maka diperlukan multiplexer
analog dual-channel. Sebagai multiplexer analog, CD4052 memiliki delapan masukan
(X0X4 dan Y0Y4) yang dapat dikendalikan secara digital melalui pin A, B, dan INH.
Table kebenaran dan karakteristik multiplexer CD4052 diperlihatkan pada Tabel 2-2 dan
Tabel 2-3.
Tabel 2-2. Tabel kebenaran multiplexer CD4052
State input
Output Inhibit B A
0 0 0 0X,0Y
0 0 1 1X,1Y
0 1 0 2X,2Y
0 1 1 3X,3Y
1 * * Tidak aktif
Tabel 2-3. Karakteristik high (H) dan low (L) multiplexer CD4052
34
2.2.3. Penguat Instrumentasi
Semua instrumentasi yang dioperasikan di dalam suatu ruangan yang
terkoneksi dengan jala-jala listrik, akan mendapatkan derau yang diperoleh dari adanya
kopling kapasitansi antara rangkaian dengan jala-jala. Arus dari kopling kapasitans yang
menyebabkan common voltage ditunjukkan pada Gambar 2-8.
Gambar 2-8. Arus dari kopling kapasitans yang menyebabkan
common voltage (VC)
Salah satu cara untuk mengurangi hal tersebut adalah dengan
menggunakan penguat instrumentasi. Penguat instrumentasi mempunyai karakteristik:
a. Kemampuan untuk mencapai penguatan tinggi dengan nilai resistor yang rendah
b. Impedansi masukan yang sangat tinggi
c. CMRR tinggi
Penguatan tinggi diperlukan untuk memperkuat sinyal EKG, yang berkisar
1 mV, ke sinyal yang dapat dibaca oleh ADC (Analog to Digital Converter) yang berkisar
0 5 V. Sedangkan impedansi masukan yang tinggi akan membuat arus yang terjadi
akibat kopling kapasitansi lebih banyak mengalir ke ground daripada ke instrumen.
Sedangkan CMRR (Common Mode Rejection Ratio) tinggi diperlukan untuk
menghilangkan sisa-sisa erau yang masih ada. CMRR adalah perbandingan antara
penguatan diferensial dengan penguatan sinyal common. Penguat instrumentasi
sebenarnya adalah pengembangan dari penguat diferensial yang memperkuat beda
35
tegangan antara dua terminal masukan OpAmp. Sedangkan penguatan sinyal common
adalah penguatan yang dilakukan apabila kedua terminal masukan OpAmp diberi sinyal
yang sama besar dan fasanya. Semakin besar CMRR, berarti semakin besar pula derau
yang dihilangkan karena pada dasarnya sinyal common adalah sinyal derau dari jala-jala.
Penguat instrumentasi merupakan pengembangan dari penguat diferensial
untuk memenuhi tuntutan impedansi masukan yang tinggi, penguatan yang dapat diubah-
ubah, serta CMRR yang tinggi. Jika dilihat pada Gambar 2-9, penguat insturmentasi
merupakan gabungan dari dua buah penguat diferensial dimana penguat pertama
merupakan kombinasi penguat diferensial standar yang mempunyai masukan dan output
diferensial dengan penguatan sesuai persamaan (2.1) berikut.
1
2
21
0 21
R
R
VV
V
211
20
21 VV
R
RV
(2.1)
Gambar 2-9. Rangkaian 3 OpAmp pembentuk penguat instrumentasi
Penguat kedua merupakan penguat diferensial standar yang dapat berperan
sebagai buffer ataupun penguat tambahan dengan penguatan sebesar 3
4
R
R. Sehingga
penguatan total adalah seperti diperlihatkan pada persamaan (2.2).
36
213
4
1
20
21 VV
R
R
R
RV
(2.2)
Kita dapat mengubah besar penguatan secara mudah dengan mengubah nilai R1 dengan
asumsi R2, R3, R4 tetap.
Penguat terisolasi (Isolation Amplifier) secara umum mempunyai
kelebihan pada rasio sinyal terhadap derau yang lebih tinggi serta berfungsi juga sebagai
pengaman arus balik ke pasien. Namun harganya mahal dan sulit diperoleh. Untuk itu
digunakan penguat instrumentasi yang terdiri dari tiga buah OpAmp dengan rangkaian
pada Gambar 2-10. Penguatan total pada penguat instrumentasi ini dapat diatur dengan
mengubah nilai GR sesuai persamaan (2.3).
Gtotal R
kG
501 (2.3)
Gambar 2-10. Skema INA114 yang terdiri dari 3 OpAmp
2.2.4. Filter
Filter yang dipakai pada instrumentasi ini adalah High Pass Filter 0.5Hz,
Low Pass Filter 150Hz, serta Notch Filter 50Hz. High Pass Filter bertugas melewatkan
sinyal di atas 0.05 Hz sebagai drift compensation. Low Pass Filter bertugas sebagai anti
37
aliasing karena sinyal nantinya akan diubah ke bentuk digital. Kedua bentuk filter
tersebut berfungsi sebagai Band Pass Filter dengan memperhatikan bahwa range sinyal
EKG berkisar antara 0. 5 150 Hz. Notch Filter disini berfungsi sebagai penghilang
derau yang diakibatkan oleh tegangan jala-jala 50 Hz. Filter aktif menggunakan op-amp
dapat dirancang dengan beberapa metode.
2.2.4.1. Metode Sallen-key (Unity Gain)
Metode Unity Gain merupakan metode untuk merancang filter dengan dua
variable yang ditentukan, yaitu R dan C. Metode ini dapat digunakan untuk merancang
baik LPF maupun HPF. Perancangan HPF dapat dilakukan dengan menggunakan
konfigurasi LPF yang dinormalisasi. Rangkaian dasar LPF menggunakan Metode Unity
Gain diperlihatkan pada Gambar 2-11.
Gambar 2-11. Rangkaian dasar konfigurasi LPF Metode Unity Gain
Rangkaian dasar diatas merupakan filter orde 2. Untuk pengembangan
menjadi orde 4, 6, 8, dan seterusnya, dapat dilakukan dengan penambahan stage
berikutnya. Perancangan suatu tapis pelewat rendah dapat dilakukan dengan cara
menentukan orde filter yang dibutuhkan. Nilai-nilai Cij pada rangkaian dasar dapat
ditentukan dengan melihat Table Butterworth (lihat Lampiran A) sesuai orde yang
bersangkutan. Dengan memilih suatu nilai R tertentu (misal: 10kΩ), maka nilai-nilai C
38
pada rangkaian implementasi dapat ditentukan dengan menggunakan pesamaan (2.4)
berikut.
'
'
2 ijC
ijij
Rf
CC
(2.4)
dimana: ijC = nilai normal kapasitor dari Tabel Butterworth (lihat Lampiran A)
'ijC = nilai kapasitor pada rangkaian implementasi
Rij = nilai normal resistor pada rangkaian dasar (1Ω)
Rij = nilai resistor yang ditentukan pada rangkaian implementasi
fc = frekuendi cutoff filter yang dirancang
Metode Unity Gain untuk merancang suatu tapis pelewat tinggi dilakukan dengan cara
menormalisasi rangkaian dasar LPF ke bentuk HPF. Rangkaian normalisasi HPF dapat
dilihat pada Gambar 2-12.
Gambar 2-12. Rangkaian normalisasi HPF Metode Unity Gain
Untuk menentukan nilai-nilai variabel R dan C yang dibutuhkan dapat
dilakukan dengan cara mengambil suatu nilai fixed untuk C (misal: 470nF) dan
mementukan R yang dibutuhkan dengan persamaan (2.5).
'
'
2
/1
ijC
ijij
Cf
CR
(2.5)
dengan: ijC = nilai normal LPF kapasitor dari Tabel Butterworth.
39
'ijC = nilai fixed kapasitor yang dipilih untuk rangkaian implementasi
Rij = nilai normal resistor pada rangkaian dasar (1Ω)
Rij = nilai resistor yang ditentukan pada rangkaian implementasi
fc = frekuendi cutoff filter yang dirancang
2.2.4.2. Metode Multi-purpose State Variable
Filter State Variable merupakan filter aktif yang dapat secara simultan
menghasilkan keluaran lowpass, highpass, maupun bandpass dari sebuah masukan.
Rangkaian normalisasi filter State Variable dapat dilihat pada Gambar 2-13.
Gambar 2-13. Rangkaian normalisasi Filter State Variable
Untuk merancang suatu tapis pelewat tinggi maupun tapis pelewat rendah, dapat dibuat
pada filter State Variable yang sama. Setelah menentukan frekuensi cutoff (fC) dan
faktor kualitas (Q) dari Tabel Butterworth, maka dapat ditentukan nilai QR , dengan
pesamaan (2.6).
13 QRQ (2.6)
Selanjutnya dilakukan prosedur penskalaan frekuensi dan penskalaan impedansi dengan
persamaan (2.6) dan (2.7) berikut.
40
r
r
r
rf
fK
2
(2.7)
(2.8)
Pada perancangan filter Bandpass dan filter Notch, faktor kualitas (Q) ditentukan
berdasarkan frekuensi cutoff (fC) dan bandwith yang diinginkan sesuai persamaan (2.9).
BW
fQ 0 (2.9)
Filter Notch diperoleh dengan menjumlahkan output dari bagian lowpass dan highpass
dengan menggunakan op-amp tambahan, seperti yang diperlihatkan pada Gambar 2-14.
Gambar 2-14. Op-amp tambahan untuk Filter Notch
Filter State Variable juga dapat dirancang menggunakan program Filter42.
Filter42 merupakan program DOS yang dibuat oleh Texas Instrument untuk merancang
filter aktif menggunakan IC filter aktif universal UAF42 keluaran Burr-Brown.
Perancangan suatu filter untuk IC UAF42 menggunakan program Filter42 dapat
dilakukan dengan langkah-langkah sebagai berikut:
1. Step1: Pemilihan respon filter, yaitu: lowpass, highpass, bandpass, atau notch.
2. Step2: Pemilihan tipe filter, yaitu: Butterworth, Bessel, Chebyshev, atau Inverse
Chebyshev.
3. Step3: Pemilihan orde filter (n = 210).
4. Step4a: Penentuan frekuensi filter, yaitu:
a. Untuk filter lowpass/highpass: menentukan dBf 3 atau frekuensi cutoff
41
b. Untuk filter bandpass: menentukan frekuensi tengah, TENGAHf
c. Untuk filter notch: menentukan frekuensi notch, NOTCHf
Bila filter yang dirancang adalah highpass/lowpass maka langsung ke Step5.
5. Step4b: bila filter yang dirancang merupakan bandpass/notch maka perlu
menentukan Bandwidth (BW) atau Lf dan Hf .
6. Step5: nilai-nilai komponen dan blok diagram filter dapat dilihat dengan
menggunakan F3, sedangkan plot dapat dilihat dengan menggunakan F2.
Topologi UAF42 dapat dilihat pada Gambar 2-15.
Gambar 2-15. Topologi UAF42
2.2.4.3. Metode Uniform Capacitor
Metode Uniform Capacitor dapat diterapkan untuk merancang suatu tapis
pelewat rendah. Rangkaian dasar (orde 2) dari LPF Uniform Capacitor diperlihatkan
pada Gambar 2-16.
42
Gambar 2-16. Rangkaian dasar LPF Uniform Capacitor
Dengan metode ini, suatu tapis pelewat rendah dapat dengan mudah dirancang karena
menggunakan nilai kapasitor (C) yang tetap (fixed). Perancangan diawali dengan
menetukan orde filter sesuai Table Butterworth (lihat lampiran A). Jika dibutuhkan orde
lebih dari 2 (n = 4, 8, ) maka dapat dilakukan dengan penambahan stage berikutnya
dari rangkaian dasar diatas. Untuk menetukan nilai resistor Ri untuk setiap stage maka
digunakan persamaan (2.10) dan (2.11) berikut.
CfR
iCi ..4
1
, untuk i ganjil (i = 1, 3, 5, ) (2.10)
).(.
122
iiC
iCf
R
, untuk i genap (i = 2, 4, 6, ) (2.11)
dengan: Ri = nilai Ri pada setiap stage (ganjil dan genap)
C = kapasitor yang digunakan pada rangkaian implementasi
ái = lokasi real pole Ri dari Tabel Butterworth (lihat Lampiran A)
âi = lokasi imaginary pole Ri dari Tabel Butterworth (lihat Lampiran A)
fC = frekuensi cutoff
2.2.4.4. Metode Active Twin-T
Metode Twin-T merupakan metode yang sangat berguna untuk merancang
suatu filter notch karena karakteristiknya yaitu semakin meningkatnya atenuasi untuk
sinyal-sinyal yang frekuensinya semakin mendekati frekuensi notch.
43
Gambar 2-17. Topologi Active Twin-T
Topologi Active Twin-T diperlihatkan pada Gambar 2-17. Perancangan suatu filter notch
dengan metode Twin-T diawali dengan menentukan faktor kualitas (Q) sesuai frekuensi
notch dan bandwidth yang diinginkan. Penetuan Q adalah seperti persamaan (2.9).
Selanjutnya dipilih nilai dua variabel bebas, yaitu R dan C yang mudah diperoleh. Nilai
komponen lainnya dapat ditentukan dengan persamaan (2.12) dan (2.13) berikut.
Qk
4
11 (2.12)
CfR
Notch21
1 (2.13)
2.2.5. Pengolah Data
Pengolah data berupa sistem mikroprosesor yaitu mikrokontroler AVR
(Alf and Vegards Risc processor) seri AT90S2313 dari ATMEL. Keluaran dari sub
sistem ini adalah ke PC.
2.2.5.1. Fitur-Fitur AT90S2313
Mikrokontroler AT90S2313 memiliki fitur-fitur utama sebagai berikut:
1. 118 macam instruksi
2. 32 x 8 bit General Purpose Register
44
3. Memori program Flash pada ROM 2K word (1K x 16)
4. Memori EEPROM 128 byte
5. Memori data SRAM 128 byte
6. Jalur I/O 15 pin
7. Timer/counter 2 buah
8. Output PWM 1 channel
9. Serial I/O menggunakan USART
10. Komparator analog
2.2.5.2. Hardware
Konfigurasi pin AT90S2313 terlihat pada Gambar 2-18. Deskipsi masing-
masing pin dapat dilihat pada Tabel 2-4.
Gambar 2-18. Konfigurasi pin AT90S2313
2.2.5.3. Arsitektur AT90S2313
Mikrokotroler AT90S2313 merupakan mikrokontroler CMOS dengan
daya rendah yang memiliki arsitektur AVR RISC 8-bit. Arsitektur ini mendukung
kemampuan untuk melaksanakan eksekusi instruksi hanya dalam satu silkus clock
osilator. AVR ini memiliki fitur untuk menghemat konsumsi daya, yaitu dengan
menggunakan mode sleep. Mode sleep pada mikrokontroler AVR ada dua macam, yaitu
mode idle dan mode power down. Blok diagram mikrokontroler AT90S2313 dapat dilihat
pada Gambar 2-19.
45
Tabel 2-4. Deskripsi pin AT90S2313
VCC Power supply
GND Ground
Port B (PB7..PB0) Port B merupakan port I/O 8-bit bi-directional. Pin-pin pada
port ini dapat diberi resistor pull-up internal secara individual.
PB0 dan PB1 juga dapat digunakan untuk input sebagai
komparator analog. Buffer port B dapat mencatu arus hingga
20mA dan dapat secara langsung men-drive LED.
Port D (PD6..PD0) Port D memiliki tujuh buah pin I/O bi-directional, yakni
PD6..PD0. Seperti halnya port B, pin-pin pada port ini juga
mampu men-drive LED karena dapat mencatu arus hingga
20mA.
RESET
Reset input. Kondisi logika rendah 0 lebih dari 50 ns pada pin
ini akan membuat mikrokontroler masuk ke dalam kondisi reset.
XTAL1
Input bagi inverting oscillator amplifier dan input bagi clock
internal.
XTAL2 Output inverting oscillator amplifier.
Mikrokontroler AVR ini memiliki model arsitektur Harvard, dimana
memori dan bus untuk program dan data dipisahkan. Dalam arsitektur AVR , seluruh 32
register umum yang ada terhubung langsung ke ALU prosesor. Dari 32 register yang ada,
terdapat 6 buah register yang dapat digunakan untuk pengalamatan tidak lansung 16-bit
sebagai register pointer. Register tersebut memiliki nama khusus, yaitu X, Y, dan Z.
masing-masing terdiri dari sepasang register. Register-register khusus tersebut adalah
R26:R27 (register X), R28:R29 (register Y), R30:R31 (register Z).
46
Gambar 2-19. Blok diagram AT90S2313
Selain ketiga pasangan register tersebut, terdapat satu pasang register lagi
yang dapat digunakan bersama untuk pengolahan data 16-bit, yaitu R24:R25. Pasangan
register ini tidak memiliki nama khusus sebagaimana ketiga pasangan sebelumnya.
Arsitektur AVR AT90S2313 ditunjukkan pada Gambar 2-20.
47
Gambar 2-20. Arsitektur AT90S2313
2.2.5.4. Universal Serial Bus
Gambar 2-21. Konektor USB
tipe-A dan B
Tabel 2-5. Fungsi pin-pin pada
konektor USB
Pin Fungsi
Merah 1 VBus (4.75-5.25 volt)
Putih 2 Data-
Hijau 3 Data+
Hitam 4 GND
48
USB merupakan interface standar menggunakan serial bus. Sistem USB
terdiri dari host controller dan USB devices. Standarisasi USB berdasarkan USB
Implementers Forum adalah seperti Gambar 2-21 dan Tabel 2-5 berikut.
Fitur-fitur Universal Serial Bus:
1. PC bertindak sebagai host.
2. Sebanyak 127 usb devices dapat dihubungkan pada host, baik langsung maupun
menggunakan usb hub.
3. Panjang kabel USB adalah maksimal 5 meter dari host, dengan menggunakan usb
hub panjang kabel dapat mencapai 30 meter.
4. Maksimum data rate 480MB/detik (USB 2.0).
5. Kabel USB terdiri dari dua kabel power (+5V dan ground) dan kabel twisted pair
untuk data (D+ dan D-).
6. Pada kabel power, PC dapat mensuplai sampai 500mA pada tegangan 5V.
7. Devais berdaya rendah (seperti: mouse) dapat menggunakan power langsung dari
bus sedangkan untuk devais yang membutuhkan daya besar (seperti: printer)
harus menggunakan catu daya eksternal.
8. Umumnya devais USB dapat di-set pada mode sleep oleh PC host saat PC berada
pada mode power-saving.
Perangkat keras dan perangkat lunak yang terlibat pada sebuah system USB meliputi:
1. Perangkat keras:
a. USB Host Controller
b. USB Hub
c. Devais USB
2. Perangkat lunak:
a. USB Devais Driver
b. USB Driver
c. Host Controller Driver
Topologi suatu sistem USB adalah seperti Gambar 2-22 berikut.
49
Client SW
USB HostController
USB LogicalDevice
Function
Host Physical DeviceInterconnect
USB BusInterface
USB System SW
Actual communications flow
Logical communications flow
Implementation Focus Area
Function Layer
USB DeviceLayer
USB BusInterface Layer
Gambar 2-22. Topologi sistem USB
50
BAB III
PERANCANGAN INSTRUMENTASI EKG
PERANCANGAN PERANGKAT KERAS
Perancangan bagian perangkat keras dari sistem instrumen EKG akan
dibahas pada bagian ini. Bagian perangkat keras ini meliputi:
1. Selektor analog
2. Pengendali selektor
3. Penguat instrumentasi
4. Filter analog
5. Konverter analog ke digital
6. Modul USB
7. serta blok self-powered
3.1. Spesifikasi
Spesifikasi yang akan dijadikan acuan dalam perancangan bagian
perangkat keras sistem instrumen EKG adalah yang tertera pada Tabel 3-1 berikut.
Spesifikasi tersebut mengacu pada standar dari AAMI (Association of the Advancement of
Medical Instrumentation).
3.2. Diagram Blok
Gambar 3-1 memperlihatkan blok diagram dari perangkat keras sistem
instrumen EKG. Perangkat keras sistem instrumen EKG akan terdiri dari enam modul
PCB, yaitu: selektor, penguat dan tapis, ADC, modul USB, pengendali selektor, dan blok
self-powered.
51
Tabel 3-1. Spesifikasi perancangan bagian perangkat keras sistem instrumen EKG
Sistem EKG Standar 12-leads
Sinyal masukan Simulator-EKG
Penguatan 1000 kali
CMRR ≥ 100 dB
Lebar sinyal 0.5 150 Hz
Hardware filter:
LPF 150 Hz
HPF 0.5 Hz
Notch 50 Hz
Resolusi min 8 bit
PC interface USB- port
Sistem operasi Microsoft Windows
Spesifikasi software Menampilkan sinyal pada suatu program
plot waveform Delphi
Tampilan Lead EKG secara otomatis oleh
pengendali selektor
5DQJNDLDQ:LOVRQ6HOHNWRU$QDORJ
(OHFWURGH(&*3DWLHQW&DEOH
3HQJXDW$ZDO5LJKWOHJGULYHQ5/'
)LOWHUDQDORJ3HQJXDWDNKLU
3&
3RZHUVXSSO\9GF
*URXQG
.RQYHUWHU$QDORJNH
'LJLWDO
0RGXO$NXLVLVL86%
3&86%SRUW
0RGXO3HQJHQGDOL6HOHNWRU
Gambar 3-1. Diagram blok perancangan perangkat keras
sistem instrumentasi EKG
52
3.3. Perancangan
Pada perancangan perangkat keras terdapat beberapa hal yang perlu
diperhatikan dalam merancang sistem instrumentasi biomedika, antara lain:
1. Fungsi dasar dan spesifikasi yang disyaratkan
2. Penggunaan komponen yang tepat dengan nilai toleransi terkecil
3. Desain sesederhana mungkin untuk mengurangi kesalahan
4. Teknik grounding yang benar yang memperhatikan teknik peredaman derau.
3.3.1. Selektor Analog
Selektor analog merupakan modul yang langsung berhubungan dengan
kabel EKG. Modul ini terdiri dari rangkaian Wilson dan saklar analog. Modul ini
membutuhkan menggunakan catu daya +5V dan -5V untuk mengaktifkan komponen-
komponennya. Diagram blok modul ini terlihat pada Gambar 3-2.
Gambar 3-2. Diagram blok Selektor
Sinyal jantung yang akan direkam, disadap dari beberapa titik pengukuran.
Penyadapan dilakukan oleh beberapa buah elektroda yang diletakkan pada permukaan
kulit. Salah satu masalah yang timbul berkaitan dengan hal tersebut adalah impedansinya
yang tinggi yaitu sekitar 1 KÙ 10 KÙ bahkan dapat sampai 500 KÙ untuk kulit yang
53
kering. Oleh karena itu agar tidak terjadi distorsi sinyal yang dihasilkan, maka digunakan
ECG-gel.
Selektor analog mengadopsi rangkaian dari Cardiofax ECG-6501/6511.
Rangkaian ini difungsikan untuk menentukan lead yang akan direkam. Ada 12 lead yang
dihasilkan dari 10 buah elektroda yang dipasang secara simultan.
Perencanaan rangkaian selektor analog ini dapat dilihat pada Gambar 3-3.
Terlihat juga adanya rangkaian Wilson yang menghasilkan tiga lead augmentasi, yaitu
aVL, aVR, dan aVF.
Gambar 3-3. Rangkaian selektor analog [Cardiofax: Service Manual, Nihon Kohden]
Proses perekaman dilakukan secara bergantian. Sistem pemilihannya
dilakukan oleh empat buah IC multiplexer analog 4052. IC ini merupakan saklar analog
yang dikendalikan oleh kendali digital, berisi 4 kanal dengan masing-masing kanal berisi
2 input data (X0 .. X3, Y0 .. Y3). Keluaran dikontrol oleh pin A, B, serta INH untuk
54
mengontrol pemilihan IC. Pengoperasian multiplexer 4052 ini terlihat dari tabel
kebenaran pada Tabel 2-2.
3.3.2. Pengendali Selektor
Agar dapat menyalurkan lead yang akan direkam (lead I lead V6),
rangkaian selektor analog memerlukan bit-bit kontrol seperti Tabel 3-2, oleh karena itu
diperlukan suatu rangkaian yang dapat menghasilkan bit-bit kontrol tersebut.
Rangkaian pengendali selektor dapat dilihat pada Gambar 3-4. Rangkaian
ini mengunakan AT90S2313 untuk menghasilkan bit-bit seperti pada Tabel 3-2. Pada
rangkaian ini, port yang digunakan untuk mengeluarkan bit-bit kendali adalah port B.
Gambar 3-4. Rangkaian pengendali selektor [http://www.beyondlogic.org]
Dalam pengoperasian rangkaian ini, ada beberapa hal yang perlu diperhatikan, yaitu:
a. IC 4052 dapat beroperasi sebagai saklar analog, dengan baik pada perubahan bit
kendali 0.5 s.
b. Durasi 1 siklus sinyal ECG adalah ± 1.5 detik.
c. Rangkaian ini menggunakan Xtal 12MHz. Agar perekaman sinyal EKG dapat
dilakukan, pada implementasi diperlukan adanya delay pada algoritma
AT90S2313. Algoritma pengendali selektor ini akan dibahas lebih lanjut pada
bagian perancangan perangkat lunak
55
Tabel 3-2. Bit-bit Kontrol Rangkaian Selektor Analog
B A INH (U11) INH (U12) INH (U13) INH (U14)
0 0 0 1 1 1
0 1 0 1 1 1
1 0 0 1 1 1
1 1 0 1 1 1
0 0 1 0 1 1
0 1 1 0 1 1
1 0 1 0 1 1
1 1 1 0 1 1
0 0 1 1 0 1
0 1 1 1 0 1
1 0 1 1 0 1
1 1 1 1 0 1
0 0 1 1 1 0
3.3.3. Modul Penguat dan Filter
Modul ini terdiri dari pre-amp/penguat awal, right leg driven (RLD),
filter, dan penguat akhir. Pada filter, sebelum dituangkan dalam bentuk modul, dilakukan
perancangan dan simulasi menggunakan beberapa metode perancangan. Diagram blok
modul penguat diperlihatkan pada Gambar 3-5.
56
Gambar 3-5. Diagran blok Modul Penguat dan Filter
3.3.3.1. Penguat Instrumentasi
Seperti yang telah digambarkan sebelumnya, bagian penguat instrumentasi
(Instrumentation Amplifier/ IA) merupakan bagian terpenting dari instrumen EKG.
Bagian ini, selain memperkuat sinyal EKG ke level yang dapat dibaca/diolah lebih
lanjut, memegang peranan penting dalam mengurangi derau terutama derau dari jala-jala.
Pada perancangan ini, yang diperhatikan adalah sinyal EKG yang
diperkuat dan derau jala-jala. Sinyal kalibrasi EKG standar adalah 1 mV, sedangkan
apabila kita mengukur derau jala-jala pada osiloskop (dilakukan dengan tidak
menghubungkan probe pengukur pada apapun) didapatkan nilai 10 mV. Hal ini
menimbulkan masalah tersendiri, karena ternyata derau sepuluh kali lebih besar dari
sinyal EKG. Karenanya penguatan common dari penguat instrumentasi yang dipakai
harus mampu memperkecil/ memperlemahnya sehingga ketika diperkuat pada penguatan
diferensial, derau tersebut tidak meredam sinyal EKG.
Perancangan ini menggunakan IC INA114, yang mempunyai penguat
instrumentasi terintegrasi di dalamnya. IC ini mempunyai CMRR yang sangat tinggi,
mencapai 115 dB, sehingga cocok untuk digunakan dalam instrumen EKG. Perancangan
memakai penguatan bertingkat dengan INA144 berperan sebagai penguat awal dan
penguat akhir sekaligus sebagai rangkaian offset adalah OPA2227. Penguat awal
mempunyai penguatan yang lebih kecil, hanya 10 kali. Hal ini dikarenakan potensial
offset dari elektroda pasien yang dapat mencapai 300 mV, apabila penguatannya langsung
1000 kali, maka sinyal EKG akan teredam. Oleh karenanya, penguatan dibuat bertingkat
57
dengan penambahan rangkaian Right Leg Driven (RLD) untuk mengurangi potensial
offset tersebut. Rangkaian RLD diterangkan oleh Gambar 3-6.
Gambar 3-6. Rangkaian Right Leg Driven [datasheet INA114]
Pilihan untuk menggunakan IC khusus penguat instrumentasi di atas
dikarenakan sulitnya membangun penguat instrumentasi dari tiga buah OpAmp, yang
dapat mencukupi kebutuhan sistem instrumentasi biomedik, khususnya EKG yaitu
memiliki CMRR ≈ 100 dB.
Pada perancangan ini digunakan kRG 8.22
sehingga penguatan yang dicapai pada
penguat instrumentasi ini (penguatan awal) adalah:
92.9)8.2)(2(
501
k
kGawal
3.3.3.2. Filter
Filter adalah suatu rangkaian yang berfungsi menghalangi rentang
frekuensi tertentu. Pada instrumen EKG ini, digunakan tiga macam filter: filter frekuensi
rendah ( LPF ), filter frekuensi tinggi ( HPF ), dan Notch Filter. Pemilihan tersebut
memperhatikan bahwa sinyal EKG berkisar pada 0.05 100 Hz saja.
58
3.3.3.2.1. High Pass Filter
High Pass Filter (HPF) adalah suatu rangkaian khusus yang bertugas
menghalangi frekuensi rendah dan melewatkan frekuensi lebih tinggi. Dalam
perancangan ini HPF berfungsi sebagai drift compensation dengan fC = 0.5 Hz karena
keterbatasan kemampuan operasi perangkat keras yang bisa diperoleh. Perancangan yang
dilakukan adalah dengan menggunakan metode Unity Gain dan Multi-Purpose State
Variable sebagai pembanding.
Sallen- key (Unity Gain)
Spesifikasi awal dari filter ini adalah sebagai berikut:
fC = 0.5 Hz redaman -3dB
fS = 0.05 Hz redaman -80dB
AS = fC/ fS = 10 rad/s
Setelah dilihat pada grafik Butterworth pada lampiran, ternyata yang
memenuhi kriteria tersebut adalah orde 4 dengan nilai-nilai C sebagai berikut:
C11 = 1.082F C21 = 2.613F
C12 = 0.9241F C22 = 0.3825F
Rangkaian dasar konfigurasi LPF orde 4 diperlihatkan pada Gambar 3-7.
Gambar 3-7. Rangkaian dasar konfigurasi LPF
59
Rangkaian dinormalisasi ke dalam bentuk HPF seperti pada Gambar 3-8.
Gambar 3-8. Normalisasi ke bentuk HPF
Setelah dinormalisasi dengan menggunakan persamaan (2.5), dengan
mengambil Cij = 470 nF maka diperoleh:
kCf
CR
C
9.625)10.470)(5.0(2
082.1/1
2
/19'
11
11'11
kCf
CR
C
88.732)10.470)(5.0(2
9241.0/1
2
/19'
12
12'12
kCf
CR
C
186.259)10.470)(5.0(2
613.2/1
2
/19'
21
21'21
MCf
CR
C
77.1)10.470)(5.0(2
3825.0/1
2
/19'
22
22'22
Maka diperoleh rangkaian pada Gambar 3-9
.
Gambar 3-9. Rangkaian implementasi tapis pelewat tinggi menggunakan
metoda Sallen-key
60
Setelah itu rangkaian tersebut disimulasikan pada program Electronics
WorkBench (EWB). Ada dua titik yang diuji, yaitu titik pertama pada orde 2 (output
OpAmp 1) dan titik kedua pada orde 4 (output OpAmp 2) seperti yang tertera pada
Gambar 3-9. Tampak dari Gambar 3-10, semakin tinggi orde, semakin curam respon
amplitudonya sehingga semakin ideal dalam penggunaannya sebagai filter.
Gambar 3-10. Simulasi metode Sallen-key untuk HPF
menggunakan EWB
Karena keterbatasan komponen, dalam implenentasi perangkat keras digunakan
komponen-komponen berikut:
1. C = 470nF
2. R11 = 56kΩ + 560kΩ
3. R12 = 47kΩ + 680kΩ
4. R21 = 260kΩ
5. R22 = 1.7MΩ
61
Multi-Purpose State Variable
Metode ini memanfaatkan UAF-42 dengan program Filter42 dengan
spesifikasi sebagai berikut:
f0 = 0.5 Hz
Q = 0.707
tipe = Butterworth
orde = 2
Fungsi transfer HPF adalah:
22
2.
/ nn
HP
IN
HP
Qss
sA
V
V
Dengan menggunakan program Filter42, diperoleh nilai-nilai:
1. C 1,2 = 100nF
2. RF 1,2 = 3,160 MÙ
3. RG = 50 KÙ dan RQ = 44,20 KÙ
Sehingga terbentuk rangkaian pada Gambar 3-11.
Gambar 3-11. Rangkaian implementasi HPF menggunakan
metoda Multi-Purpose State Variable
62
Setelah disimulasikan, diperoleh Gambar 3-12.
Gambar 3-12. Simulasi metode Multi-Purpose State Variable untuk HPF
menggunakan EWB
3.3.3.2.2. Low Pass Filter
Low Pass Filter (LPF) adalah suatu rangkaian khusus yang bertugas
menghalangi frekuensi tinggi dan melewatkan frekuensi rendah. LPF disini selain
sebagai anti aliasing, berfungsi juga sebagai peredam derau frekuensi tinggi. Pada
perancangan ini dipilih frekuensi cutoff (fC) = 150 Hz. Nilai ini dipilih karena pada kasus
khusus (misalnya saat berolah raga) pada individu tertentu dapat muncul komponen-
komponen sinyal EKG yang beroperasi diatas 100 Hz.
Perancangan kali ini memakai beberapa metode, yaitu Unity Gain, Sallen-
Key, Uniform Capacitor, dan Multi-Purpose State Variable sebagai pembanding.
63
Sallen-key (Unity Gain)
Spesifikasi awal LPF dengan memperhatikan karakteristik sinyal EKG
adalah sebagai berikut:
fC = 150 Hz redaman -3dB
fS = 450 Hz redaman -77dB
AS = fS/ fC = 3 rad/s
Setelah dilihat pada grafik Butterworth pada lampiran, ternyata yang
memenuhi kriteria tersebut adalah orde 8 dengan nilai-nilai C pada tabel Butterworth
adalah sebagai berikut:
C11 = 1.02F C21 = 1.202F C31 = 1.8F C41 = 5.125F
C12 = 0.9808F C22 = 0.8313F C32 = 0.5557F C42 = 0.195F
Kofigurasi OpAmp-nya terlihat pada Gambar 3-13.
Gambar 3-13. Rangkaian dasar konfigurasi LPF
Setelah dinormalisasi dengan menggunakan persamaan (2.4), dengan
mengambil 'ijR = 10 KÙ maka diperoleh:
nFRf
CC
C
225.108)10.10)(150(2
02.1
2 3'11
11'11
nFRf
CC
C
066.104)10.10)(150(2
9808.0
2 3'12
12'12
64
nFRf
CC
C
536.127)10.10)(150(2
202.1
2 3'21
21'21
nFRf
CC
C
024.88)10.10)(150(2
8313.0
2 3'22
22'22
nFRf
CC
C
966.190)10.10)(150(2
8.1
2 3'31
31'31
nFRf
CC
C
526.58)10.10)(150(2
5557.0
2 3'32
32'32
nFRf
CC
C
779.543)10.10)(150(2
125.5
2 3'41
41'41
nFRf
CC
C
69.20)10.10)(150(2
195.0
2 3'42
42'42
Maka diperoleh rangkaian pada Gambar 3-14.
Gambar 3-14. Rangkaian implementasi LPF menggunakan
metoda Sallen-key
Gambar 3.15 adalah simulasi EWB untuk LPF dengan metode Unity Gain diukur pada
tiap-tiap keluaran OpAmp, yang berarti pada orde 2, 4, 6, dan 8. Dengan mengacu pada
Gambar 3.15, orde 2 adalah kurva yang berwarna biru, sedangkan orde 8 adalah kurva
yang berwarna ungu .
65
Gambar 3-15. Simulasi metode Sallen-key untuk LPF
menggunakan EWB
Hal ini memperlihatkan, semakin tinggi orde, kualitas filter semakin baik, karena yang
diharapkan adalah LPF dengan frekuensi cut-off pada 150 Hz.
Uniform Capacitor
Dengan spesifikasi sama seperti di atas, dengan memperhatikan Tabel
lokasi pole pada Butterworth orde 8 (lihat lampiran), didapat nilai-nilai sebagai berikut:
á1 = 0.9808 á2 = 0.8315 á3 = 0.5557 á4 = 0.1951
â1 = 0.1951 â2 = 0.5557 â3 = 0.8315 â4 = 0.9808
66
Rangkaian dasar LPF menggunakan metoda Uniform Capacitor dapat dilihat pada
Gambar 2-16. Dengan menerapkan persamaan (2.10) dan (2.11) pada rangkaian dasar
tersebut dan mengambil C = 0.01uF, diperoleh:
kR 09.54)10.10)(9808.0)(150(4
191
kR 2.212)1951.09808.0)(10.10)(150(
12292
kR 8.63)10.10)(8315.0)(150(4
193
kR 2.212)5557.08315.0)(10.10)(150(
12294
kR 486.95)10.10)(5557.0)(150(4
195
kR 2.212)8315.05557.0)(10.10)(150(
12296
kR 92.271)10.10)(1951.0)(150(4
197
kR 2.212)9808.01951.0)(10.10)(150(
12298
Maka diperoleh rangkaian pada Gambar 3-16.
67
Gambar 3-16. Rangkaian implementasi LPF menggunakan
metoda Uniform Capacitor
Gambar 3-17. Simulasi metode Uniform Capacitor untuk LPF
menggunakan EWB
68
Gambar 3-17 menunjukkan simulasi EWB dari perancangan LPF metode
Uniform Capacitor dari orde 2, 4, 6, dan 8. Orde 2 ditunjukkan pada kurva amplituda
paling bawah (kurva ungu) sedangkan orde 8 pada kurva teratas (kurva hijau). Sebaliknya
pada kurva fasa di bawahnya, terlihat pada keluaran orde 8 terdapat penguatan yang lebih
besar daripada orde-orde lain yang lebih kecil. Namun ternyata metode ini tidak mampu
mencapai frekuensi cut-off 150 Hz seperti yang diharapkan.
Multi-Purpose State Variable
Metoda ini menggunakan UAF-42 dengan spesifikasi sebagai berikut:
f0 = 150 Hz
Q = 0.707
tipe = Butterworth
orde = 2
Fungsi transfer LPF adalah:
22
2
/
.)(
nn
nLP
IN
LP
Qss
A
V
sV
Dengan menggunakan program Filter42, diperoleh nilai-nilai:
1. RF 1,2 = 1.070 MÙ
2. RG = 50 KÙ dan RQ = 44.20 KÙ
Sehingga terbentuk rangkaian pada Gambar 3-18. Rangkaian tersebut menghasilkan
UAF42 dengan karakteristik seperti pada Gambar 3.19. Tampak bahwa metode yang
dipakai mampu mencapai frekuensi cut-off seperti yang disyaratkan dengan kecuraman
yang cukup baik.
69
Gambar 3-18. Rangkaian implementasi LPF menggunakan
metoda Multi-Purpose State Variable
Gambar 3-19. Simulasi metode Multi-Purpose State Variable untuk LPF
menggunakan EWB
70
3.3.3.2.3. Notch Filter
Notch Filter atau dikenal juga sebagai Band Reject Filter adalah suatu
rangkaian khusus yang bertugas menghalangi rentang frekuensi diantara rentang
frekuensi rendah dan tinggi. Dalam kasus ini, frekuensi yang dihalangi adalah frekuensi
50 Hz yang merupakan frekuensi jala-jala yang dipakai di Indonesia.
Salah satu cara menghilangkan sinyal ini adalah dengan penambahan
Notch Filter pada frekuensi sinyal tersebut. Hanya saja spesifikasi notch haruslah ketat,
hanya meredam frekuensi 50 Hz saja dikarenakan sinyal EKG berada pada rentang 0.05
100 Hz. Notch sebenarnya juga merusak kualitas keluaran karena sinyal EKG juga
mempunyai nilai pada 50 Hz tersebut.
Ada dua metode yang diambil dalam perancangan kali ini, yaitu
perancangan berbasis Twin-T Network dan perancangan dengan menggunakan metode
Multi-Purpose State Variable.
Twin-T Network
Metode ini dipilih karena kesederhanaan rangkaian dan kemudahan
komponen. Rangkaian dasar Active Twin-T orde 2 dapat dilihat pada Gambar 2-17.
Spesifikasi awal yang diharapkan :
f0 = 50 Hz
BW = 4 Hz
Q = f0/ BW = 12.5
Dari spesifikasi awal tersebut, digunakan persamaan (2.12) dan (2.13). Dan dengan
mengambil R = 1MΩ, C = 10nF diperoleh nilai:
98.0)5.12(4
11
4
11
Qk
kCf
R 3.318)10.10)(50(2
1
2
19
01
nFnFC 20)10(22
71
kkR
15.1592
3.318
21
kMkR 980)1)(98.0(
kMRk 20)1)(98.01()1(
Dari nilai-nilai yang telah diperoleh di atas, didapat rangkaian Notch Filter seperti pada
Gambar 3-20.
Gambar 3-20. Rangkaian implementasi Notch Filter menggunakan
metoda Twin-T
Gambar 3-21 adalah hasil simulasi EWB untuk Notch Filter dengan metode Twin-T
Network.
72
Gambar 3-21. Simulasi metode Twin-T untuk Notch Filter
menggunakan EWB
Multi-Purpose State Variable
Pada perancangan ini digunakan metode yang mampu diimplementasikan
pada semua jenis filter dengan hanya mengubah nilai resistor dan kapasitornya. Untuk
itu, digunakan suatu IC khusus UAF-42 (Universal Active Filter) yang berisi 4 OpAmp.
Fungsi transfer yang dipakai adalah:
22
22
/
)(
)(
)(
nn
nBR
IN
BR
Qss
sA
sV
sV
Dengan spesifikasi:
f0 = 50 Hz
BW = 4 Hz
Q = f0/ BW = 12.5
73
Dengan menggunakan program Filter42, diperoleh nilai-nilai:
1. RF 1,2 = 3.16 MÙ
2. RG = 50 KÙ dan RQ = 2.15 KÙ
Setelah melalui program Filter42 didapatkan rangkaian pada Gambar 3-22.
Gambar 3-22. Rangkaian implementasi Notch Filter menggunakan
metoda Multi-Purpose State Variable
Simulasi yang dilakukan pada program EWB memperlihatkan grafik pada Gambar 3-23.
74
Gambar 3-23. Simulasi metode Multi-Purpose State Variable untuk Notch Filter
menggunakan EWB
Dari sejumlah rancangan diatas, maka diperoleh blok perancangan filter
dengan spesifikasi berikut:
1. High Pass Filter (HPF) : implementasi menggunakan metode Unity Gain (dengan
TL084)
2. Low Pass Filter (LPF) : implementasi menggunakan metode Multi-Purpose State
Variable (dengan UAF-42)
3. Notch Filter : implementasi menggunakan metode Multi-Purpose State
Variable (dengan UAF-42)
Pemilihan diatas berdasarkan respon yang dihasilkan dan juga dengan
mempertimbangkan penggunaan komponen, terutama resistor, karena semakin banyak
resistor yang digunakan maka toleransi akan semakin besar pula yang mengakibatkan
implementasi akan menghasilkan respon yang berbeda dari hasil simulasi
75
3.3.3.3. Penguat Akhir & Offset
Pada penguat instrumentasi, sinyal EKG awal hanya dikuatkan ± 10 kali
untuk menghindari terjadinya redaman oleh noise yang besarnya dapat mencapai 10mV.
Agar sinyal ini dapat dimanfaatkan pada post-processing maka perlu dikuatkan lagi agar
berada pada rentang 0V sampai 5V.
Pada perancangan ini, digunakan OPA2227 yang berfungsi sebagai
summing-amplifier. Skema summing-amplifier dapat dilihat pada Gambar 3-24.
Gambar 3-24. Skematik inverting summing amplifier
3
32
21
110 v
R
Rv
R
Rv
R
Rv
R
Rv fff
N
nn
n
f (3.1)
Keluaran dari filter yang berada pada rentang ± 10mV akan dikuatkan 200 kali.
Sedangkan untuk menaikkan sinyal ke level positif, maka keluaran filter tersebut akan
dijumlahkan dengan tegangan DC 2.5V yang didapat dengan membagi tegangan 12V dari
catu daya. Keluaran dari inverting summing ini kemudian akan dibalik kembali
menggunakan op-amp kedua pada OPA2227. Keluaran OPA2227 yang pertama dapat
ditentukan menggunakan persamaan (3.1) sebagai berikut.
76
CC
ffilterOUT
f vR
Rv
R
Rv
2)(
10
=
)12(
7.1
390)92.9(
2.2
390DCV
M
kmV
k
k DCVV 75.2758.1
Sedangkan OPA2227 yang kedua berfungsi sebagai inverter untuk mengubah keluaran
menjadi:
DCDCinin
f VVVVk
kv
R
Rv 72.2578.175.2578.1
10
100
Rangkaian implementasi menggunakan OPA2227 untuk penguat akhir & offset
diperlihatkan pada Gambar 3-25.
Gambar 3-25. Rangkaian implementasi penguat akhir & offset
Setelah disimulasikan menggunakan Program EWB, dengan memberikan masukan
10mV, maka rentang output berada pada 0 5V seperti diperlihatkan Gambar 3-26.
Gambar 3-26. Simulasi penguat akhir & offset menggunakan EWB
77
3.3.4. Catu Daya
Catu daya merupakan salah satu komponen penting dalam suatu sistem
instrumentasi karena merupakan sumber penyedia energi sehingga alat dapat bekerja.
Dalam instrumentasi kedokteran, catu daya diperhatikan dengan sangat serius karena dua
hal, keamanan pasien terhadap arus bocor dan pengelolaan derau. Pilihan terbaik adalah
menggunakan batere atau trafo isolasi.
Perancangan ini menggunakan catu daya dari USB-port yang mensuplai
tegangan sebesar +5V. Pemilihan perancangan catu daya menggunakan USB-port ini
dengan mempertimbangkan dua hal, yaitu:
1. Dengan menggunakan catu dari USB, maka devais ini dapat menjadi lebih praktis
karena bersifat self-powered.
2. ECG merupakan peralatan medis, oleh karena itu keamanan pasien terhadap arus
bocor sangat penting. Dengan menggunakan catu dari USB, problem adanya arus
bocor dapat teratasi, karena port USB dikendalikan oleh chip USB yang ada pada
motherboard dan device manager pada windows yang secara otomatis akan mem-
blok arus bocor yang dapat merusak peralatan-peralatan yang menggunakan USB
port sebagai I/O port-nya.
Rangkaian selektor membutuhkan catu daya + 5V dan -5V sedangkan modul penguat dan
filter menggunakan + 12V dan 12V. Sementara itu pengendali selektor dan converter
analog ke digital menggunakan + 5 V.
Perancangan catu daya ini menggunakan MC4063 yang berfungsi sebagai
DC-DC converter. Untuk memperoleh tegangan + 12V dan + 5V digunakan MC4063
yang berfungsi sebagai step-up converter. Rangkaian catu daya untuk step-up converter
dapat dilihat pada Gambar 3-27.
78
Gambar 3-27. Rangkaian catu daya positif [http://www.beyondlogic.org]
Sedangkan untuk tegangan 12V dan 5V digunakan MC4063 yang berfungsi sebagai
voltage-inverting. Skema catu daya voltage-inverting terlihat pada Gambar 3-28.
Gambar 3-28. Rangkaian catu daya negatif [http://www.beyondlogic.org]
3.3.5. Konverter Analog ke Digital
Konversi Analog ke Digital ini menggunakan mikrokontroler dari
ATMEL yaitu AT90S2313. Penggunaan mikrokontroler tersebut adalah sesuai dengan
spesifikasi yang diharapkan, seperti:
79
1. built-in ADC
2. mikrokontroler CMOS dengan daya rendah
3. Serial I/O menggunakan USART
4. in system programmable flash, memungkinkan penambahan program lewat
computer hanya dengan perubahan konfigurasi resistor
Sinyal keluaran dari penguat akhir yang berada pada range 0 5 Volt
masuk ke AIN0 pada AVR 2313. Keluaran dari AT90S2313 diteruskan ke modul akuisisi
USB. Rangkaian konversi diperlihatkan pada Gambar 3-29 berikut ini.
Gambar 3-29. Rangkaian konversi analog ke digital [http://www.usb.org]
3.3.6. Modul Akuisisi USB
Modul ini berfungsi untuk mengkonversi data dari modul ADC agar dapat
di akuisisi ke PC melalui interface USB-port. Pemilihan USB-port sebagai port untuk
antarmuka devais ECG ini adalah karena instalasi devais berbasis USB lebih fleksibel
(plug and play) dan tidak harus me-restart PC.
Pada perancangan ini digunakan konektor USB tipe-A. Bentuk fisik dan
spesifikasi konektor tipe-A dapat dilihat pada Gambar 2-21 dan Tabel 2-5.
Sinyal USB ditransmisikan melalui kabel data twisted-pair, dengan level sinyal 0-0.3 volt
untuk low (0) dan 2.8-3.6 volt untuk high (1).
80
Pada setiap pengiriman data, terjadi transmisi 3 paket. Skema transaksi via
USB adalah seperti pada Gambar 3.30 berikut.
Gambar 3-30. Fase transaksi USB
Setiap pengiriman diawali dengan pengiriman sebuah paket Token oleh USB host
controller (dalam hal ini PC). Paket ini berisi tipe dan arah pengiriman serta alamat
devais USB (dalam hal ini ECG USB). Selanjutnya devais akan mengirim paket berisi
data atau paket yang menyatakan tidak ada data yang dikirim. PC kemudian akan
mengirim paket handshake yang menyatakan apakah transfer sukses.
Agar data dapat ditransfer melalui antarmuka USB, maka mikrokontroler
perlu diatur agar beroperasi pada level 0-3.6 volt. Hal ini dapat dilakukan dengan cara
mengambil supply dari line VBus (5V) dan menurunkannya menjadi 3.6V menggunakan
dua dioda. Devais ini dapat terdeteksi dengan cara memasang resistor pull-up 1k5Ω
antara D- dan Vcc. Skema modul USB ini diperlihatkan pada Gambar 3-31.
Gambar 3-31. Rangkaian Modul USB [http://www.usb.org]
81
PERANCANGAN PERANGKAT LUNAK
Perancangan bagian perangkat lunak dari sistem instrumen EKG akan
dibahas pada bagian ini. Bagian perangkat lunak ini terdiri dari beberapa bagian:
1. Program pengendali selektor oleh AT90S2313
2. Program Konversi Analog ke Digital
3. Program akuisisi USB
4. Penampil sinyal EKG pada program plot-waveform Delphi
3.3.7. Program Pengendali Selektor
Program ini berfungsi mengontrol AT90S2313 agar mengeluarkan bit-bit
yang dibutuhkan sesuai Tabel 3.2. Port yang digunakan untuk mengeluarkan bit-bit
kendali adalah port B, yaitu:
1. Pengendali INH1 (PB4)
2. Pengendali INH2 (PB5)
3. Pengendali INH3 (PB6)
4. Pengendali INH4 (PB7)
5. Pengendali A (PB3)
6. dan Pengendali B (PB2)
Diagram alirnya seperti terlihat pada Gambar 3-32.
3.3.8. Program Konversi Analog ke Digital
Program assembler konversi analog ke digital ini berfungsi untuk:
1. Menghidupkan ADC
2. Memilih kanal ADC
3. Mengaktifkan UART
4. dan mengirim data
Diagram alir program ini terlihat pada Gambar 3-33.
82
3.3.9. Program Akuisisi USB
Program ini berfungsi untuk melakukan sinkronisasi dengan host
controller, mengambil data dari konverter analog ke digital, mengubah menjadi paket
data USB, mengirim paket data, serta menerima paket handshake dari host controller
bahwa data diterima dengan sukses atau tidak dan untuk menentukan action berikutnya.
Diagram alir dari program ini diperlihatkan pada Gambar 3-34.
3.3.10. Program Plot-waveform Delphi untuk Menampilkan Sinyal EKG
Program ini berfungsi sebagai penampil sinyal EKG yang telah diperkuat
dan difilter oleh sistem perangkat keras EKG. Lead yang ditampilkan adalah secara
otomatis oleh pengendali selektor.
Inti dari program adalah menerima data dari usb-port. Data tersebut
diubah ke format desimal dan ditampilkan dalam bentuk grafik. Diagram alir dari
program plot-waveform ini diperlihatkan pada Gambar 3-35. Layout tampilan dapat
dilihat pada Gambar 3-36 dan Gambar 3-37.
83
6WDUW
6HWPDFURWXQGD
$
$
,QLVLDOLVDVL7HVW
/HDGDYUDYODYI99
6HW3RUW%VHEDJDLNHOXDUDQ
.LULP7HVWNH3RUW%
3DQJJLOPDFURWXQGD
.LULP/HDGNH3RUW%
3DQJJLOPDFURWXQGD
.LULPDYUDYODYINH3RUW%
3DQJJLOPDFURWXQGD
.LULP99NH3RUW%
3DQJJLOPDFURWXQGD
Gambar 3-32. Flowchart program pengendali selektor
84
6WDUW
,QLVLDOLVDVL3RUW6WDFN8$57$'&
)ODJ$'&"
$PELOGDWDGDULUHJLVWHU$'&
VLPSDQGLUHJLVWHUXPXP
1
<
$
$
.LULPGDWDNH5HJLWHU8$57
3HQJLULPDQVHOHVDL"
3URVHVNRQYHUVLVHOHVDL"
(QG
1
<
<
1
$
%
%
Gambar 3-33. Flowchart program konversi analog ke digital
85
Gambar 3-34. Flowchart program akuisisi USB
86
Gambar 3-35. Flowchart program plot-waveform Delphi
87
Gambar 3-36. Layout tampilan saat ECG belum terpasang
Gambar 3-37. Layout tampilan program plot-waveform setelah
ECG beroperasi
88
BAB IV
HASIL DAN PEMBAHASAN
Perancangan suatu sistem instrumentasi akan lebih sistematis jika
dilakukan pengujian untuk tiap bagian yang membangun sistem tersebut sebelum
dilakukan pengujian keseluruhan. Pada bab ini akan dibahas terlebih dahulu pengujian
sistem, dilanjutkan dengan data-data pendukung dari setiap bagian, yaitu:
1. Selektor Analog dan Pengendalinya
2. Penguat Instrumentasi
3. High Pass Filter
4. Low Pass Filter
5. Filter Notch
6. Penguat Akhir dan Offset
7. Catu Daya
8. Modul Konversi
4.1. Pengujian Sistem
Pengujian sistem instrumentasi ECG ini terdiri dari dua tahap, yaitu:
1. Pengujian apakah devais dikenali pada Windows.
2. Pengujian apakah devais dapat memberikan menghasilkan Sinyal ECG standar
seperti yang telah dibahas pada dasar teori.
Gambar 4-1 sampai Gambar 4-7 memperlihatkan hasil pengujian devais ECG USB ini.
89
Gambar 4-1. PC mendeteksi adanya devais berbasis USB
Gambar 4-2. PC menentukan protokol komunikasi yang digunakan
Gambar 4-3. Pemilihan lokasi driver oleh user
90
Gambar 4-4. Proses pencarian driver ECG USB
Gambar 4-5. Instalasi driver ECG USB
Gambar 4-6. Proses instalasi driver berlangsung dengan sukses
91
Gambar 4-7. ECG USB telah dapat digunakan
Pengujian kedua dilakukan dengan menggunakan Simulator ECG pada Gambar 4-8.
Gambar 4-8. Simulator ECG
Pada pengujian sistem ini, sistem tidak dapat beroperasi karena devais ECG USB ini
tidak dikenali oleh PC (Windows cannot recognize this USB Devices). Oleh karena itu,
penulis berinisiatif untuk menguji apakah sistem dapat mengeluarkan satu sinyal ECG
saja terlebih dahulu. Seperti pada dasar teori, pengujian dilakukan terhadap sinyal standar
seperti Gambar 4-9.
92
Gambar 4-9. Sinyal EKG standar
Pada pengujian menggunakan simulator, diperoleh keluaran seperti Gambar 4-10.
Gambar 4-10. Pengujian satu sinyal EKG standar
93
Perbandingkan hasil yang diperoleh pada Gambar 4-10 dengan data standar pada Gambar
4-9, terlihat bahwa segmen QRS telah dapat diperoleh. Namun segmen sinyal EKG yang
lebih kecil, yaitu segmen P dan T tidak dapat diperoleh dengan baik. Hal ini dapat
disebabkan oleh noise yang masih besar karena grounding maupun shielding yang belum
sesuai dengan standar instrumentasi medis. Durasi setiap segmen dan besar amplitudo
sinyal yang diperoleh belum dapat ditentukan karena program yang dibuat baru terbatas
pada menampilkan bentuk gelombang.
4.2. Selektor Analog dan Pengendali
Selektor analog merupakan bagian yang berfungsi untuk memilih lead
yang akan ditampilkan. Untuk dapat menguji rangkaian selektor analog, terlebih dahulu
perlu dilakukan pengujian terhadap rangkaian pengendali selektor. Rangkaian pengendali
selektor yang dirancang adalah menggunakan AVR 2313, oleh karena itu pengujian yang
dilakukan bertujuan untuk memeriksa apakah mikrokontroler tersebut dapat
mengeluarkan level tegangan yang mampu men-drive selektor analog yang menggunakan
IC multiplexer CD4052. Spesifikasi yang diperlukan untuk men-drive CD4052 dapat
dilihat pada Tabel 2-3. Pengujian dilakukan pada PortB yang menjadi control multiplex.
Diperoleh data pada Tabel 4-1.
Tabel 4-1. Hasil Pengujian AT90S2313 sebagai control multiplex
Pengendali Level tinggi (Volt) Level rendah (Volt)
A (PB3) 4.64 0
B (PB2) 4.60 0
INH1 (PB4) 4.65 0
INH2 (PB5) 4.62 0
INH3 (PB6) 4.65 0
INH4 (PB7) 4.64 0
94
Pada rancangan selektor analog, digunakan VDD = +5V, VEE = -5V dan VSS = 0V. Pada
Tabel 2-3 terlihat bahwa untuk VDD = +5V, level rendah adalah maksimal 1,5V dan level
tinggi minimal 3.5V. Terlihat bahwa rangkaian pengendali yang menggunakan AVR
2313 ini dapat digunakan untuk mengendalikan control multiplex dengan supply arus
pada setiap jalur ± 0.10mA. Untuk menguji selektor analog, digunakan masukan dari
pengendali selektor. Hasil pengujian selektor analog dapat dilihat pada Tabel 4-2 berikut.
Tabel 4-2. Data Pengujian Selektor Analog
Konfigurasi B A INH(U11) INH(U12) INH(U13) INH(U14)
Test 0 0 - 1 1 1
Lead I 0 1 0 1 - 1
Lead II 1 0 - 1 1 1
Lead III 1 - 0 1 1 1
avR - 0 1 0 1 1
avL 0 1 1 0 1 1
avF 1 0 1 0 1 -
V1 1 0 1 0 1 1
V2 0 0 1 1 0 1
V3 0 1 1 - 0 1
V4 1 0 1 - 0 1
V5 1 1 1 1 0 0
V6 0 0 - 1 1 0
Keterangan: 1 = hasil pengukuran berada pada rentang 3.5V 5V
0 = hasil pengukuran berada pada rentang 0V 1.5V
- = hasil pengukuran tidak berada pada rentang (H) maupun (L)
Dari Tabel 4-2 terlihat bahwa diperoleh data pengukuran yang berbeda dengan Tabel 3-2,
yang mengakibatkan terjadinya perubahan pola switching. Perbandingan hasil pengujian
Tabel 4-2 dengan perancangan pada Tabel 3-2 dapat dilihat pada Tabel 4-3.
95
Tabel 4-3. Perbandingan Perancangan dan Hasil Pengujian Selektor Analog
Lead yang direkam Perancangan Hasil pengujian
Test 000111 00-111
Lead I 010111 0101-1
Lead II 100111 10-111
Lead III 110111 1-0111
avR 001011 -01011
avL 011011 011011
avF 101011 10101-
V1 111011 101011
V2 001101 001101
V3 011101 011-01
V4 101101 101-01
V5 111101 111100
V6 001110 00-110
Keterangan: urutan bit adalah B A INH1 INH2 INH3 INH4
Dari Tabel 4-3 terlihat bahwa pola switching yang sama hanya terjadi pada avL dan V2.
Sedangkan untuk perekaman lead lainnya, diperoleh konfigurasi bit yang berbeda dan
adanya kondisi idle. Oleh karena itu rangkaian ini belum dapat menyalurkan Lead-lead
sesuai Kaidah Wilson dan Einthoven, sehingga belum dapat digunakan sebagai rangkaian
selektor untuk instrumen EKG.
4.3. Penguat Instrumentasi
Pengujian Penguat Instrumentasi dilakukan dengan cara menguji
kestabilan CMRR pada rentang frekuensi sinyal ECG. Pengukuran CMRR dilakukan
dengan cara membandingkan penguatan common dengan penguatan maksimal.
Penguatan common adalah penguatan saat penguat instrumentasi diberi dua masukan
96
yang sama besar dan fasanya sedangkan penguatan maksimal merupakan penguatan pada
masukan 1mV. Dengan menggunakan catu daya ±12V penguatan maksimal adalah
120001
12
mV
V kali, karena nilai keluaran tidak dapat melebihi nilai tegangan sumber.
Untuk menentukan CMRR digunakan persamaan (4.1) berikut.
c
d
A
AdBCMRR log20)( (4.1)
dengan: Ad = penguatan diferensial = d
ldiferensiao
V
V )(
Ac = penguatan common = c
commono
V
V )(
Dari pengukuran, didapat data Tabel 4-4 berikut.
Tabel 4-4. Data Pengukuran CMRR INA114
Frekuensi (Hz) Vc (V) Vo(common) (V) CMRR (dB)
10 1 0.220 94.735
20 1 0.130 99.305
30 1 0.125 99.645
40 1 0.110 100.755
50 1 0.106 101.078
60 1 0.092 102.307
70 1 0.086 102.894
80 1 0.078 103.742
90 1 0.070 104.681
100 1 0.064 105.460
110 1 0.055 106.776
120 1 0.052 107.264
130 1 0.044 108.714
140 1 0.036 110.458
150 1 0.033 111.213
97
Dari Tabel 4-4, diperoleh grafik CMRR terhadap frekuensi pada Gambar 4-11.
101
102
0
20
40
60
80
100
120Grafik CMRR INA114 terhadap frekuensi
Frekuensi (Hz)
CM
RR
(dB
)
1020 30 40 50 60
150
Gambar 4-11. Grafik CMRR INA114 terhadap frekuensi
Dari grafik diatas, terlihat bahwa CMRR cukup stabil berada diatas
100dB, kecuali untuk frekuensi-frekuensi yang rendah, terutama pada 10Hz yang nilainya
hanya mencapai 94.735dB. Namun secara umum INA114 ini dapat mencapai nilai
CMRR yang dibutuhkan oleh instrumen standar ECG seperti spesifikasi pada Tabel 3-1,
yaitu ≥ 100dB.
4.4. High Pass Filter
Pengujian high pass filter dilakukan dengan menggunakan masukan dari
generator fungsi, osiloskop, dan sumber tegangan ±12V. Masukan berupa sinyal dengan
amplitude 1 Volt dan frekuensi pada range frekuensi sinyal ECG, khususnya di sekitar
frekuensi cutoff, fC = 0.5Hz. Hasil pengujian HPF dengan metode Unity Gain
diperlihatkan pada Tabel 4-5.
98
Tabel 4-5. Pengujian HPF dengan Metode Unity Gain
Frekuensi (Hz) Vin Vout Atenuasi (dB)
0.3 1 0.30 -10.458
0.4 1 0.55 -5.193
0.5 1 0.67 -3.478
0.7 1 0.87 -1.209
0.9 1 0.98 -0.175
1 1 1 0
2 1 1 0
5 1 1 0
10 1 1 0
150 1 1 0
Dari Tabel 4-5 diperoleh grafik atenuasi terhadap frekuensi pada Gammbar 4-12.
100
101
102
-12
-10
-8
-6
-4
-2
0
2
4
Frekuensi (Hz)
Ate
nuas
i (dB
)
Grafik Atenuasi HPF Unity Gain terhadap frekuensi
Gambar 4-12. Grafik Atenuasi HPF Unity Gain terhadap frekuensi
99
Terlihat dari grafik bahwa metode ini dapat mencapai frekuensi cutoff fC = 0.5Hz. Pada
frekuensi fC = 0.5Hz diperoleh redaman -3.4dB. Metode Unity Gain ini mampu mencapai
redaman yang baik karena HPF yang diterapkan dengan metode ini menggunakan orde-4.
HPF dengan metode Unity Gain orde-4 ini dapat digunakan untuk instrumen EKG.
4.5. Low Pass Filter
Pada tapis pelewat rendah ini, pengujian hanya akan dilakukan untuk
rancangan dengan metode Multi-purpose State Variable. Pengujian terhadap metode-
metode lainnya tidak dilakukan karena beberapa hal berikut:
1. Dari hasil simulasi, terlihat bahwa metode lain belum mampu memberikan hasil
yang baik, walaupun dengan menggunakan komponen bernilai ideal.
2. Kompleksitas rangkaian hasil metode lain akan menyebabkan komponen yang
digunakan semakin banyak dan % toleransi akan semakin besar. Hal ini akan
menyebabkan frekuensi cutoff akan semakin bergeser. Dengan State Variable,
rangkaian akan lebih sederhana dan dapat diatur bandwidth-nya.
Seperti pada high pass filter, pengujian dilakukan dengan menggunakan
masukan dari generator fungsi, osiloskop, dan sumber tegangan ±12V. Masukan berupa
sinyal dengan amplitude 1V dan frekuensi pada range frekuensi sinyal ECG, khususnya
di sekitar frekuensi cutoff, fC = 150Hz. Hasil pengujian LPF dengan metode Multi-
purpose State Variable diperlihatkan pada Tabel 4-6.
100
Tabel 4-6. Pengujian LPF dengan UAF42
Frekuensi (Hz) Vin Vout Atenuasi (dB)
10 1 1 0
20 1 1 0
30 1 1 0
50 1 1 0
80 1 1 0
100 1 1 0
110 1 0.95 -0.445
120 1 0.90 -0.915
130 1 0.86 -1.310
140 1 0.78 -2.158
145 1 0.65 -3.741
150 1 0..58 -4.731
155 1 0.45 -6.934
160 1 0.33 -9.629
200 1 0.05 -26.020
Gambar 4-13 merupakan grafik redaman terhadap frekuensi dari hasil Tabel 4-6.
101
102
-30
-25
-20
-15
-10
-5
0
5
Frekuensi (Hz)
Ate
nuas
i (dB
)
Grafik Atenuasi LPF menggunakan UAF42
Gambar 4-13. Grafik Atenuasi LPF metode State Variable dengan UAF42
101
Terlihat bahwa penggunaan UAF42 dengan metode State Variable ini dapat
menghasilkan redaman -4.7dB pada frekuensi cutoff 150Hz, sehingga dapat digunakan
pada instrumen EKG ini.
4.6. Filter Notch
Hasil pengukuran filter notch dengan metode Multi-purpose State
Variable diperlihatkan pada Tabel 4-7.
Tabel 4-7. Data pengujian filter notch metode State Variable
Frekuensi (Hz) Vin Vout Atenuasi (dB)
10 1 1 0
20 1 1 0
30 1 0.95 -0.445
40 1 0.80 -1.938
50 1 0.02 -33.979
55 1 0.64 -3.876
60 1 0.88 -1.110
70 1 0.95 -0.455
80 1 0.95 -0.455
90 1 0.99 -0.087
100 1 0.99 -0.087
1000 1 1 0
102
101
102
103
-40
-35
-30
-25
-20
-15
-10
-5
0
5
Frekuensi (Hz)
Ate
nuas
i (dB
)
Grafik Atenuasi Filter Notch menggunakan UAF42
Gambar 4-14. Grafik Atenuasi Filter Notch menggunakan UAF42
Grafik atenuasi yang dihasilkan dari pengukuran metode State Variable adalah seperti
Gambar 4-14. Terlihat bahwa UAF42 mampu mencapai redaman -33dB pada frekuensi
50Hz. UAF42 juga mampu menghasilkan bandwidth yang diinginkan yaitu rentang -3dB
antara 44Hz sampai dengan 56Hz datar. Oleh karena itu filter notch dengan
menggunakan UAF42 ini dapat memenuhi kebutuhan instrumen ECG.
4.7. Penguat Akhir dan Offset
Pengujian rangkaian ini dilakukan dengan cara menguji besar penguatan
yang dicapai untuk keluaran bagian filter, offset, dan penguatan inverter. Sinyal keluaran
dari filter berada pada range 10mV. Agar dapat diakuisisi dengan baik, pengkondisi
sinyal ini akan mengubahnya dengan penguatan ± 200 kali. Hasil pengukuran penguat
sinyal pada range frekuensi ECG menggunakan OPA2227 diperlihatkan pada Tabel 4-8.
103
Tabel 4-8. Pengukuran penguat akhir sinyal dengan OPA2227
Frekuensi (Hz) Vin (mV) Vout (V) Asinyal
10 50 8.5 170
30 50 8.5 170
40 50 8.4 168
60 50 8.6 172
90 50 8.9 178
100 50 8.8 176
120 50 8.6 172
130 50 8.8 176
150 50 8.7 174
Grafik penguatan yang dicapai penguat sinyal ini diperlihatkan pada Gambar 4-15.
. 10
110
20
20
40
60
80
100
120
140
160
180
Frekuensi (Hz)
Pen
guat
an
Grafik penguat akhir sinyal OPA2227
Gambar 4-15. Grafik penguat sinyal dengan OPA2227
Penguatan sinyal yang dicapai dengan OPA2227 ini mampu mengubah sinyal keluaran
filter dari 10mV agar berada pada range ±1.8V.
104
Offset mengambil masukan dari catu daya +12V. Hasil pengukuran
keluaran rangkaian offset ini menggunakan OPA227 adalah seperti Tabel 4-9.
Tabel 4-9. Pengukuran offset dengan OPA2227
Vin (V) Vout (V) Asinyal
12 2.7 0.225
12 2.8 0.233
12 2.8 0.233
12 2.7 0.225
12 2.9 0.241
Nilai perancangan yaitu
M
k
7.1
390 = 0.229 kali tidak tepat dicapai, namun rangkaian ini
telah dapat menggeser offset dari 0V ke 2.7V.
Tabel 4-10 adalah hasil pengukuran op-amp kedua dari OPA2227 yang
menjadi penguat inverter.
Tabel 4-10. Pengukuran inverter OPA2227
Vin (V) Vout (V) Asinyal
5 -4.9 -0.98
5 -5 -1
5 -4.9 -0.98
5 -4.9 -0.98
5 -5.1 -1.02
105
4.8. Catu Daya
Tabel 4-11 memperlihatkan hasil pengukuran keluaran catu daya.
Tabel 4-11. Pengukuran keluaran catu daya
Tegangan rancangan Tegangan keluaran +5V +5V -5V -5V
+12V +11.86V -12V -11.63V
Hasil keluaran catu daya -5V dan +5V ternyata dapat diperoleh dengan
tepat karena merupakan keluaran dari regulator LM7905 dan LM7805. Sedangkan untuk
-12V dan +12 V, keluaran diperoleh dari MC4063 yang merupakan konverter DC-DC
yang mengubah masukan +5V dari jalur power USB. Perubahan nilai ini dapat
disebabkan karena nilai resistor yang tidak tepat, karena pada implementasi tidak dapat
digunakan resistor bernilai 950Ω maupun 19.5kΩ.
Agar dapat men-supply instrumen ECG dengan baik, maka catu daya ini
harus stabil. Kestabilan catu daya ini dapat dilakukan dengan menguji kemampuan catu
daya ini untuk men-supply arus yang stabil. Hasil pengukuran arus diperlihatkan pada
Tabel 4-12 berikut.
Tabel 4-12. Pengukuran kestabilan arus
Tegangan rancangan Tegangan keluaran +5V 0.12mA -5V 0.10mA
+12V 0.11mA -12V 0.11mA
Catu daya ini dapat memberikan arus yang stabil karena bersumber dari line power USB
yang dikendalikan oleh chip USB pada motherboard. Pengendalian oleh chip USB dan
Windows Management ini sekaligus dapat mencegah terjadi kebocoran arus yang dapat
merusak alat.
106
4.9. Modul Konversi
Pengujian modul konversi ini dilakukan dengan memberi masukan dari
potensio dan melihat keluaran pada program plotter di PC. Hal ini dikarenakan kita tidak
dapat menguji hardware konverter ini tanpa program di PC dan sebaliknya kita tidak
dapat menguji software tanpa masukan dari hardware ke port I/O dari PC. Pengujian
dilakukan dengan cara menghubungkan potensio ke power +5V, GND, dan pin input
ADC. Gambar 4-16 memperlihatkan respon modul konversi saat nilai potensio tidak
berubah. Dengan mengubah-ubah nilai potensio, diperoleh Gambar 4-17.
Gambar 4-16. Respon Modul Koversi saat nilai potensio tidah berubah
Gambar 4-17. Respon Modul Koversi terhadap perubahan masukan
107
BAB V
KESIMPULAN DAN SARAN
5.1. Kesimpulan
Perancangan dan implementasi instrumen EKG selama pengerjaan tugas
akhir ini telah diuji menggunakan Simulator EKG. Selama proses pengerjaan tugas akhir
ini dan berdasarkan analisa hasil-hasil percobaan dari serangkaian pengujian, dapat
diambil kesimpulan-kesimpulan sebagai berikut:
1. Sistem instrumentasi EKG yang dibuat belum mampu menampilkan 12-lead EKG
standar. Hal ini disebabkan oleh rangkaian selektor yang belum berfungsi dengan
benar.
2. Instrumen EKG berbasis PC ini baru dapat menampilkan satu sinyal standar EKG.
3. Pada satu sinyal EKG yang diujikan, terlihat bahwa instrumen ini baru dapat
menangkap segmen QRS dari sinyal EKG, sedangkan untuk komponen sinyal
yang kecil, yaitu segmen P dan T, masih belum dapat ditangkap dengan baik.
4. Dari pengukuran satu sinyal, telah terlihat adanya sinyal periodik yang
menunjukkan adanya heart beat.
5.2. Saran
Berdasarkan hasil-hasil selama perancangan dan implementasi, untuk
dapat mengasilkan instrumen EKG yang lebih baik perlu diperhatikan hal-hal berikut:
1. Perancangan dan pembuatan instrumen EKG akan lebih baik jika menggunakan
sistem modul sehingga memudahkan untuk pencarian error dan fleksibilitas
pengembangan.
2. Sebagai suatu sistem instrumentasi, perancangan per blok harus memperhatikan
matching-impedance.
108
3. Dalam perancangan instrumen EKG, faktor noise, grounding, dan shielding harus
diperhatikan dengan baik.
4. Untuk dapat menangkap sinyal EKG yang sangat kecil dengan baik, perlu suatu
rangkaian khusus yang bersifat sebagai buffer.
5. Pada penyempurnaan alat ini, perlu adanya penambahan rangkaian proteksi untuk
keamanan pasien.
6. Pengkondisi sinyal akan memberikan hasil yang lebih baik jika dirancang secara
bertingkat, baik pada penguat maupun filter.
7. Suatu filter digital dapat ditambahkan pada mikrokontroler maupun program
aplikasi di PC sehingga dapat memberikan hasil yang lebih baik.
8. Pada post processing, dapat dilakukan pengembangan dengan penambahan
program yang bersifat sebagai ECG Pattern Recognition serta pengembangan
suatu sistem Database untuk menyimpan dan mengolah data EKG dari pasien.
109
DAFTAR PUSTAKA
1. - , Cardiofax: Service Manual, Nihon Kohden.
2. ANSI/ AAMI EC11-1991, Diagnostic Electrocardiograph Devices, Approved by
October 24th, 1991.
3. Aston, Richard, Principles of Biomedical Instrumentation and Measurement,
Maxwel McMillan Canada, Inc., 1990.
4. Ott, Hendry W., Noise Reduction Technique in Electronic System, 2nd edition,
John Willey & Sons, Inc., New York.
5. Webster, John G., Medical Instrumentation: Application and Design, Houghton
Mifflin Company, Boston, 1978.
6. AVR STK500 User Guide.
7. Kadir, Abdul, Dasar Pemograman Delphi 5.0, Andi, 2001.
8. Cameron, John and James G. Skofronick, Medical Physics, John Willey & Sons,
New York, 1978.
9. Peacock, Craig, Interfacing using Delphi; 2000.
10. http://www.usb.org dan http://www.beyondlogic.org
110
LAMPIRAN
A. Grafik dan Tabel Butterworth
B. Skema Perangkat keras
C. Program Pengendali Selektor
D. Program Konversi Analog ke Digital
E. Program USB
F. Program Plotter Delphi
G. Datasheet INA114
H. Datasheet UAF42
I. Datasheet AT90S2313
J. Datasheet CD4052
K. Dokumentasi
111
112
; Program untuk pengendalian multiplexer 4052
; oleh: Johan Arief
.nolist ;list file untuk include file tidak perlu ditampilkan
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\2313def.inc"
.list
.def keluaran=r16
.def test= r17
.def lead1= r18
.def lead2= r19
.def lead3= r20
.def avr= r21
.def avl= r22
.def avf= r23
.def v1= r24
.def v2= r25
.def v3= r26
.def v4= r27
.def v5= r28
.def v6= r29
.def ledon= r30
.def ledoff= r31
.macro tunda
count32:
inc r1
brne count32
113
inc r2
brne count32
inc r3
brne count32
inc r4
.endmacro
.cseg
.org 0
ldi keluaran,0b11111111
out DDRB,keluaran
out DDRD,keluaran
mulai:
ldi test, 0b10001100
ldi lead1, 0b10011100
ldi lead2, 0b10101100
ldi lead3, 0b10111100
ldi avr, 0b01001100
ldi avl, 0b01011100
ldi avf, 0b01101100
ldi v1, 0b01111100
ldi v2, 0b11001000
ldi v3, 0b11011000
ldi v4, 0b11101000
ldi v5, 0b11111000
ldi v6, 0b11000100
114
ldi ledon, 0b00001000
ldi ledoff,0b00000000
count:
out portb,test
out portd,ledon
tunda
tunda
tunda
out portb,lead1
out portd,ledoff
tunda
tunda
tunda
out portb,lead2
out portd,ledon
tunda
tunda
tunda
out portb,lead3
out portd,ledoff
tunda
tunda
tunda
out portb,avr
out portd,ledon
tunda
tunda
tunda
out portb,avl
115
out portd,ledoff
tunda
tunda
tunda
out portb,avf
out portd,ledon
tunda
tunda
tunda
out portb,v1
out portd,ledoff
tunda
tunda
tunda
out portb,v2
out portd,ledon
tunda
tunda
tunda
out portb,v3
out portd,ledoff
tunda
tunda
tunda
out portb,v4
out portd,ledon
tunda
tunda
tunda
out portb,v5
out portd,ledoff
116
tunda
tunda
tunda
out portb,v6
out portd,ledon
tunda
tunda
tunda
rjmp count
.exit
117
; ; Program AVR2313 Analog Input ; oleh: Johan Arief ; rjmp Mulai reti reti reti reti reti rjmp Input reti reti reti reti Mulai: ldi r24,#31 out WDTCR,r24 ldi r24,#23 out WDTCR,r24 ldi r24,#223 out SPL,r24 ldi r28,#192 ldi r30,#184 mov r4,r30 clr r29 mov r5,r29 ldi r30,#126 ldi r31,#0 ldi r26,#96 ldi r27,#0 clr r24 Lop_1 : st x+,r24 sbiw r30,#1 brne Lop_1 ldi r24,#12 out UBRR,r24 ldi r24,#24 out UCR,r24 clr r6 ldi r24,#252 out DDRB,r24 cbi PORTB,0 cbi PORTB,1 ldi r24,#191
118
out DDRD,r24 ser r24 out PORTD,r24 cbi ACSR,7 ldi r24,#4 out TCCR0,r24 ldi r24,#0 out TCCR1A,r24 ldi r24,#2 out TCCR1B,r24 ldi r24,#31 out WDTCR,r24 ldi r24,#23 out WDTCR,r24 sei in r24,TIMSK ori r24,#$2 out TIMSK,r24 in r24,TIMSK ori r24,#$80 out TIMSK,r24 ldi r24,#0 out TCNT0,r24 ldi r24,#0 ldi r25,#0 out TCNT1H,r25 out TCNT1L,r24 ldi r24,#4 out TCCR0,r24 ldi r24,#2 out TCCR1B,r24 Main: ldi r26,#168 ldi r27,#0 ldi r30,#100 ldi r31,#0 rcall Kirim_Data ldi r24,#10 ldi r25,#0 rcall Tunggums rjmp Main cli Selesai: rjmp Selesai Kirim_Data: rcall Kirim_1
119
rcall Kirim_2 rcall Kirim_0D_0A Input: push r0 push r1 push r2 push r3 push r4 push r5 push r7 push r8 push r9 push r10 push r11 push r16 push r17 push r18 push r19 push r20 push r21 push r22 push r23 push r24 push r25 push r26 push r27 push r28 push r29 push r30 push r31 in r24,SREG push r24 in r24,UCR andi r24,#$1F out UCR,r24 ldi r24,#100 out TCNT0,r24 sbi DDRB,0 sbi PORTB,0 push r30 push r31 ldi r30,#84 ldi r31,#2 rcall Tunggu_us pop r31
120
pop r30 cbi DDRB,0 cbi PORTB,0 ldi r24,#0 ldi r25,#0 out TCNT1H,r25 out TCNT1L,r24 TungguBit: ldi r26,#40 ld r24,x bst r24,5 brts TungguBit ldi r26,#76 ld r24,x+ ld r25,x ldi r26,#102 st x+,r24 st x,r25 ldi r26,#102 ld r16,x+ ld r17,x cpi r16,#52 ldi r21,#13 cpc r17,r21 brlo Input_satu breq Input_satu rjmp Input_dua Input_satu: rjmp Dc_tiga Input_dua: ldi r24,#52 ldi r25,#13 ldi r26,#102 st x+,r24 st x,r25 Input_tiga: ldi r16,#52 ldi r17,#13 ldi r26,#102 ld r20,x+ ld r21,x sub r16,r20 sbc r17,r21 ldi r26,#100 st x+,r16 st x,r17
121
wdr in r24,UCR ori r24,#$E0 out UCR,r24 pop r24 out SREG,r24 pop r31 pop r30 pop r29 pop r28 pop r27 pop r26 pop r25 pop r24 pop r23 pop r22 pop r21 pop r20 pop r19 pop r18 pop r17 pop r16 pop r11 pop r10 pop r9 pop r8 pop r7 pop r5 pop r4 pop r3 pop r2 pop r1 pop r0 reti Kirim_2: ldi r26,#168 ldi r27,#0 Lop_Kirim1: ld r24,x+ tst r24 breq End_Kirim2 rcall RS232_Out rjmp Lop_Kirim1 End_Kirim2: ret Kirim_0D_0A: ldi r24,#13 rcall RS232_Out
122
ldi r24,#10 RS232_Out: sbis USR,5 rjmp RS232_Out out UDR,r24 ret Tunggu_rs: sbiw r30,#1 brne Tunggu_rs ret set bld r6,2 ret clt bld r6,2 ret Tunggums: push r30 push r31 clr r30 or r30,r24 or r30,r25 breq Ulang_ms_3 Ulang_ms_1: ldi r30,#184 ldi r31,#11 Ulang_ms_2: sbiw r30,#1 brne Ulang_ms_2 sbiw r24,#1 brne Ulang_ms_1 Ulang_ms_3: pop r31 pop r30 ret Sub_2: lsl r16 rol r17 rol r18 rol r19 ret Kirim_Com: com r16 com r17 com r18 com r19
123
subi r16,#255 sbci r17,#255 sbci r18,#255 sbci r19,#255 ret Kirim_1: ld r16,z+ ld r17,z rjmp Kirim1_1 ld r16,z+ ld r17,z+ ld r18,z+ ld r19,z rjmp Kirim1_2 ld r16,z+ ld r17,z sbrs r17,7 rjmp Kirim1_1 ser r19 ser r18 rjmp Kirim1_2 ld r16,z clr r17 Kirim1_1: clr r18 clr r19 Kirim1_2: sbrs r19,7 rjmp Kirim1_3 rcall Kirim_Com ldi r24,#45 st x+,r24 Kirim1_3: push r28 push r29 push r12 push r13 push r14 clr r10 clr r11 clr r12 clr r13 clr r14 ldi r20,#32 Kirim1_4: ldi r28,#10 clr r29 ldi r21,#5 Kirim1_5: ldi r25,#51 ld r24,y
124
add r24,r25 sbrc r24,7 andi r25,#$F sbrc r24,3 andi r25,#$F0 sub r24,r25 st y+,r24 dec r21 brne Kirim1_5 rcall Sub_2 rol r10 rol r11 rol r12 rol r13 rol r14 dec r20 brne Kirim1_4 clt ldi r30,#15 clr r31 Kirim1_6: ld r24,-z rcall Sub_1 cpi r30,#11 brsh Kirim1_6 brts Kirim1_7 set mov r24,r10 rcall Sub_1_1 Kirim1_7: clr r24 st x+,r24 pop r14 pop r13 pop r12 pop r29 pop r28 ret Sub_1: mov r25,r24 swap r24 rcall Sub_1_1 mov r24,r25 Sub_1_1: andi r24,#$F subi r24,#208 brts Sub_1_3 cpi r24,#48 brne Sub_1_2
125
ret Sub_1_2: set Sub_1_3: st x+,r24 ret
126
;*************************************************************************** ;* Program Untuk USB ECG :"USBECG.asm" ;* Program ini berfungsi sebagai USB ECG protocol ;* Menggunakan :AT90S2313 ;* ;*************************************************************************** .include "2313.inc" .equ E2END =127 .equ inputport =PINB .equ USBdirection =DDRB .equ DATAplus =1 .equ DATAminus =0 .equ USBpinmask =0b11111100 .equ USBpinmaskDplus =~(1<<DATAplus) .equ USBpinmaskDminus =~(1<<DATAminus) .equ TSOPPort =PINB .equ TSOPpullupPort =PORTB .equ TSOPPin =2 .equ SOPbyte =0b10000000 .equ DATA0PID =0b11000011 .equ DATA1PID =0b01001011 .equ OUTPID =0b11100001 .equ INPID =0b01101001 .equ SOFPID =0b10100101 .equ SETUPPID =0b00101101 .equ ACKPID =0b11010010 .equ NAKPID =0b01011010 .equ STALLPID =0b00011110 .equ PREPID =0b00111100 .equ nSOPbyte =0b00000001 .equ nDATA0PID =0b11000011 .equ nDATA1PID =0b11010010 .equ nOUTPID =0b10000111 .equ nINPID =0b10010110 .equ nSOFPID =0b10100101 .equ nSETUPPID =0b10110100 .equ nACKPID =0b01001011 .equ nNAKPID =0b01011010 .equ nSTALLPID =0b01111000
127
.equ nPREPID =0b00111100 .equ nNRZITokenPID =~0b10000000 .equ nNRZISOPbyte =~0b10101011 .equ nNRZIDATA0PID =~0b11010111 .equ nNRZIDATA1PID =~0b11001001 .equ nNRZIOUTPID =~0b10101111 .equ nNRZIINPID =~0b10110001 .equ nNRZISOFPID =~0b10010011 .equ nNRZISETUPPID =~0b10001101 .equ nNRZIACKPID =~0b00100111 .equ nNRZINAKPID =~0b00111001 .equ nNRZISTALLPID =~0b00000111 .equ nNRZIPREPID =~0b01111101 .equ nNRZIADDR0 =~0b01010101 .equ BaseState =0 ; .equ SetupState =1 ; .equ InState =2 ; .equ OutState =3 ; .equ SOFState =4 ; .equ DataState =5 ; .equ AddressChangeState =6 ; .equ DoNone =0 .equ DoReceiveOutData =1 .equ DoReceiveSetupData =2 .equ DoPrepareOutContinuousBuffer =3 .equ DoReadySendAnswer =4 .equ CRC5poly =0b00101 .equ CRC5zvysok =0b01100 .equ CRC16poly =0b1000000000000101 .equ CRC16zvysok =0b1000000000001101 .equ MAXUSBBYTES =14 .equ MAXRS232LENGTH =36 .equ NumberOfFirstBits =10 .equ NoFirstBitsTimerOffset =256-12800*12/1024 .equ InitBaudRate =12000000/16/57600-1 .equ InputBufferBegin =RAMEND-127 .equ InputShiftBufferBegin =InputBufferBegin+MAXUSBBYTES
128
.equ RS232BufferBegin =InputShiftBufferBegin+MAXUSBBYTES .equ MyInAddressSRAM =RS232BufferBegin+MAXRS232LENGTH+1 .equ MyOutAddressSRAM =MyInAddressSRAM+1 .equ OutputBufferBegin =RAMEND-MAXUSBBYTES-2 .equ AckBufferBegin =OutputBufferBegin-3 .equ NakBufferBegin =AckBufferBegin-3 .equ StackBegin =NakBufferBegin-1 .def ConfigByte =R1 .def backupbitcount =R2 .def RAMread =R3 .def backupSREGTimer =R4 .def backupSREG =R5 .def ACC =R6 .def lastBitstufNumber =R7 .def OutBitStuffNumber =R8 .def BitStuffInOut =R9 .def TotalBytesToSend =R10 .def TransmitPart =R11 .def InputBufferLength =R12 .def OutputBufferLength =R13 .def MyOutAddress =R14 .def MyInAddress =R15 .def ActionFlag =R16 .def temp3 =R17 .def temp2 =R18 .def temp1 =R19 .def temp0 =R20 .def bitcount =R21 .def ByteCount =R22 .def inputbuf =R23 .def shiftbuf =R24 .def State =R25 .def RS232BufptrX =R26 .def RS232BufferFull =R27 .def USBBufptrY =R28 .def ROMBufptrZ =R30 .equ GET_STATUS =0 .equ CLEAR_FEATURE =1 .equ SET_FEATURE =3
129
.equ SET_ADDRESS =5
.equ GET_DESCRIPTOR =6
.equ SET_DESCRIPTOR =7
.equ GET_CONFIGURATION =8
.equ SET_CONFIGURATION =9
.equ GET_INTERFACE =10
.equ SET_INTERFACE =11
.equ SYNCH_FRAME =12 .equ DEVICE =1 .equ CONFIGURATION =2 .equ STRING =3 .equ INTERFACE =4 .equ ENDPOINT =5 .equ USER_FNC_NUMBER =100 ;------------------------------------------------------------------------------------------ ;******************************************************************** ;* Interupsi ;******************************************************************** .cseg ;------------------------------------------------------------------------------------------ .org 0 rjmp reset ;------------------------------------------------------------------------------------------ .org INT0addr rjmp INT0handler ;------------------------------------------------------------------------------------------ .org URXCaddr push temp0 in temp0,UDR sei in backupSREGTimer,SREG cbi UCSRB,RXCIE cpi RS232BufferFull,MAXRS232LENGTH-4 brcc NoIncRS232BufferFull push RS232BufptrX lds RS232BufptrX,RS232BufferBegin+2 st X+,temp0 cpi RS232BufptrX,RS232BufferBegin+MAXRS232LENGTH+1 brne NoUARTBufferOverflow ldi RS232BufptrX,RS232BufferBegin+4 NoUARTBufferOverflow: sts RS232BufferBegin+2,RS232BufptrX
130
inc RS232BufferFull pop RS232BufptrX NoIncRS232BufferFull: pop temp0 out SREG,backupSREGTimer cli sbi UCSRB,RXCIE reti ;------------------------------------------------------------------------------------------ ;******************************************************************** ;* Inisialisasi ;******************************************************************** ;------------------------------------------------------------------------------------------ reset: ldi temp0,StackBegin out SPL,temp0 clr XH clr YH clr ZH sts RS232BufferBegin+0,YH ldi temp0,RS232BufferBegin+4 sts RS232BufferBegin+1,temp0 sts RS232BufferBegin+2,temp0 clr RS232BufferFull rcall InitACKBufffer rcall InitNAKBufffer rcall USBReset sbi TSOPpullupPort,TSOPpin ldi temp0,(1<<LEDlsb0)+(1<<LEDlsb1)+(1<<LEDlsb2) out LEDPortLSB,temp0 ldi temp0,(1<<LEDmsb3)+(1<<LEDmsb4)+(1<<LEDmsb5)+(1<<LEDmsb6)+(1<<LEDmsb7) out LEDPortMSB,temp0 sbi PORTD,0 ldi temp0,InitBaudRate out UBRRL,temp0
131
sbi UCSRB,TXEN sbi UCSRB,RXEN sbi UCSRB,RXCIE ldi temp0,0x0F out MCUCR,temp0 ldi temp0,1<<INT0 out GIMSK,temp0 ;------------------------------------------------------------------------------------------ ;******************************************************************** ;* Main ;******************************************************************** sei Main: sbis inputport,DATAminus rjmp CheckUSBReset cpi ActionFlag,DoReceiveSetupData breq ProcReceiveSetupData cpi ActionFlag,DoPrepareOutContinuousBuffer breq ProcPrepareOutContinuousBuffer rjmp Main CheckUSBReset: ldi temp0,255 WaitForUSBReset: sbic inputport,DATAminus rjmp Main dec temp0 brne WaitForUSBReset rcall USBReset rjmp Main ProcPrepareOutContinuousBuffer: rcall PrepareOutContinuousBuffer ldi ActionFlag,DoReadySendAnswer rjmp Main ProcReceiveSetupData: ldi USBBufptrY,InputBufferBegin mov ByteCount,InputBufferLength rcall DecodeNRZI rcall MirrorInBufferBytes rcall BitStuff ;rcall CheckCRCIn rcall PrepareUSBOutAnswer
132
ldi ActionFlag,DoReadySendAnswer rjmp Main ;------------------------------------------------------------------------------------------ ;******************************************************************** ;* Interrupt handler ;******************************************************************** INT0Handler: in backupSREG,SREG push temp0 push temp1 ldi temp0,3 ldi temp1,2 ;waiting for begin packet CheckchangeMinus: sbis inputport,DATAminus rjmp CheckchangeMinus CheckchangePlus: sbis inputport,DATAplus rjmp CheckchangePlus DetectSOPEnd: sbis inputport,DATAplus rjmp Increment0 Increment1: ldi temp0,3 dec temp1 nop breq USBBeginPacket rjmp DetectSOPEnd Increment0: ldi temp1,2 dec temp0 nop brne DetectSOPEnd rjmp EndInt0HandlerPOP2 EndInt0Handler: pop ACC pop RS232BufptrX pop temp3 pop temp2 EndInt0HandlerPOP: pop USBBufptrY pop ByteCount mov bitcount,backupbitcount EndInt0HandlerPOP2:
133
pop temp1 pop temp0 out SREG,backupSREG ldi shiftbuf,1<<INTF0 out GIFR,shiftbuf reti USBBeginPacket: mov backupbitcount,bitcount in shiftbuf,inputport USBloopBegin: push ByteCount push USBBufptrY ldi bitcount,6 ldi ByteCount,MAXUSBBYTES ldi USBBufptrY,InputShiftBufferBegin USBloop1_6: in inputbuf,inputport cbr inputbuf,USBpinmask breq USBloopEnd ror inputbuf rol shiftbuf dec bitcount brne USBloop1_6 nop USBloop7: in inputbuf,inputport cbr inputbuf,USBpinmask breq USBloopEnd ror inputbuf rol shiftbuf ldi bitcount,7 st Y+,shiftbuf USBloop0: in shiftbuf,inputport cbr shiftbuf,USBpinmask breq USBloopEnd dec bitcount nop dec ByteCount brne USBloop1_6 rjmp EndInt0HandlerPOP USBloopEnd: cpi USBBufptrY,InputShiftBufferBegin+3
134
brcs EndInt0HandlerPOP ;then finish lds temp0,InputShiftBufferBegin+0 lds temp1,InputShiftBufferBegin+1 brne TestDataPacket TestIOPacket: ; cp temp1,MyAddress ; brne TestDataPacket TestSetupPacket:;test to SETUP packet cpi temp0,nNRZISETUPPID brne TestOutPacket cp temp1,MyInAddress brne TestDataPacket ldi State,SetupState rjmp EndInt0HandlerPOP TestOutPacket: ;test for OUT packet cpi temp0,nNRZIOUTPID brne TestInPacket cp temp1,MyOutAddress brne TestDataPacket ldi State,OutState rjmp EndInt0HandlerPOP TestInPacket: ;test on IN packet cpi temp0,nNRZIINPID brne TestDataPacket cp temp1,MyInAddress breq AnswerToInRequest TestDataPacket: cpi temp0,nNRZIDATA0PID breq Data0Packet cpi temp0,nNRZIDATA1PID brne NoMyPacked Data0Packet: cpi State,SetupState breq ReceiveSetupData cpi State,OutState breq ReceiveOutData NoMyPacked: ldi State,BaseState rjmp EndInt0HandlerPOP AnswerToInRequest: push temp2 push temp3 push RS232BufptrX push ACC cpi ActionFlag,DoReadySendAnswer
135
brne NoReadySend rcall SendPreparedUSBAnswer cpi State,AddressChangeState breq SetMyNewUSBAddress ldi State,InState ldi ActionFlag,DoPrepareOutContinuousBuffer rjmp EndInt0Handler ReceiveSetupData: push temp2 push temp3 push RS232BufptrX push ACC rcall SendACK rcall FinishReceiving ldi ActionFlag,DoReceiveSetupData rjmp EndInt0Handler ReceiveOutData: push temp2 push temp3 push RS232BufptrX push ACC cpi ActionFlag,DoReceiveSetupData breq NoReadySend rcall SendACK clr ActionFlag rjmp EndInt0Handler NoReadySend: rcall SendNAK rjmp EndInt0Handler ;------------------------------------------------------------------------------------------ SetMyNewUSBAddress: lds MyInAddress,MyInAddressSRAM lds MyOutAddress,MyOutAddressSRAM rjmp EndInt0Handler ;------------------------------------------------------------------------------------------ FinishReceiving: cpi bitcount,7 breq NoRemainingBits inc bitcount ShiftRemainingBits: rol shiftbuf dec bitcount brne ShiftRemainingBits st Y+,shiftbuf NoRemainingBits: mov ByteCount,USBBufptrY
136
subi ByteCount,InputShiftBufferBegin-1 mov InputBufferLength,ByteCount ldi USBBufptrY,InputShiftBufferBegin ldi RS232BufptrX,InputBufferBegin+1 MoveDataBuffer: ld temp0,Y+ st X+,temp0 dec ByteCount brne MoveDataBuffer ldi ByteCount,nNRZISOPbyte sts InputBufferBegin,ByteCount ret ;------------------------------------------------------------------------------------------ USBReset: ldi temp0,nNRZIADDR0 mov MyOutAddress,temp0 mov MyInAddress,temp0 clr State clr BitStuffInOut clr OutBitStuffNumber clr ActionFlag clr RAMread clr ConfigByte ret ;------------------------------------------------------------------------------------------ SendPreparedUSBAnswer: mov ByteCount,OutputBufferLength SendUSBAnswer: ldi USBBufptrY,OutputBufferBegin SendUSBBuffer: ldi temp1,0 mov temp3,ByteCount ldi temp2,0b00000011 ld inputbuf,Y+ cbi outputport,DATAplus sbi outputport,DATAminus sbi USBdirection,DATAplus sbi USBdirection,DATAminus in temp0,outputport SendUSBAnswerLoop: ldi bitcount,7 SendUSBAnswerByteLoop:
137
nop ror inputbuf brcs NoXORSend eor temp0,temp2 NoXORSend: out outputport,temp0 dec bitcount brne SendUSBAnswerByteLoop sbrs inputbuf,0 eor temp0,temp2 NoXORSendLSB: dec temp3 ld inputbuf,Y+ out outputport,temp0 brne SendUSBAnswerLoop mov bitcount,OutBitStuffNumber cpi bitcount,0 breq ZeroBitStuf SendUSBAnswerBitstuffLoop: ror inputbuf brcs NoXORBitstuffSend eor temp0,temp2 NoXORBitstuffSend: out outputport,temp0 nop dec bitcount brne SendUSBAnswerBitstuffLoop ld inputbuf,Y ZeroBitStuf: nop cbr temp0,3 out outputport,temp0 ldi bitcount,5 SendUSBWaitEOP: dec bitcount brne SendUSBWaitEOP sbi outputport,DATAminus sbi outputport,DATAminus cbi USBdirection,DATAplus cbi USBdirection,DATAminus cbi outputport,DATAminus ret ;------------------------------------------------------------------------------------------
138
ToggleDATAPID: lds temp0,OutputBufferBegin+1 cpi temp0,DATA1PID ldi temp0,DATA0PID breq SendData0PID ldi temp0,DATA1PID SendData0PID: sts OutputBufferBegin+1,temp0 ret ;------------------------------------------------------------------------------------------ ComposeZeroDATA1PIDAnswer: ldi temp0,DATA0PID sts OutputBufferBegin+1,temp0 ComposeZeroAnswer: ldi temp0,SOPbyte sts OutputBufferBegin+0,temp0 rcall ToggleDATAPID ldi temp0,0x00 sts OutputBufferBegin+2,temp0 sts OutputBufferBegin+3,temp0 ldi ByteCount,2+2 ret ;------------------------------------------------------------------------------------------ InitACKBufffer: ldi temp0,SOPbyte sts ACKBufferBegin+0,temp0 ldi temp0,ACKPID sts ACKBufferBegin+1,temp0 ret ;------------------------------------------------------------------------------------------ SendACK: push USBBufptrY push bitcount push OutBitStuffNumber ldi USBBufptrY,ACKBufferBegin ldi ByteCount,2 clr OutBitStuffNumber rcall SendUSBBuffer pop OutBitStuffNumber pop bitcount pop USBBufptrY ret ;------------------------------------------------------------------------------------------ InitNAKBufffer: ldi temp0,SOPbyte sts NAKBufferBegin+0,temp0
139
ldi temp0,NAKPID sts NAKBufferBegin+1,temp0 ret ;------------------------------------------------------------------------------------------ SendNAK: push OutBitStuffNumber ldi USBBufptrY,NAKBufferBegin ldi ByteCount,2 clr OutBitStuffNumber rcall SendUSBBuffer pop OutBitStuffNumber ret ;------------------------------------------------------------------------------------------ ComposeSTALL: ldi temp0,SOPbyte sts OutputBufferBegin+0,temp0 ldi temp0,STALLPID sts OutputBufferBegin+1,temp0 ldi ByteCount,2 ret ;------------------------------------------------------------------------------------------ DecodeNRZI: push USBBufptrY push ByteCount add ByteCount,USBBufptrY ser temp0 NRZIloop: ror temp0 ld temp0,Y mov temp2,temp0 ror temp2 eor temp2,temp0 com temp2 st Y+,temp2 cp USBBufptrY,ByteCount brne NRZIloop pop ByteCount pop USBBufptrY ret ;------------------------------------------------------------------------------------------ BitStuff: clr temp3 clr lastBitstufNumber dec lastBitstufNumber BitStuffRepeat: push USBBufptrY
140
push ByteCount mov temp1,temp3 ldi temp0,8 SumAllBits: add temp1,temp0 dec ByteCount brne SumAllBits ldi temp2,6 pop ByteCount push ByteCount add ByteCount,USBBufptrY inc ByteCount inc ByteCount BitStuffLoop: ld temp0,Y ldi bitcount,8 BitStuffByteLoop: ror temp0 brcs IncrementBitstuff ldi temp2,7 IncrementBitstuff: dec temp2 brne DontShiftBuffer cp temp1,lastBitstufNumber ldi temp2,6 brcc DontShiftBuffer dec temp1 ; mov lastBitstufNumber,temp1 cpi bitcount,1 brne NoBitcountCorrect ldi bitcount,9 ; inc USBBufptrY NoBitcountCorrect: dec bitcount bst BitStuffInOut,0 brts CorrectOutBuffer rcall ShiftDeleteBuffer dec temp3 rjmp CorrectBufferEnd CorrectOutBuffer: rcall ShiftInsertBuffer inc temp3 CorrectBufferEnd: pop ByteCount pop USBBufptrY
141
rjmp BitStuffRepeat DontShiftBuffer: dec temp1 breq EndBitStuff dec bitcount brne BitStuffByteLoop inc USBBufptrY rjmp BitStuffLoop EndBitStuff: pop ByteCount pop USBBufptrY bst BitStuffInOut,0 brts IncrementLength DecrementLength: cpi temp3,0 breq NoChangeByteCount dec ByteCount subi temp3,256-8 brcc NoChangeByteCount dec ByteCount ret IncrementLength: mov OutBitStuffNumber,temp3 subi temp3,8 brcs NoChangeByteCount inc ByteCount mov OutBitStuffNumber,temp3 NoChangeByteCount: ret ;------------------------------------------------------------------------------------------ ShiftInsertBuffer: mov temp0,bitcount ldi bitcount,9 sub bitcount,temp0 ld temp1,Y rol temp1 ser temp2 HalfInsertPosuvMask: lsl temp2 dec bitcount brne HalfInsertPosuvMask and temp1,temp2 com temp2
142
lsr temp2 ld temp0,Y and temp0,temp2 or temp1,temp0 ld temp0,Y rol temp0 st Y+,temp1 ShiftInsertBufferLoop: cpse USBBufptrY,ByteCount rjmp NoEndShiftInsertBuffer ret NoEndShiftInsertBuffer: ld temp1,Y rol temp1 st Y+,temp1 rjmp ShiftInsertBufferLoop ;------------------------------------------------------------------------------------------ ShiftDeleteBuffer: mov temp0,bitcount ldi bitcount,9 sub bitcount,temp0 mov temp0,USBBufptrY inc temp0 mov USBBufptrY,ByteCount ShiftDeleteBufferLoop: ld temp1,-Y ror temp1 st Y,temp1 cpse USBBufptrY,temp0 rjmp ShiftDeleteBufferLoop ld temp1,-Y ror temp1 ser temp2 HalfDeletePosuvMask: dec bitcount breq DoneMask lsl temp2 rjmp HalfDeletePosuvMask DoneMask: and temp1,temp2 com temp2 ld temp0,Y and temp0,temp2 or temp1,temp0
143
st Y,temp1 ret ;------------------------------------------------------------------------------------------ MirrorInBufferBytes: push USBBufptrY push ByteCount ldi USBBufptrY,InputBufferBegin rcall MirrorBufferBytes pop ByteCount pop USBBufptrY ret ;------------------------------------------------------------------------------------------ MirrorBufferBytes: add ByteCount,USBBufptrY MirrorBufferloop: ld temp0,Y ldi temp1,8 MirrorBufferByteLoop: ror temp0 rol temp2 dec temp1 brne MirrorBufferByteLoop st Y+,temp2 cp USBBufptrY,ByteCount brne MirrorBufferloop ret ;------------------------------------------------------------------------------------------ ;CheckCRCIn: ; kiss USBBUFPTRY ; kiss ByteCount ; ldi USBBUFPTRY,InputBuffercompare ; rcall CheckCRC ; pope ByteCount ; pope USBBUFPTRY ; lip ;------------------------------------------------------------------------------------------ AddCRCOut: push USBBufptrY push ByteCount ldi USBBufptrY,OutputBufferBegin rcall CheckCRC com temp0 com temp1 st Y+,temp1 st Y,temp0 dec USBBufptrY
144
ldi ByteCount,2 rcall MirrorBufferBytes pop ByteCount pop USBBufptrY ret ;------------------------------------------------------------------------------------------ CheckCRC: add ByteCount,USBBufptrY inc USBBufptrY ld temp0,Y+ cpi temp0,DATA0PID breq ComputeDATACRC cpi temp0,DATA1PID brne CRC16End ComputeDATACRC: ser temp0 ser temp1 CRC16Loop: ld temp2,Y+ ldi temp3,8 CRC16LoopByte: bst temp1,7 bld bitcount,0 eor bitcount,temp2 rol temp0 rol temp1 cbr temp0,1 lsr temp2 ror bitcount brcc CRC16NoXOR ldi bitcount,CRC16poly>>8 eor temp1,bitcount ldi bitcount,LOW(CRC16poly) eor temp0,bitcount CRC16NoXOR: dec temp3 brne CRC16LoopByte cp USBBufptrY,ByteCount brne CRC16Loop CRC16End: ret ;------------------------------------------------------------------------------------------ LoadDescriptorFromROM: lpm st Y+,R0
145
adiw ZH:ZL,1 dec ByteCount brne LoadDescriptorFromROM rjmp EndFromRAMROM ;------------------------------------------------------------------------------------------ LoadDescriptorFromROMZeroInsert: lpm st Y+,R0 bst RAMread,3 brtc InsertingZero adiw ZH:ZL,1 lpm st Y+,R0 clt bld RAMread,3 rjmp InsertingZeroEnd InsertingZero: clr R0 st Y+,R0 InsertingZeroEnd: adiw ZH:ZL,1 subi ByteCount,2 brne LoadDescriptorFromROMZeroInsert rjmp EndFromRAMROM ;------------------------------------------------------------------------------------------ LoadDescriptorFromSRAM: ld R0,Z st Y+,R0 inc ZL dec ByteCount brne LoadDescriptorFromSRAM rjmp EndFromRAMROM ;------------------------------------------------------------------------------------------ LoadDescriptorFromEEPROM: out EEAR,ZL sbi EECR,EERE in R0,EEDR st Y+,R0 inc ZL dec ByteCount brne LoadDescriptorFromEEPROM rjmp EndFromRAMROM ;------------------------------------------------------------------------------------------ LoadXXXDescriptor: ldi temp0,SOPbyte
146
sts OutputBufferBegin,temp0 ldi ByteCount,8 ldi USBBufptrY,OutputBufferBegin+2 and RAMread,RAMread brne FromRAMorEEPROM FromROM: rjmp LoadDescriptorFromROM FromRAMorEEPROM: sbrc RAMread,2 rjmp LoadDescriptorFromROMZeroInsert sbrc RAMread,0 rjmp LoadDescriptorFromSRAM rjmp LoadDescriptorFromEEPROM EndFromRAMROM: sbrc RAMread,7 clr RAMread rcall ToggleDATAPID ldi USBBufptrY,OutputBufferBegin+1 ret ;------------------------------------------------------------------------------------------ PrepareUSBOutAnswer: rcall PrepareUSBAnswer MakeOutBitStuff: inc BitStuffInOut ldi USBBufptrY,OutputBufferBegin rcall BitStuff mov OutputBufferLength,ByteCount clr BitStuffInOut ret ;------------------------------------------------------------------------------------------ PrepareUSBAnswer: clr RAMread lds temp0,InputBufferBegin+2 lds temp1,InputBufferBegin+3 cbr temp0,0b10011111 brne VendorRequest rjmp StandardRequest ;-------------------------- DoSetInfraBufferEmpty: rjmp OneZeroAnswer ;-------------------------- DoSetRS232Baud: lds temp0,InputBufferBegin+4 out UBRRL,temp0 rjmp OneZeroAnswer
147
;-------------------------- DoGetRS232Baud: in R0,UBRRL rjmp DoGetIn ;-------------------------- DoRS232Send: lds temp0,InputBufferBegin+4 out UDR,temp0 WaitForRS232Send: sbis UCSRB,TXEN rjmp OneZeroAnswer sbis UCSRA,TXC rjmp WaitForRS232Send rjmp OneZeroAnswer ;-------------------------- DoRS232Read: rjmp TwoZeroAnswer ;-------------------------- VendorRequest: clr ZH cpi temp1,1 breq DoSetInfraBufferEmpty cpi temp1,2 breq DoGetInfraCode cpi temp1,3 breq DoSetDataPortDirection cpi temp1,4 breq DoGetDataPortDirection cpi temp1,5 breq DoSetOutDataPort cpi temp1,6 breq DoGetOutDataPort cpi temp1,7 breq DoGetInDataPort cpi temp1,8 breq DoEEPROMRead cpi temp1,9 breq DoEEPROMWrite cpi temp1,10
148
breq DoRS232Send cpi temp1,11 breq DoRS232Read cpi temp1,12 breq DoSetRS232Baud cpi temp1,13 breq DoGetRS232Baud cpi temp1,14 breq DoGetRS232Buffer cpi temp1,USER_FNC_NUMBER+0 breq DoUserFunction0 cpi temp1,USER_FNC_NUMBER+1 breq DoUserFunction1 cpi temp1,USER_FNC_NUMBER+2 breq DoUserFunction2 rjmp ZeroDATA1Answer ;---------------------------------------------------------------------------------- DoUserFunctionX: DoUserFunction0: lds temp0,InputBufferBegin+4 ;lds temp1,InputBufferBegin+5 ;lds temp2,InputBufferBegin+6 ;lds temp3,InputBufferBegin+7 ;lds ACC,InputBufferBegin+8 ;----------------------------------------------------------------------------------- nop nop nop nop nop ;----------------------------------------------------------------------------------- mov ZL,temp0 inc RAMread ldi temp0,RAMEND+1 rjmp ComposeEndXXXDescriptor DoUserFunction1: rjmp OneZeroAnswer DoUserFunction2:
149
rjmp TwoZeroAnswer ;-------------------------------------------------------------------------------------- DoGetInfraCode: rjmp OneZeroAnswer DoEEPROMRead: lds ZL,InputBufferBegin+4 ldi temp0,2 mov RAMread,temp0 ldi temp0,E2END+1 rjmp ComposeEndXXXDescriptor DoEEPROMWrite: lds ZL,InputBufferBegin+4 lds R0,InputBufferBegin+6 rjmp EEPROMWrite DoSetDataPortDirection: lds ACC,InputBufferBegin+4 rcall SetDataPortDirection rjmp OneZeroAnswer DoGetDataPortDirection: rcall GetDataPortDirection rjmp DoGetIn DoSetOutDataPort: lds ACC,InputBufferBegin+4 rcall SetOutDataPort rjmp OneZeroAnswer DoGetOutDataPort: rcall GetOutDataPort rjmp DoGetIn DoGetInDataPort: rcall GetInDataPort DoGetIn: ldi ZL,0 ldi temp0,0x81 mov RAMread,temp0 ldi temp0,1 rjmp ComposeEndXXXDescriptor DoGetRS232Buffer: mov temp0,RS232BufferFull cpi temp0,0 breq OneZeroAnswer
150
lds ACC,InputBufferBegin+8 inc temp0 cp ACC,temp0 brcc NoShortGetRS232Buffer mov temp0,ACC NoShortGetRS232Buffer: dec temp0 lds temp1,RS232BufferBegin+1 add temp1,temp0 cpi temp1,RS232BufferBegin+MAXRS232LENGTH+1 brcs ReadNoOverflow subi temp1,RS232BufferBegin+MAXRS232LENGTH+1 sub temp0,temp1 ldi temp1,RS232BufferBegin+4 ReadNoOverflow: lds ZL,RS232BufferBegin+1 sts RS232BufferBegin+1,temp1 dec ZL sub RS232BufferFull,temp0 st Z,RS232BufferFull inc temp0 inc RAMread rjmp ComposeEndXXXDescriptor ;------------------------------------------------------------------------------------------ OneZeroAnswer: ldi temp0,1 rjmp ComposeGET_STATUS2 StandardRequest: cpi temp1,GET_STATUS breq ComposeGET_STATUS cpi temp1,CLEAR_FEATURE breq ComposeCLEAR_FEATURE cpi temp1,SET_FEATURE breq ComposeSET_FEATURE cpi temp1,SET_ADDRESS breq ComposeSET_ADDRESS cpi temp1,GET_DESCRIPTOR
151
breq ComposeGET_DESCRIPTOR cpi temp1,SET_DESCRIPTOR breq ComposeSET_DESCRIPTOR cpi temp1,GET_CONFIGURATION breq ComposeGET_CONFIGURATION cpi temp1,SET_CONFIGURATION breq ComposeSET_CONFIGURATION cpi temp1,GET_INTERFACE breq ComposeGET_INTERFACE cpi temp1,SET_INTERFACE breq ComposeSET_INTERFACE cpi temp1,SYNCH_FRAME breq ComposeSYNCH_FRAME rjmp ZeroDATA1Answer ComposeSET_ADDRESS: lds temp1,InputBufferBegin+4 rcall SetMyNewUSBAddresses ldi State,AddressChangeState rjmp ZeroDATA1Answer ComposeSET_CONFIGURATION: lds ConfigByte,InputBufferBegin+4 ComposeCLEAR_FEATURE: ComposeSET_FEATURE: ComposeSET_INTERFACE: ZeroStringAnswer: rjmp ZeroDATA1Answer ComposeGET_STATUS: TwoZeroAnswer: ldi temp0,2 ComposeGET_STATUS2: ldi ZH, high(StatusAnswer<<1) ldi ZL, low(StatusAnswer<<1) rjmp ComposeEndXXXDescriptor ComposeGET_CONFIGURATION: and ConfigByte,ConfigByte breq OneZeroAnswer ldi temp0,1
152
ldi ZH, high(ConfigAnswerMinus1<<1) ldi ZL, low(ConfigAnswerMinus1<<1)+1 rjmp ComposeEndXXXDescriptor ComposeGET_INTERFACE: ldi ZH, high(InterfaceAnswer<<1) ldi ZL, low(InterfaceAnswer<<1) ldi temp0,1 rjmp ComposeEndXXXDescriptor ComposeSYNCH_FRAME: ComposeSET_DESCRIPTOR: rcall ComposeSTALL ret ComposeGET_DESCRIPTOR: lds temp1,InputBufferBegin+5 cpi temp1,DEVICE breq ComposeDeviceDescriptor cpi temp1,CONFIGURATION breq ComposeConfigDescriptor cpi temp1,STRING breq ComposeStringDescriptor ret ComposeDeviceDescriptor: ldi ZH, high(DeviceDescriptor<<1) ldi ZL, low(DeviceDescriptor<<1) ldi temp0,0x12 rjmp ComposeEndXXXDescriptor ComposeConfigDescriptor: ldi ZH, high(ConfigDescriptor<<1) ldi ZL, low(ConfigDescriptor<<1) ldi temp0,9+9+7 ComposeEndXXXDescriptor: lds TotalBytesToSend,InputBufferBegin+8 cp TotalBytesToSend,temp0 brcs HostConfigLength mov TotalBytesToSend,temp0 HostConfigLength: mov temp0,TotalBytesToSend clr TransmitPart andi temp0,0b00000111 breq Length8Multiply inc TransmitPart Length8Multiply: mov temp0,TotalBytesToSend lsr temp0 lsr temp0 lsr temp0
153
add TransmitPart,temp0 ldi temp0,DATA0PID sts OutputBufferBegin+1,temp0 rjmp ComposeNextAnswerPart ComposeStringDescriptor: ldi temp1,4+8 mov RAMread,temp1 lds temp1,InputBufferBegin+4 cpi temp1,0 breq ComposeLangIDString cpi temp1,2 breq ComposeDevNameString brcc ZeroStringAnswer ComposeVendorString: ldi ZH, high(VendorStringDescriptor<<1) ldi ZL, low(VendorStringDescriptor<<1) ldi temp0,(VendorStringDescriptorEnd-VendorStringDescriptor)*4-2 rjmp ComposeEndXXXDescriptor ComposeDevNameString: ldi ZH, high(DevNameStringDescriptor<<1) ldi ZL, low(DevNameStringDescriptor<<1) ldi temp0,(DevNameStringDescriptorEnd-DevNameStringDescriptor)*4-2 rjmp ComposeEndXXXDescriptor ComposeLangIDString: clr RAMread ldi ZH, high(LangIDStringDescriptor<<1) ldi ZL, low(LangIDStringDescriptor<<1) ldi temp0,(LangIDStringDescriptorEnd-LangIDStringDescriptor)*2 rjmp ComposeEndXXXDescriptor ;------------------------------------------------------------------------------------------ ZeroDATA1Answer: rcall ComposeZeroDATA1PIDAnswer ret ;------------------------------------------------------------------------------------------ SetMyNewUSBAddresses: mov temp2,temp1 mov temp3,temp1 cpi temp1,0b01111111 brne NewAddressNo6ones ldi temp1,0b10111111 NewAddressNo6ones: andi temp3,0b00000111 cpi temp3,0b00000111 brne NewAddressNo3ones
154
sec rol temp2 andi temp2,0b11110111 NewAddressNo3ones: sts MyOutAddressSRAM,temp2 rcall NRZIforAddress sts MyInAddressSRAM,ACC lds temp1,MyOutAddressSRAM rcall NRZIforAddress sts MyOutAddressSRAM,ACC ret ;------------------------------------------------------------------------------------------ NRZIforAddress: clr ACC ldi temp2,0b00000001 ldi temp3,8 SetMyNewUSBAddressesLoop: mov temp0,ACC ror temp1 brcs NoXORBits eor temp0,temp2 NoXORBits: ror temp0 rol ACC dec temp3 brne SetMyNewUSBAddressesLoop ret ;------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------ PrepareOutContinuousBuffer: rcall PrepareContinuousBuffer rcall MakeOutBitStuff ret ;------------------------------------------------------------------------------------------ PrepareContinuousBuffer: mov temp0,TransmitPart cpi temp0,1 brne NextAnswerInBuffer rcall ComposeZeroAnswer ret NextAnswerInBuffer:
155
dec TransmitPart ComposeNextAnswerPart: mov temp1,TotalBytesToSend subi temp1,8 ldi temp3,8 brcc Nad8Bytov mov temp3,TotalBytesToSend clr TransmitPart inc TransmitPart Nad8Bytov: mov TotalBytesToSend,temp1 rcall LoadXXXDescriptor ldi ByteCount,2 add ByteCount,temp3 rcall AddCRCOut inc ByteCount inc ByteCount ret ;------------------------------------------------------------------------------------------ .equ USBversion =0x0101 .equ VendorUSBID =0x03EB ; vendor identifier (Atmel=0x03EB) .equ DeviceUSBID =0x21FE .equ DeviceVersion =0x0002 .equ MaxUSBCurrent =46 ;------------------------------------------------------------------------------------------ DeviceDescriptor: .db 0x12,0x01 .dw USBversion .db 0x00,0x00 .db 0x00,0x08 .dw VendorUSBID .dw DeviceUSBID .dw DeviceVersion .db 0x01,0x02 .db 0x00,0x01 DeviceDescriptorEnd: ;------------------------------------------------------------------------------------------ ConfigDescriptor: .db 0x9,0x02 ConfigDescriptorLength:
156
.dw 9+9+7 ConfigAnswerMinus1: .db 1,1 .db 0,0x80 .db MaxUSBCurrent/2,0x09 .db 0x04,0 InterfaceAnswer: .db 0,1 StatusAnswer: .db 0,0 .db 0,0 .db 0x07,0x5 .db 0x81,0 .dw 0x08 .db 10,0 ConfigDescriptorEnd: ;------------------------------------------------------------------------------------------ LangIDStringDescriptor: .db (LangIDStringDescriptorEnd-LangIDStringDescriptor)*2,3 .dw 0x0409 LangIDStringDescriptorEnd: ;------------------------------------------------------------------------------------------ VendorStringDescriptor: .db (VendorStringDescriptorEnd-VendorStringDescriptor)*4-2,3 VendorStringDescriptorEnd: ;------------------------------------------------------------------------------------------ DevNameStringDescriptor: .db (DevNameStringDescriptorEnd-DevNameStringDescriptor)*4-2,3 .db "ECG USB protocol" DevNameStringDescriptorEnd: ;------------------------------------------------------------------------------------------ MaskPortData: bst ACC,0 bld temp0,LEDlsb0 bst ACC,1 bld temp0,LEDlsb1 bst ACC,2 bld temp0,LEDlsb2 bst ACC,3 bld temp1,LEDmsb3 bst ACC,4 bld temp1,LEDmsb4 bst ACC,5 bld temp1,LEDmsb5 bst ACC,6 bld temp1,LEDmsb6
157
bst ACC,7 bld temp1,LEDmsb7 ret ;------------------------------------------------------------------------------------------ SetDataPortDirection: in temp0,LEDdirectionLSB in temp1,LEDdirectionMSB rcall MaskPortData out LEDdirectionLSB,temp0 out LEDdirectionMSB,temp1 ret ;------------------------------------------------------------------------------------------ SetOutDataPort: in temp0,LEDPortLSB in temp1,LEDPortMSB rcall MaskPortData out LEDPortLSB,temp0 out LEDPortMSB,temp1 ret ;------------------------------------------------------------------------------------------ GetInDataPort: in temp0,LEDPinMSB in temp1,LEDPinLSB MoveLEDin: bst temp1,LEDlsb0 bld temp0,0 bst temp1,LEDlsb1 bld temp0,1 bst temp1,LEDlsb2 bld temp0,2 mov R0,temp0 ret ;------------------------------------------------------------------------------------------ GetOutDataPort: in temp0,LEDPortMSB in temp1,LEDPortLSB rjmp MoveLEDin ;------------------------------------------------------------------------------------------ GetDataPortDirection: in temp0,LEDdirectionMSB in temp1,LEDdirectionLSB rjmp MoveLEDin ;------------------------------------------------------------------------------------------ EEPROMWrite: out EEAR,ZL out EEDR,R0
158
cli sbi EECR,EEMPE sei sbi EECR,EEPE WaitForEEPROMReady: sbic EECR,EEPE rjmp WaitForEEPROMReady rjmp OneZeroAnswer ;------------------------------------------------------------------------------------------ ;******************************************************************** ;* Selesai ;********************************************************************
159
Program Plotter Delphi oleh: Johan Arief
unit MainFormUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls, ExtCtrls, Grids, mmsystem, shellapi, ComCtrls; const WM_USBTIMERMESSAGE = WM_USER + 401; NO_ERROR=0; DEVICE_NOT_PRESENT=1; NO_DATA_AVAILABLE=2; INVALID_BAUDRATE=3; OVERRUN_ERROR=4; INVALID_DATABITS=5; INVALID_PARITY=6; INVALID_STOPBITS=7; type TMainForm = class(TForm) DataInTimer: TTimer; InfraIntervalLabel: TLabel; RemoteCodeLabel: TLabel; DeviceNotPresentLabel: TLabel; RS232BufferTimer: TTimer; TerminalMemo: TMemo; RS232GroupBox: TGroupBox; RS232ReadTimer: TTimer; TransmittingLabel: TLabel; ReceivingLabel: TLabel; RS232SendButton: TButton; ParityComboBox: TComboBox; StopBitsComboBox: TComboBox; DataBitsComboBox: TComboBox; PortChoiceRadioGroup: TRadioGroup; DataInIntervalLabel: TLabel; RS232ReadIntervalLabel: TLabel; RS232ReadBaudLabel: TLabel; Image1: TImage; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction);
160
procedure DataInTimerTimer(Sender: TObject); procedure EEPROMReadButtonClick(Sender: TObject); procedure EEPROMWriteButtonClick(Sender: TObject); procedure RS232SendButtonClick(Sender: TObject); procedure RS232ReadTimerTimer(Sender: TObject); procedure RS232BufferTimerTimer(Sender: TObject); procedure RS232SendEditKeyPress(Sender: TObject; var Key: Char); procedure DataBitsComboBoxChange(Sender: TObject); procedure ParityComboBoxChange(Sender: TObject); procedure StopBitsComboBoxChange(Sender: TObject); procedure FormResize(Sender: TObject); procedure PortChoiceRadioGroupClick(Sender: TObject); private Private declarations Bitmap:TBitmap; public Public declarations procedure DrawOsciloscope(var InputData:array of byte; InputLength:integer); protected procedure WMUSBMeasure(var Message: TMessage); message WM_USBTIMERMESSAGE; end; var MainForm: TMainForm; panjang:integer; implementation $R *.DFM $WARN UNSAFE_CODE OFF $WARN UNSAFE_TYPE OFF $WARN UNSAFE_CAST OFF const ClosedApp:boolean=false; PreciseTimer:integer=0; DLLPath='USBECG.dll'; Xsmin:real=1; Xsmax:real=100; Ysmin:real=0; Ysmax:real=3500; var InputRS232Data:array[0..10000]of byte; x,y:real;
161
function DoEEPROMRead(Address:word; var DataInByte:byte):integer; stdcall external DLLPath name 'DoEEPROMRead'; function DoEEPROMWrite(Address:word; DataOutByte:byte):integer; stdcall external DLLPath name 'DoEEPROMWrite'; function DoRS232Send(DataOutByte:byte):integer; stdcall external DLLPath name 'DoRS232Send'; function DoRS232Read(var DataInByte:byte):integer; stdcall external DLLPath name 'DoRS232Read'; function DoSetRS232Baud(BaudRate:integer):integer; stdcall external DLLPath name 'DoSetRS232Baud'; function DoGetRS232Baud(var BaudRate:integer):integer; stdcall external DLLPath name 'DoGetRS232Baud'; function DoGetRS232Buffer(var RS232Buffer:array of byte; var RS232BufferLength:integer):integer; stdcall external DLLPath name 'DoGetRS232Buffer'; function DoRS232BufferSend(var RS232Buffer:array of byte; var RS232BufferLength:integer):integer; stdcall external DLLPath name 'DoRS232BufferSend'; function DoSetRS232DataBits(DataBits:byte):integer; stdcall external DLLPath name 'DoSetRS232DataBits'; function DoGetRS232DataBits(var DataBits:byte):integer; stdcall external DLLPath name 'DoGetRS232DataBits'; function DoSetRS232Parity(Parity:byte):integer; stdcall external DLLPath name 'DoSetRS232Parity'; function DoGetRS232Parity(var Parity:byte):integer; stdcall external DLLPath name 'DoGetRS232Parity'; function DoSetRS232StopBits(StopBits:byte):integer; stdcall external DLLPath name 'DoSetRS232StopBits'; function DoGetRS232StopBits(var StopBits:byte):integer; stdcall external DLLPath name 'DoGetRS232StopBits'; Procedure transformasi(Xs,Ys:real;var x1,y1:real); var W,H:integer; Xlmin,Xlmax,Ylmin,Ylmax:real; A,B:real; begin w:=MainForm.Image1.width; h:=MainForm.image1.Height; Xlmin:=w div 50; Ylmin:=9 * h div 10; Xlmax:=w; Ylmax:=0;
162
A:=(Xlmax - Xlmin)/(Xsmax-Xsmin); B:=Xlmin-A*Xsmin; X1:=A*Xs+B; A:=(Ylmax-Ylmin)/(Ysmax-Ysmin); B:=Ylmin-A*Ysmin; Y1:=A*Ys+B; end; Procedure plot; const dx:real=0.1; var x1,y1:real; begin transformasi(x,y,x1,y1); if x=xsmin then MainForm.Image1.Canvas.MoveTo(trunc(x1),trunc(y1)) else MainForm.Image1.Canvas.LineTo(trunc(x1),trunc(y1)); end; procedure TemperatureTimerProc(uID:integer; uMsg:integer;dwUser,dw1,dw2:integer);stdcall; var LocalMainForm:TMainForm; begin LocalMainForm:=TMainForm(dwUser); if ClosedApp then Exit; PostMessage(LocalMainForm.Handle,WM_USBTIMERMESSAGE,0,0); end; procedure TMainForm.WMUSBMeasure(var Message: TMessage); var MyMsg:TMsg; begin Message.Result:=1; InfraTimerTimer(self); while PeekMessage(MyMsg,Handle,WM_USBTIMERMESSAGE,WM_USBTIMERMESSAGE,PM_REMOVE) do begin end; //removing of all waiting WM_USBTIMERMESSAGE messages inherited; end;
163
procedure TMainForm.DrawOsciloscope(var InputData:array of byte; InputLength:integer); begin end; procedure TMainForm.FormCreate(Sender: TObject); begin Application.HintColor:=clYellow; Application.HintPause:=0; Application.HintHidePause:=20000; TerminalMemo.Lines.Clear; panjang:=0; DataBitsComboBox.ItemIndex:=3; ParityComboBox.ItemIndex:=0; StopBitsComboBox.ItemIndex:=0; DataBitsComboBoxChange(self); ParityComboBoxChange(self); StopBitsComboBoxChange(self); procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin ClosedApp:=true; if PreciseTimer<>0 then begin timeKillEvent(PreciseTimer); PreciseTimer:=0; end; end; procedure TMainForm.DataInTimerTimer(Sender: TObject); var InByte,InByteB,InByteC,InByteD:byte; UsedPorts:byte; i:integer; MyComponent:TComponent; begin DataInTimer.Tag:=1; DataInIntervalLabel.Caption:=IntToStr(DataInTimer.Interval)+'ms'; if DoGetInDataPorts(InByteB,InByteC,InByteD,UsedPorts)<>NO_ERROR then begin
164
DeviceNotPresentLabel.Visible:=true; DataInTimer.Tag:=0; Exit; end; if UsedPorts<=1 then PortChoiceRadioGroup.ItemIndex:=0; case PortChoiceRadioGroup.ItemIndex of 1:InByte:=InByteC; 2:InByte:=InByteD; else InByte:=InByteB; end; EcgTidakTerdeteksiLabel.Visible:=false; for i:= 0 to 7 do begin MyComponent:=FindComponent('DataInCheckBox'+IntToStr(i)); (MyComponent as TCheckBox).Checked:=((MyComponent as TCheckBox).Tag and InByte)<>0; end; if DoGetOutDataPorts(InByteB,InByteC,InByteD,UsedPorts)<>NO_ERROR then begin DeviceNotPresentLabel.Visible:=true; DataInTimer.Tag:=0; Exit; end; if UsedPorts<=1 then PortChoiceRadioGroup.ItemIndex:=0; case PortChoiceRadioGroup.ItemIndex of 1:InByte:=InByteC; 2:InByte:=InByteD; else InByte:=InByteB; end; EcgTidakTerdeteksiLabel.Visible:=false; for i:= 0 to 7 do begin MyComponent:=FindComponent('DataOutCheckBox'+IntToStr(i)); (MyComponent as TCheckBox).Checked:=((MyComponent as TCheckBox).Tag and InByte)<>0; end; if DoGetDataPortDirections(InByteB,InByteC,InByteD,UsedPorts)<>NO_ERROR then begin EcgTidakTerdeteksiLabel.Visible:=false; DataInTimer.Tag:=0; Exit; end;
165
if UsedPorts<=1 then PortChoiceRadioGroup.ItemIndex:=0; case PortChoiceRadioGroup.ItemIndex of 1:InByte:=InByteC; 2:InByte:=InByteD; else InByte:=InByteB; end; EcgTidakTerdeteksiLabel.Visible:=false; for i:= 0 to 7 do begin MyComponent:=FindComponent('DataDirectionCheckBox'+IntToStr(i)); (MyComponent as TCheckBox).Checked:=((MyComponent as TCheckBox).Tag and InByte)<>0; end; DataInTimer.Tag:=0; end; procedure TMainForm.EEPROMReadButtonClick(Sender: TObject); var i:integer; DataByte:byte; begin end; procedure TMainForm.EEPROMWriteButtonClick(Sender: TObject); var i:integer; DataByte:integer; begin end; procedure TMainForm.RS232SendButtonClick(Sender: TObject); type MyBuffer=array [0..100000] of byte; var j,i:integer; P:MyBuffer; MyStr:string; begin MyStr:=TerminalMemo.Text; i:=Length(MyStr); Screen.Cursor:=crHourGlass; try for j:=1 to i do
166
begin P[j-1]:=byte(MyStr[j]); end; DoRS232BufferSend(P, i); finally Screen.Cursor:=crArrow; end; end; procedure TMainForm.RS232ReadTimerTimer(Sender: TObject); var BaudRate:integer; Databits:byte; Parity:byte; Stopbits:byte; begin RS232ReadIntervalLabel.Caption:=IntToStr(RS232ReadTimer.Interval)+'ms'; if DoGetRS232Baud(BaudRate)=NO_ERROR then begin RS232ReadBaudLabel.Caption:='='+IntToStr(BaudRate); EcgTidakTerdeteksiLabel.Visible:=false; end else begin EcgTidakTerdeteksiLabel.Visible:=true; end; if not DataBitsComboBox.DroppedDown then if DoGetRS232DataBits(Databits)=NO_ERROR then begin DataBitsComboBox.ItemIndex:=Databits-5; EcgTidakTerdeteksiLabel.Visible:=false; end else begin // EcgTidakTerdeteksiLabel.Visible:=true; end; if not ParityComboBox.DroppedDown then if DoGetRS232Parity(Parity)=NO_ERROR then begin ParityComboBox.ItemIndex:=Parity; EcgTidakTerdeteksiLabel.Visible:=false; end else begin // EcgTidakTerdeteksiLabel.Visible:=true;
167
end; if not StopBitsComboBox.DroppedDown then if DoGetRS232StopBits(Stopbits)=NO_ERROR then begin StopBitsComboBox.ItemIndex:=Stopbits; EcgTidakTerdeteksiLabel.Visible:=false; end else begin // EcgTidakTerdeteksiLabel.Visible:=true; end; end; procedure TMainForm.RS232BufferTimerTimer(Sender: TObject); var DataLength:integer; i:integer; kanan,bawah:integer; vary:string; ty:string; j,k:integer; begin DataLength:=SizeOf(InputRS232Data); if (DoGetRS232Buffer(InputRS232Data,DataLength)<>NO_ERROR) then begin // EcgTidakTerdeteksiLabel.Visible:=true; Exit; end; if (DataLength=0) then Exit; Screen.Cursor:=crAppStart; ReceivingLabel.Visible:=true; ReceivingLabel.Repaint; try TerminalMemo.SelStart:=Length(TerminalMemo.Text); TerminalMemo.SelLength:=0; panjang:=panjang+1; if panjang=100 then begin RS232BufferMemo.Lines.Clear; TerminalMemo.Lines.Clear; kanan:=Image1.Width; bawah:=Image1.height+10; Image1.Canvas.FillRect(rect(0,0,kanan,bawah)); panjang:=0; x:=0;
168
end; vary:=''; k:=0; for i:=0 to DataLength-1 do begin RS232BufferMemo.Lines.Add(IntToStr(InputRS232Data[i])+' -> '+IntToHex(InputRS232Data[i],2)+' -> '+chr(InputRS232Data[i])); RS232BufferMemo.Lines.Add(IntToStr(i)); TerminalMemo.SelText:=chr(InputRS232Data[i]); k:=k+1; vary:=vary+chr(InputRS232Data[i]); end; if k>6 then k:=6; k:=k-2; ty:=''; for i:=1 to k do begin if ((vary[i]>chr(47)) and (vary[i]<chr(58))) then ty:=ty+vary[i]; end; x:=x+1; y:=strtoint(ty); plot; finally Screen.Cursor:=crArrow; ReceivingLabel.Visible:=false; ReceivingLabel.Repaint; end; end; procedure TMainForm.RS232SendEditKeyPress(Sender: TObject; var Key: Char); begin DoRS232Send(byte(Key)); end; procedure TMainForm.DataBitsComboBoxChange(Sender: TObject); var RetVal:integer; begin RetVal:=DoSetRS232DataBits(StrToInt(DataBitsComboBox.Text)); DataBitsComboBox.Color:=clWindow; DataBitsComboBox.Font.Style:=[]; case RetVal of ECG_TIDAK_TERDETEKSI: DataBitsComboBox.Color:=clRed; INVALID_DATABITS: DataBitsComboBox.Font.Style:=[fsStrikeOut]; end;
169
end; procedure TMainForm.ParityComboBoxChange(Sender: TObject); var RetVal:integer; begin RetVal:=DoSetRS232Parity(ParityComboBox.ItemIndex); ParityComboBox.Color:=clWindow; ParityComboBox.Font.Style:=[]; case RetVal of ECG_TIDAK_TERDETEKSI: ParityComboBox.Color:=clRed; INVALID_PARITY: ParityComboBox.Font.Style:=[fsStrikeOut]; end; end; procedure TMainForm.StopBitsComboBoxChange(Sender: TObject); var RetVal:integer; begin RetVal:=DoSetRS232StopBits(StopBitsComboBox.ItemIndex); StopBitsComboBox.Color:=clWindow; StopBitsComboBox.Font.Style:=[]; case RetVal of ECG_TIDAK_TERDETEKSI: StopBitsComboBox.Color:=clRed; INVALID_STOPBITS: StopBitsComboBox.Font.Style:=[fsStrikeOut]; end; end; procedure TMainForm.FormResize(Sender: TObject); begin TerminalMemo.Height:= ClientHeight-TerminalMemo.Top; RS232BufferMemo.Height:= ClientHeight-RS232BufferMemo.Top; end; end.
170
171
172
173
174
175
176
177
178
179
180
181
182
DOKUMENTASI
183
184