INTERFASI PARALEL
1. DEFINISI
Paralel
port digunakan secara luas untuk interfasi pada personal computer (PC) dengan I/O devices. Pararel port menyediakan input hingga 9 bit atau output hingga 12 bit dimana proses transfer data
dilakukan secara serentak, seperti ditunjukkan pada gambar 1.Transfer
data secara paralel membutuhkan
rangkaian perangkat keras yang relatif
lebih sederhana, hal ini berlawanan dengan transfer data secara serial
dimana data dikirimkan per bit yang dimulai dengan start bit dan diakhiri dengan stop
bit seperti ditunjukkan pada gambar 2 dan membutuhkan rangkaian perangkat
keras yang relatif lebih rumit. Pararel
port menggunakan 4 control lines, 5 status lines dan 8 data lines. Pararel port dapat ditemukan pada panel belakang PC
dalam bentuk D-Type 25 Pin female
connector atau bentuk D-Type 25 pin male
connector. Pada komunikasi paralel dibutuhkan banyak penghantar. Hal memang
sering menjadi kelemahan komunikasi paralel akibat banyaknya penghantar yang
dibutuhkan, dan panjang penghantar ini tidak boleh lebih dari 20m untuk menjaga
validitas. Namun kelebihan komunikasi paralel adalah lebih cepat dalam pemrogramannya.[1]
Standarisasi
Pararel Port terbaru diatur pada IEEE 1284 yang dikeluarkan pada tahun 1994.
Standarisasi ini mendifinisikan 5 ragam operasi yaitu:
1. Compatibility Mode.
2. Nibble Mode.
3. Byte Mode.
4. EPP Mode (Enhanced Parallel Port).
5. ECP Mode (Extended Capabilities Mode).[1]
3. Byte Mode.
4. EPP Mode (Enhanced Parallel Port).
5. ECP Mode (Extended Capabilities Mode).[1]
Gambar 2 Transfer Data
serial [2]
IEEE
1284 mempersyaratkan devais baru harus kompatibel dengan port paralel yang baku
(Standard Parallel Port/
SPP). Mode kompatibel, mode nibble dan mode byte harus dapat beropersi dengan menggunakan perangkat keras baku yang tersedia pada kartu
port paralel yang asli, sedangkan untuk mode EPP dan mode ECP yang memiliki speed transfer
yang lebih tinggi memerlukan perangkat keras tambahan. Tabel 1 menunjukkan laju
transfer data pada masing-masing mode. [1]
Tabel 1 Laju Transfer Data
[3]
Interface
Transfer Rates
|
|
Centronics
|
40KBps
|
SPP
|
150 KBps
|
ECP
|
2 MBps
|
EPP
|
2 MBps
|
2. PERANGKAT INTERFACE
Tabel 2 menunjukkan “Pin
Outs” dari konektor D-Type 25 Pin
dan konektor Centronics 36 Pin.
Tabel 2 Nomer dan fungsi Pin Parallel Port Connector
[4]
figure 1.2 |
D25- Pin Number
|
Centronics 36 Pin Number
|
Function
|
1
|
1
|
Strobe
|
|
2 to 9
|
2 to 9
|
Data Lines
|
|
10
|
10
|
Acknowledgement
|
|
11
|
11
|
Busy
|
|
12
|
12
|
Out of Paper
|
|
13
|
13
|
Select
|
|
14
|
14
|
Auto feed
|
|
15
|
15, 32
|
Error
|
|
16
|
16, 31
|
Init
|
|
17
|
17, 36
|
Select In
|
|
18 to 25
|
18 to 30, 33
|
GND
|
|
-
|
34, 35
|
N/C
|
D-Type 25 pin connector adalah konektor yang paling
umum ditemukan pada port paralel komputer, sedangkan Centronics Connector biasanya digunakan pada port untuk printer.
IEEE 1284 menetapkan 3 jenis konektor untuk
port parallel, yaitu:
1.
Tipe A adalah konektor D-Type 25 pin yang biasa ditemukan pada
panel belakang computer.
2.
Tipe B adalah konektor D-Type
36 pin Centronics Connector untuk
printer.
3.
Tipe C adalah konektor D-Type 36 seperti Centronics,tetapi
lebih kecil. Konektor ini diklaim memiliki karakteristik elektrik yang lebih
baik dan dilengkapi dengan catu daya .Konektor tipe C direkomendasikan untuk
desain-desain baru.[1]
3. TEGANGAN /KARAKTERISTIK ELEKTRIK
Keluaran port paralel
secara normal adalah logika TTL. Umumnya port paralel menerapkan ASIC, dengan sink current sekitar
6mA,dan source current sekitar 12 mA.
Penggunaan buffer sangat dianjurkan
sehingga tidak terjadi pembebanan pada pada pararel port.
Centronics adalah suatu sistem awal transfer
data dari PC ke printer. Pada centronics
digunakan protokol jabatan tangan dengan menggunaan port paralel standard di bawah kendali perangkat lunak. Di bawah
ini ditunjukkan ` ‘Protokol Centronics'.
yang disederhanakan [1]
Gambar
3. Protocol Handshake Centronics [1]
Cara kerja
adalah sebagai berikut, data valid disiapkan pada port parallel, yaitu pada pin
2 hingga pin 9 pada konektor
D-Type 25 pin, Kemudian
PC memeriksa kondisi printer dalam kondisi sibuk atau tidak melalui sinyal busy, jika
busy low, PC akan mengirim sinyal strobe rendah dengan durasi sedikitnya
1us, dan kemudian data secara normal
dibaca oleh printer atau peripheral pada saat tepi tebing naik tepi strobe.
Printer kemudian akan menunjukkan bahwa printer sedang sibuk memproses
data dengan mengaktifkan sinyal busy menjadi
high. Setiap kali printer telah
menerima data, akan mengirim sinyal acknowledge yang berarti mengakui
adanya byte yang diterima berupa
suatu sinyal denyut negatif nAck
dengan durasi 5us pada line nAck .[1]
Skematik dibawah ini menunjukkan rangkaian dari paralel port. Kartu paralel port ( Paralel Port card's ) yang terdahulu
menggunakan kompomen rumpun 74LS logic. Saat ini sudah digantikan teknologi
ASIC, tetapi secara teoritis tetap sama.
Gambar 4. Standard Paralel Port Bidirectional [1]
Bi-directional port dapat berfungsi sebagai input ataupun output port. Untuk bekerja sebagai port keluaran maka PC menempatkan data output pada I/O slot ISA, kontrol bit 5 dibuat low dan pada saat yang bersamaan tepi
positif ( rising edge ) dari sinyal IOW base akan membuat 74LS374 memindahkan dari input D0 - D7 ke output Q0 - Q7.[1]
Untuk bekerja port masukkan I/O divais menempatkan data
input pada slot Data0 – Data7 dan pada
saat level negatif ( negative level)
dari sinyal IOW base akan membuat 74LS244 memindahkan data dari Data 0 – Data 7 ke I/O slot ISA.
Jika paralel port tidak menyediakan
fasilitas bi-directional dan diperlukan paralel port sebagai input 8 bit, realisasi rangkaiannya
ditunjukkan pada gambar 5. Pada gambar 5 ditunjukkan untuk membuat paralel port
sebagai input 8 bit, disini digunakan 4 input dari status port dan 4
input (open collector) dari control port. [1]
Gambar 5. Parallel Port sebagai Input 8 Bit [1]
Sinyal Busy dijadikan sebagai MSB (Bit-7) dari port status, kemudian
diikuti sesuai urutan gambar 5, sinyal- sinyal Ack, Paper Out dan Select dan seterusnya.
Port kontrol digunakan
untuk membaca nible rendah (Least
Significant).
mampu menyedot arus sekitar 1mA, yang
mana beberapa piranti-piranti daya rendah kesulitan melakukan hal tersebut.
Sekarang apa yang akan terjadi jika dianggap beberapa port memiliki resistor pull-up
sebesar IK ohm? Maka alat harus mampu menyedot arus (sink) sebesar 5
mA. Hal ini semakin menguatkan alasan penggunaan inverter kolektor terbuka.
Walaupun penyangga kolektor terbuka bisa juga
digunakan, namun inverter kolektor
terbuka yang dipilih. Karena inverter tersebut banyak dijumpai di pasaran.
Masukan D3 dihubungkan
melalui inverter ke select printer. Sinyal ini merupakan bit-3 dari port kontrol, D2, D1 dan D0
dihubungkan masing-masing ke Init,
Auto linefeed dan Strobe. Jika hal ini sudah selesai
dirangkai, sekarang ditulis programnya. Pertama kali harus dituliskan xxxx0100
ke port kontrol agar semua jalur kontrol dalam kondisi tinggi (HIGH), sehingga dapat digunakan untuk
menarik rendah (pull down) masukan data .
outportb(CONTROL, inportb(CONTROL) & 0xF0 | 0x04);
Kemudian dapat dibaca nible MS dari port status dan di AND-kan hasilnya dengan F0h . Sinyal Busy
diinversikan secara perangkat keras Sekali dua byte direkonstruksikan, dengan cara mentoggle Busy dan Init pada saat yang
bersamaan.
a = (inportb(STATUS) & 0xF0); /* Read MSnibble */
Sekarang kita bisa membaca nibble LS pada port kontrol begitu
mudahnya. Sekarang kita tidak tertarik pada nibble
MS pada port, sehingga kita AND- kan
hasilnya dengan 0Fh untuk menghapus nibble
MS tersebut. Setelah itu, kita kombinasikan keduanya, dengan cara OR-kan kedua byte tersebut. Sekarang diperoleh sebuah byte, namun perlu diketahui bahwa bit-2 dan 7 diinversi, sehingga perlu di-XOR-kan dengan 84h atau 1000 0100b untuk mentoggle kedua bit tersebut.[1]
a = a |(inportb(CONTROL) & 0x0F); /* Read LSnibble */
a = a ^ 0x84; /* Toggle Bit 2 & 7 */
Mode nibble merupakan cara untuk membaca 8-bit data tanpa menempatkan port pada mode terbalik (reverse mode)
dan tanpa menggunakan jalur data. Mode nibble
menggunakan sebuah 1C LS157 untuk membaca sebuah nibble data, kemudian pindah
ke nibble satunya dan membacanya. Melalui perangkat lunak kedua nibble tersebut
disatukan menjadi sebuah byte.
Kelemahan mode ini hanya masalah lambatnya proses. Dan dibutuhkan beberapa
perintah I/O untuk membaca sebuah byte
dan membutuhkan 1C eksternal.[1]
Gambar 6. Paralel Port Mode
Nibble [1]
Cara kerja rangkaian adalah
sebagai berikut, 74LS157 bertindak seakan-akan sebagai empat saklar. Jika
masukan A/B dalam kondisi LOW, maka
masukan A dipilih, misalnya 1A ke 1Y, 2A ke 2Y dan seterusnya. Jika sekarang
masukan A/B = 1, maka masukan B dipilih. Keluaran Y
dihubungkan ke port status dari port paralel.
outportb(CONTROL, inportb(CONTROL) | 0x01); /* Select Low Nibble (A)*/
Untuk menggunakan rangkaian
pada gambar 6, pertama kali harus dilakukan inisialisasi multiplekser untuk memilih masukan A atau B. Untuk membaca nibel LS
terlebih dahulu, masukan A/B dibuat = 0, karena sinyal strobe terinversi
secara perangkat keras, maka bit-0
pada port kontrol agar dalam kondisi LOW
diberi nilai 1. Setelah nibel rendah
terpilih, kemudian dilakukan pembacaan dari port status nibel LS di-AND-kan
dengan F0h untuk menghapus nibel MS
(tinggi).[1]
a = (inportb(STATUS) & 0xF0); /* Read Low Nibble */
Hasil
nibel LS pada variabel digeser
kekanan 4 kali
a = a >> 4; /* Shift Right 4 Bits */
Kemudian nibel LS dan MS digabung sehingga menjadi byte
outportb(CONTROL, inportb(CONTROL) & 0xFE); /* Select High Nibble (B)*/
a = a |(inportb(STATUS) & 0xF0); /* Read High Nibble */
byte = byte ^ 0x88;
8. APLIKASI PARALEL PORT (INTERFACE LCD)
LCD modul dipasaran
tersedia dalam ukuran 8x2, 16x1, 16x2,
20x2, 20x4, 40x4. Dalam percobaan digunakan 16x2 yang berarti LCD terdiri dari 2 baris dari 16 karakter dan
memiliki 16 pin, termasuk 2 pin untuk backlight. Tabel 4 menunjukan fungsi
pinout dari LCD 2X16.
Tabel 3.Fungsi Pinout dari LCD 2X16 [4]
Pin
No
|
Symbol
|
Details
|
1
|
GND
|
Ground
|
2
|
Vcc
|
Supply
Voltage +5V
|
3
|
Vo
|
Contrast
adjustment
|
4
|
RS
|
0->Control
input, 1-> Data input
|
5
|
R/W
|
Read/
Write
|
6
|
E
|
Enable
|
7 to 14
|
D0 to D7
|
Data
|
15
|
VB1
|
Backlight
+5V
|
16
|
VB0
|
Backlight
ground
|
Untuk program modul LCD,
pertama kita harus menginisialisasi LCD dengan mengirimkan beberapa kata
kontrol. RS harus low dan E harus
tinggi ketika kita mengirim kontrol. R / W pin 0 berarti data menulis atau
kontrol ke LCD dan R / W pin 1 berarti membaca data dari LCD. Untuk mengirim
data ke LCD, membuat RS tinggi, R / W rendah, menempatkan data di pin 7 sampai
14 dan membuat E pin tinggi dan
rendah sekali. Di sini, kita akan menulis pada modul LCD dan tidak membaca kembali.
Jadi, R / W secara langsung terhubung ke ground.
Kita tidak perlu harus masukan data melalui, sehingga semua pin output yang
digunakan dalam aplikasi kita. Data pin LCD yang terhubung ke pin data port.
Strobe sinyal (Pin 1 dari konektor D25) diberikan ke E (Pin 6 LCD), Pilih
printer (Pin 17 dari D25) terhubung ke RS (pin 4 dari LCD). [1]
Gambar 7. Rangkaian Modul LCD Dengan
DB25 [4]
Pada
gambar 7, modul LCD dihubungkan ke port LPT menggunakan D25 konektor male. Nomor pin 3 dari LCD adalah untuk
menyesuaikan kontras, dihubungkan sedemikian rupa sehingga dapat bervariasi
dari 0V ke 5V.
Gambar
8. LCD Dalam Posisi ON [4]
Tabel berikut menjelaskan
bagaimana untuk menulis kata-kata control Ketika RS = 0 dan R / W = 0, data
dalam pin D0 untuk D7 akan memiliki arti sebagai berikut.
Tabel 4. Deskripsi Kontrol
LCD [4]
LISTING PROGRAM
#include <dos.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#define PORTADDRESS 0x378 /* Enter Your Port Address Here */
#define DATA PORTADDRESS+0
#define STATUS PORTADDRESS+1
#define CONTROL PORTADDRESS+2
void lcd_init(void);
void lcd_write(char char2write);
void lcd_putch(char char2write);
void lcd_puts(char * str2write);
void lcd_goto(int row, int column);
void lcd_clear(void);
void lcd_home(void);
void lcd_cursor(int cursor);
void lcd_entry_mode(int mode);
void main(void)
{
#include <string.h>
#include <conio.h>
#include <time.h>
#define PORTADDRESS 0x378 /* Enter Your Port Address Here */
#define DATA PORTADDRESS+0
#define STATUS PORTADDRESS+1
#define CONTROL PORTADDRESS+2
void lcd_init(void);
void lcd_write(char char2write);
void lcd_putch(char char2write);
void lcd_puts(char * str2write);
void lcd_goto(int row, int column);
void lcd_clear(void);
void lcd_home(void);
void lcd_cursor(int cursor);
void lcd_entry_mode(int mode);
void main(void)
{
lcd_init();
lcd_goto(1,1);
lcd_puts("Welcome To");
lcd_goto(1,0);
lcd_puts("electroSofts.com");
while(!kbhit() ) //wait until a key is pressed...
{}
lcd_goto(1,1);
lcd_puts("Welcome To");
lcd_goto(1,0);
lcd_puts("electroSofts.com");
while(!kbhit() ) //wait until a key is pressed...
{}
}
void lcd_init()
{
void lcd_init()
{
outportb(CONTROL,
inportb(CONTROL) & 0xDF);
//config data pins as output
outportb(CONTROL, inportb(CONTROL) | 0x08);
//RS is made high: control (register select)
lcd_write(0x0f);
delay(20);
lcd_write( 0x01);
delay(20);
lcd_write( 0x38);
delay(20);
//config data pins as output
outportb(CONTROL, inportb(CONTROL) | 0x08);
//RS is made high: control (register select)
lcd_write(0x0f);
delay(20);
lcd_write( 0x01);
delay(20);
lcd_write( 0x38);
delay(20);
}
void lcd_write(char char2write)
{
void lcd_write(char char2write)
{
outportb(DATA,
char2write);
outportb(CONTROL,inportb(CONTROL) | 0x01); /* Set Strobe */
delay(2);
outportb(CONTROL,inportb(CONTROL) & 0xFE); /* Reset Strobe */
delay(2);
outportb(CONTROL,inportb(CONTROL) | 0x01); /* Set Strobe */
delay(2);
outportb(CONTROL,inportb(CONTROL) & 0xFE); /* Reset Strobe */
delay(2);
}
void lcd_putch(char char2write)
{
void lcd_putch(char char2write)
{
outportb(CONTROL,
inportb(CONTROL) & 0xF7);
//RS=low: data
lcd_write(char2write);
//RS=low: data
lcd_write(char2write);
}
void lcd_puts(char *str2write)
{
void lcd_puts(char *str2write)
{
outportb(CONTROL,
inportb(CONTROL) & 0xF7);
//RS=low: data
while(*str2write)
lcd_write(*(str2write++));
//RS=low: data
while(*str2write)
lcd_write(*(str2write++));
}
void
lcd_goto(int row, int column)
{
{
outportb(CONTROL,
inportb(CONTROL) | 0x08);
if(row==2) column+=0x40;
/* Add these if you are using LCD module with 4 columns
if(row==2) column+=0x14;
if(row==3) column+=0x54;
*/
lcd_write(0x80 | column);
if(row==2) column+=0x40;
/* Add these if you are using LCD module with 4 columns
if(row==2) column+=0x14;
if(row==3) column+=0x54;
*/
lcd_write(0x80 | column);
}
void lcd_clear()
{
void lcd_clear()
{
outportb(CONTROL,
inportb(CONTROL) | 0x08);
lcd_write(0x01);
lcd_write(0x01);
}
void lcd_home()
{
{
outportb(CONTROL,
inportb(CONTROL) | 0x08);
lcd_write(0x02);
lcd_write(0x02);
}
void lcd_entry_mode(int
mode)
{
{
/*
if you dont call this function, entry mode sets to 2 by default.
mode: 0 - cursor left shift, no text shift
1 - no cursor shift, text right shift
2 - cursor right shift, no text shift
3 - no cursor shift, text left shift
*/
outportb(CONTROL, inportb(CONTROL) | 0x08);
lcd_write(0x04 + (mode%4));
if you dont call this function, entry mode sets to 2 by default.
mode: 0 - cursor left shift, no text shift
1 - no cursor shift, text right shift
2 - cursor right shift, no text shift
3 - no cursor shift, text left shift
*/
outportb(CONTROL, inportb(CONTROL) | 0x08);
lcd_write(0x04 + (mode%4));
}
void lcd_cursor(int cursor)
{
void lcd_cursor(int cursor)
{
/*
set cursor: 0 - no cursor, no blink
1 - only blink, no cursor
2 - only cursor, no blink
3 - both cursor and blink
*/
outportb( CONTROL, inportb(CONTROL) | 0x08 );
lcd_write( 0x0c + (cursor%4));
set cursor: 0 - no cursor, no blink
1 - only blink, no cursor
2 - only cursor, no blink
3 - both cursor and blink
*/
outportb( CONTROL, inportb(CONTROL) | 0x08 );
lcd_write( 0x0c + (cursor%4));
}
Dan Output Program Seperti Berikut :

Gambar 8. Tampilan Keluaran [4]
Referensi
[1] www.beyondlogic.org/spp/parallel.html
[3] http://bugclub.org/beginners/hardware/centronics.html
[4] http://electrosofts.com/parallel/index.html
Tidak ada komentar:
Posting Komentar