Interfacing
Interfacing
data di komputer untuk mentransmisi 8 bit data dalam sekali detak. Standar port paralel yang baru ialah IEEE 1284 dimana dikeluarkan tahun 1994. Standar ini mendefinisikan 5 mode operasi sebagai berikut : 1. 2. 3. 4. 5. Mode kompatibilitas mode nibble mode byte mode EPP (enhanced parallel port) mode ECP (Extended capability port)
Tujuan dari standar yang baru tersebut ialah untuk mendesain driver dan peralatan yang baru yang kompatibel dengan peralatan lainnya serta standar paralel port sebelumnya (SPP) yangn diluncurkan tahun 1981. Mode Compatibilitas, nibble dan byte digunakan sebagai standar perangkat keras yang tersedia di port paralel orisinal dimana EPP dan ECP membutuhkan tambahan hardware dimana dapat berjalan dengan kecepatan yang lebih tinggi. Mode kompatibilitas atau (Mode Centronics ) hanya dapat mengirimkan data pada arah maju pada kecepatan 50 kbytes per detik hingga 150 kbytes per detik. Untuk menerima data, anda harus mengubah mode menjadi mode nibble atau byte. Mode nibble dapatmenerima 4 bit (nibble) pada arah yang mundur, misalnya dari alat ke computer. parallel untuk Mode byte menggunakan fitur bi-directional
menerima
byte
(8
bit)
data
pada
arah
mundur.
IRQ
(Interrupt Request ) pada port paralel biasanya pada IRQ5 atau IRQ7. Port paralel Extend dan Enhanced menggunakan hardware tambahan untuk membangkitkan dan mengatur handshaking. Untuk mengeluarkan 1 byte ke printer menggunakan mode kompatibilitas, software harus : 1. 2. menulis byte ke data port cek untuk melihat apakah printer sibuk, jika sibuk, ia tidak akan menerima data, sehingga data yang telah ditulis akan hilang. 3. buat strobe (pin 1) rendah. Ini memberitahukan printer bahwa data yang benar telah berada di line data 4. buat strobe tinggi lagi setelah menunggu sekitar 5 mikrodetik setelah membuat strobe low. Hal ini membatasi kecepatan data. Sedangkan EPP dan ECP
mengizinkan hardware mengecek jika printer sibuk dan mengeluarkan sinyal strobe atau handshaking lainnya. Ini berate hanya 1 instruksi I/O yang harus juga dilakukan mempunyai yang akan meningkatkan kecepatan Port ECP dapat digeser tanpa menggunakan instruksi I/O. Protokol EPP mempunyai 4 macam siklus transfer dta yang berbeda yaitu : 1. 2. Siklus baca data (Data read) Siklus baca alamat (Address Read)
3. 4.
Siklus tulis data (data write) siklus tulis alamat (address write) Siklus data digunakan untuk mentrasfer data antara host dan
peripheral. Siklus alamat digunakan untuk mengirimkan alamat, saluran (channel) atau informasi perintah dan control. Berikut ialah tabel nama pin dari konekter DB25 dan Centronics dengan jumlah konektor 34. DB25 ialah konektor yang umum digunakan di computer sebagai port paralel , sedangkan konektor Centronics umum ditemukan di printer. IEEE 1284 ialah standar yang menentukan 3 konektor berbeda yang dapat digunakan dengan port paralel, yaitu1284 tipe A ialah konektor DB25 yang dapat ditemukan di hampir semua komputer, 1284 tipe B ialah konektor Centronics 36 pin yang umum ditemukan di printer, IEEE 1284 type C ialah konektor 36 pin seperti Centronics, tetapi ukurannya lebih kecil dan lebih memuaskan. Tabel Nama pin dari konektor parallel port DB 25 dan Centronics Pin Pin SPP Signal Arah In/out Register Hardware nStrobe Data 0 Data 1 Data 2 Data 3 Data 4 Data 5 Data 6 In/Out Out Out Out Out Out Out Out Control Data Data Data Data Data Data Data di invert Ya
DB25 Centronics 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8
9 10 11 12 13 14 15 16 17
9 10 11 12 13 14 32 31 36
Data 7 nAck Busy Paper-Out / Paper-End Select nAutoLinefeed nError / nFault nInitialize nSelectPrinter / nSelect-In Ground
Ya
Ya
Ya
18 25
19-30
Gnd
Untuk mengeluluarkan data di port parallel, anda gunakan fungsi outport (8 bit ) dan outportb(16 bit) sebagai berikut : //Program menggunakan bahasa C untuk pengendali lampu led di port paralel #include <conio.h> #include <stdio.h> #include <stdlib.h> int main() { outport(0x378,0);//lampu led mati sleep(1); //tunda 1 detik
outport(0x378,1); //lampu led hidup sleep(1); return 0; } //Program menggunakan bahasa Visual C++ untuk pengendali lampu led di port paralel #include <conio.h> #include <stdio.h> #include <stdlib.h> int main() { _outp(0x378,0); // model visual C++ untuk outport _sleep(1000); _outp(0x378,1); _sleep(1000); return 0; } Jika anda ingin menggunakan Bahasa Visual Basic, maka Anda harus mengimport file inpout32.dll ke direktori c:\windows, c:\windows\system dan default direktori program anda untuk memastikan file ini dapat ditemukan , file .dll ini dapat Anda temukan di widodo.com/downloads/downloads.html.
Berikut contoh kodenya : Private Declare Function Inp Lib "inpout32.dll" _ Alias "Inp32" (ByVal PortAddress As Integer) As Integer Private Declare Sub Out Lib "inpout32.dll" _ Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)Dim Port1 As Integer Private Sub Command1_Click() Port1 = 888 Out Port1, 1 End Sub Private Sub Command2_Click() Port1 = 888 Out Port1, 0 End Sub
Gambar
berikut
contoh
penggunakan
port
paralel
untuk
mengendalikan 5 buah 7 segment menggunakan IC 74LS244 dan 75492. Perlu diketahui bahwa port control di port paralel menggunakan jenis open kolektor, dimana jika diukur dnegan voltmeter, maka output port control akan selalu bernilai tinggi (5V). Yang dibutuhkan di sini ialah kecerdikan anda di dalam membuat program , jika dilihat dari gambar, 7 segment membutuhkan 7 input yang berasal dari 74LS244. Sedangkan untuk memilih 7 segment mana yang aktif Anda cukup memberikan pulsa ke pin IC 75492 yang sesuai. Alamat port paralel umumnya 378H, Jika anda menggunakan bahasa Pascal untuk mengeluarkan data ke port paralel berikut contoh kodenya : Prosedure lampu_hidup_naik; Begin I:=1; repeat Port[$378]:=I; I:=I*2; until I>255; End; Jika anda ingin menggunakan bahasa C, akan lebih baik alamat port anda definisikan sebagai berikut #define PORT 0x378
Centronics Centronics ialah standar transfer data dari komputer ke printer .Berikut diagram dari protokol Centronics yang telah disederhanakan.
Data dikirim ke pin 2 hingga 7. Komputer akan mengecek apakah printer sibuk. Jika printer sibuk , maka line busy haruslah berlogika 0. Program lalu mengeluarka nsinyal strobe, menunggu sekitar 1uS, dan menonaktifkan sinyal strobe . Data dibaca oleh printer/peripheral cepat Fast pada saat Mode, ujung dimana strobe. Pada mengizinkan model hardware port Extended , Anda akan memperoleh Mode Centronics yang Centronics
melakukan seluruh handshaking. Yang harus dilakukan oleh program ialah menulsi data ke port I/O. Hardware akan mengecek apakah printer sibuk, akan mengeluarkan sinyal strobe. Mode ini umumnya tidak mengecek sinyal nAck . Alamat Port Port Paralel mempunyai 3 alamat seperti pada tabel 6.2 . 3BCH ialah alamat dasar yang diperkenalkan sejak munculnya port Paralel pada kartu video yang kemudian tidak digunakan lagi . LPT1 ialah line printer dengan alamat 378h, lalu LPT2 dengan alamat 278H meskipun alamat ini dapat dirubah. Saat ini, alamat 378H dan 278H umumnya digunakan sebagai alamat port Paralel . Tabel Alamat port paralel Alamat 3BCH - 3BFH Penjelasan Digunakan untuk paralel port di kartu video, tidak mendukung 378H - 37FH 278H - 27FH Ketika komputer alamat ECP Alamat untuk LPT 1 Alamat untuk LPT 2 dihidupkan, BIOS (Basic Input/Output
System) akan menentukan jumlah port yang anda miliki dan mengeset nama LPT1, LPT2 & LPT3 ke masing-masing port tersebut. BIOS pertama kali mencari alamat 3BCH. Jika parallel port ditemukan di sana,BIOS akan mengeset dengan nama LPT1, lalu mencari alamat lainnya yaitu 378H.
Berikut
contoh
program
menerima
data
dari
port paralel , dimana base alamatnya ialah 379H.: #include <stdio.h> #include <dos.h> #include <conio.h> /*****************************************/ /*membaca input data dari port paralel */ /*****************************************/ int Read_Input() {int Byte; Byte=inportb(0x379); return Byte;} void main (void) {int PP_Input; clrscr(); PP_Input = Read_Input; printf("%d",var); getch();} Ketika BIOS mengeset alamat ke peralatan printer
Anda, ia menyimpan alamat pada lokasi tertentu di memory, seperti pada Tabel. Alamat 0000:040E pada BIOS Data Area mungkin digunakan sebagai Extended Bios Data Area di PS/2 dan BIOS yang lebih baru . Tabel Alamat LPT di BIOS Data Area
Fungsi LPT1's Base Address LPT2's Base Address LPT3's Base Address LPT4's Base Address (Note 1)
Tabel diatas menampilkan alamat dimana kita dapat mencari alamat port printer pada BIOS Data Area. Tiap alamat membutuhkan 2 byte. Kode berikut ialah contoh program pencarian alamat port printer di komputer Anda. #include <stdio.h> #include <dos.h> void main(void) { unsigned int far *ptraddr; /* Pointer ke lokasi alamat port */ unsigned int address; int a; ptraddr=(unsigned int far *)0x00000408; for (a = 0; a < 3; a++) { address = *ptraddr; if (address == 0) printf(" port tidak ditemukan di LPT%d \n",a+1); else printf("Alamat yang diset di LPT%d ialah %Xh\n",a+1,address); *ptraddr++; /* alamart Port */
port paralel menggunakan keluarga IC 74LS, meskipun sekarang sudah ada IC ASIC (Application Specific Integrated Circuits).
Port non bi-direksional dibuat menggunakan 74LS374. port bidireksional menggunakan bit control 5 yang dihubungkan ke 74LS374 sehingga keluarannya dapat dimatikan. Pada saat port paralel ini kita set seperti ini, maka data yang kita tulis ke register data paralel port tidak akan sampai ke DB25 karena 374 dalam keadaan tidak menghantar. Menggunakan Port Paralel untuk 8 bit input
Jika paralel port anda tidak mendukung mode bi-direksional, Anda dapat memasukkan maksimum 9 bit pada 1 waktu. Untuk melakukan ini anda dapat menggunakan 5 input line dari port Status dan 4 input (open collector) dari port control. Dengan skema seperti gambar 6.3, 4 bit register status difungsikan sebagai 4 bit MSB pertama . Register control menjadi 4 bit LSB terakhir. Pin Busy ialah MSB dari semuanya dan LSB 4 bit pertama ialah Select. Untuk mode nibble, akan diabca 8 bit dengan menngunakan parallel port tanpa mengubahnya ke dalam modus balik, artinya tanpa memerlukan pengesetan bit ke 5 dari register control . Mode ini diperkenalkan oleh Hewlett Packard sebelum IBM memperkenalkan port paralel yang bidireksional.
Berikut contoh program C untuk mengontrol 8 buah alat melalui penekanan tombol keyboard :
/* */
Program
untuk
mengontrol
peralatan
menggunakan
port paralel . Alat dikontrol dengan menekan tombol 1-8 di keyboard. #include<dos.h> #include<stdio.h> #include<conio.h> #define PORT 0x378 /* alamat port paralel */ main() { char val=0,key=0; char str1[]="ON "; char str2[]="OFF"; char *str; clrscr(); printf("Tekan key yang sesuai untuk menghidupkan /mematikan alat \n\n"); printf("Dimana alat ke 1 terhubung ke D0 dari port paralel , begitu seterusnya \n\n"); printf("Tekan \"x\" untuk keluar\n\n"); gotoxy(1,8); printf("Device1:OFF Device2:OFF Device3:OFF Device4:OFF\n"); printf("Device5:OFF Device6:OFF Device7:OFF Device8:OFF"); while(key!='x' && key!='X') //Jika yang ditekan bukan X { gotoxy(1,12);
printf("Nilai dalam format hex telah dikirim ke port:"); key=getch(); switch(key){ case '1': //jika kita menekan 1 di keyboard gotoxy(9,8); val=(val&0x01)?(val&(~0x01)):val|0x01; str=(val&0x01)?str1:str2; printf("%s",str); outportb(PORT,val); gotoxy(1,13); printf("%x",val); break; case '2': gotoxy(21,8); val=(val&0x02)?(val&(~0x02)):val|0x02; str=(val&0x02)?str1:str2; printf("%s",str); outportb(PORT,val); gotoxy(1,13); printf("%x",val); break; case '3': gotoxy(33,8); val=(val&0x04)?(val&(~0x04)):val|0x04; str=(val&0x04)?str1:str2; printf("%s",str); outportb(PORT,val);
gotoxy(1,13); printf("%x",val); break; case '4': gotoxy(45,8); val=(val&0x08)?(val&(~0x08)):val|0x08; str=(val&0x08)?str1:str2; printf("%s",str); outportb(PORT,val); gotoxy(1,13); printf("%x",val); break; case '5': gotoxy(9,9); val=(val&0x10)?(val&(~0x10)):val|0x10; str=(val&0x10)?str1:str2; printf("%s",str); outportb(PORT,val); gotoxy(1,13); printf("%x",val); break; case '6': gotoxy(21,9); val=(val&0x20)?(val&(~0x20)):val|0x20; str=(val&0x20)?str1:str2; printf("%s",str); outportb(PORT,val);
gotoxy(1,13); printf("%x",val); break; case '7': gotoxy(33,9); val=(val&0x40)?(val&(~0x40)):val|0x40; str=(val&0x40)?str1:str2; printf("%s",str); outportb(PORT,val); gotoxy(1,13); printf("%x",val); break; case '8': gotoxy(45,9); val=(val&0x80)?(val&(~0x80)):val|0x80; str=(val&0x80)?str1:str2; printf("%s",str); outportb(PORT,val); gotoxy(1,13); printf("%x",(unsigned char)val); break; } } } Program diatas segera akan mengeluarkan data ke port paralel ketika user menekan tombol keyboard menggunakan fungsi case, dan
menggunakan fungsi outportb untuk mengendalikan port . Fungsi gotoxy untuk menempatkan string pada posisi x dan y yang telah ditentukan, serta fungsi break untuk berhenti, berikut potongoan kodenya : case '1': //jika kita menekan 1 di keyboard gotoxy(9,8); val=(val&0x01)?(val&(~0x01)):val|0x01; str=(val&0x01)?str1:str2; printf("%s",str); outportb(PORT,val); gotoxy(1,13); printf("%x",val); break; Untuk mendeteksi alamat port printer apa saja yang telah diset pada port parallel, gunakan perintah debug sebagai berikut :
Gambar Menggunakan perintah debug untuk melihat alamat LPT1 Dari gambar diatas terlihat LPT1 diset dialamat 378H dan ada alamat lainnya yang telah diset juga.
sampel program (saya menggunakan Delphi versi 7) untuk ADC 0804 di port parallel(sumber :Amran) procedure TForm1.Timer1Timer(Sender: TObject); begin asm push dx mov dx,$37A mov al,$32 out dx,al pop dx end; begin asm push dx mov dx,$37A mov al,$36 out dx,al pop dx end; begin asm push dx mov dx,$37A //alamat ofset control parallel //alamat ofset control parallel //isi dengan 36 {0010 0100} aktifkan pin no.3 ADC 804 //alamat ofset control parallel //isi dengan 32 {0010 0000} enable Bi-Directional
mov al,$37 out dx,al pop dx end; begin asm push dx mov dx,$378 in al,dx mov data,al pop dx end; begin asm push dx mov dx,$37A mov al,$36 out dx,al pop dx end;
//alamat ofset control parallel //isi dengan 36 {0010 0100} disable ADC Output
end; end;
Menggunakan INT 17H INT 17H digunakan untuk mencetakan karakter ke printer, berikut contoh assembly untuk mencetak karakter A di printer MOV AH,0 MOV DX,0 MOV AL, 41H INT 17H ;cetak pilihan karakter ;pilih LPT1 ;kode ASCII untuk A ; panggil BIOS
Konsep Komunikasi serial pada Komputer Komunikasi serial ialah pengiriman data secara serial (data dikirim satu persatu secara berurutan), sehingga komunikasi serial jauh lebih lambat daripada komunikasi paralel.. Serial port lebih sulit ditangani karena peralatan yang dihubungkan ke serial port harus berkomunikasi dengan menggunakan transmisi serial, sedang data di computer diolah secara paralel. Oleh karena itu data dari dan ke serial port harus dikonversikan ke dan dari bentuk paralel untuk bisa digunakan. Menggunakan hardware, hal ini bisa dilakukan Receiver oleh Universal Asyncronous
Transmimeter(UART), kelemahannya kita butuh software yang menangani register UART yang cukup rumit dibanding pada parallel port.Kelebihan dari komunikasi serial ialah panjang kabel jauh dibanding paralel, karena serial port mengirimkan logika 1 dengan kisaran tegangan 3 V hingga 25 V dan logika 0 sebagai +3 Volt hingga +25 V sehingga kehilangan daya karena panjangnya kabel bukan masalah utama. Bandingkan dengan port paralel yang menggunakan level TTL berkisar dari 0 V untuk logika 0 dan +5 Volt untuk logika 1. Berikut contoh bentuk sinyal komunikasi serial . Umumnya sinyal serial diawali dengan start bit, data bit dan sebagai pengecekan data menggunakan parity bit serta ditutup dengan 2 stop bit. Level tengangan -3 V hingga +3 V dianggap sebagaiundetermined region.
Gambar Bentuk sinyal serial Komunikasi melalui serial port adalah asinkron, yakni sinyal detak tidak dikirim bersama dengan data. Setiap word disinkronkan dengan start bit, dan sebuah clock internal di kedua sisi menjaga bagian data saat pewaktuan (timing).
Peralatan Komunikasi Serial Hardware pada komunikasi serial port dibagi menjadi 2 (dua ) kelompok yaitu Data Communication Equipment (DCE) dan Data Terminal Equipment (DTE). Contoh dari DCE ialah modem, plotter, scanner dan lain lain sedangkan contoh dari DTE ialah terminal di komputer. Spesifikasi elektronik dari serial port merujuk pada Electronic Industry Association (EIA) : 1. 2. 3. 4. 5. Space (logika 0) ialah tegangan antara + 3 hingga +25 V. Mark (logika 1) ialah tegangan antara 3 hingga 25 V. Daerah antara + 3V hingga 3V tidak didefinisikan /tidak Tegangan open circuit tidak boleh melebihi 25 V. Arus hubungan singkat tidak boleh melebihi 500mA.
terpakai
Konektor port serial terdiri dari 2 jenis, yaitu konektor 25 pin (DB25 dan 9 pin (DB9) yang berpasangan (jantan dan betina).Bentuk dari konektor DB-25 sama persis dengan port paralel.
Alamat Port dan IRQ Alamat standar serial port adalah sebagaimana tampak dalam Tabel 12.2. Hal ini masih dengan catatan bahwa mungkin ada komputer yang memiliki alamat port dan IRQ yang berbeda dengan alarnat di bawah ini, misalnya pada komputer PS/2 yang menggunakan Micro Channel Bus. Tabel Alamat dan IRQ port serial Nama COM 1 Alamat 3F8 IRQ 4
3 4 3
Konverter Logika RS-232 Jika peralatan yang kita gunakan menggunakan logika TTL maka sinyal serial port harus kita konversikan dahulu ke pulsa TTL sebelum kita gunakan, dan sebaliknya sinyal dari peralatan kita harus dikonversikan ke logika RS-232 sebelum di-inputkan ke serial port. Konverter yang paling mudah digunakan adalah MAX-232. Di dalam IC ini terdapat Charge Pump yang akan membangkitkan +10 Volt dan -10 Volt dari sumber +5 Volt tunggal. Dalam IC DIP (Dual In-line Package) 16 pin (8 pin x 2 baris) ini terdapat 2 buah transmiter dan 2 receiver. Pemrograman Port Serial Komputer Port serial sering digunakan untuk interfacing komputer dan mikrokontroler, karena kemampuan jarak pengiriman data dibandingkan port paralel. Berikut contoh program assembly untuk komunikasi serial antara 2 PC. Untuk komunikasi ini, anda cukup menghubungkan : 1. 2. 3. 4. Pin TxD ke pin RxD computer lain Pin RXD dihubungkan ke pin TxD komputer lain RTS dan CTS dihubung singkat DSR dan DTR dihubung singkat
5.
Listing Program 1. Komunikasi Serial antara 2 PC (SerialPC.asm) TITLE Komunikasi data serial antara 2 PC .model small .stack .data Message db Komunikasi serial melalui Com2,4800,tanpa parity, 1 stop, 8 bit data.,0ah,0dh db key apa saja ditekan akan dikirim ke komputer lain ,0ah,0dh db Tekan ESC untuk keluar,$ .code main proc mov ax,@data mov,ds,ax mov ah,09 mov dx, offset message int 21h ;inisialisasi com2 mov ah,0 mov dx,1 mov al,0c3h int 14h ;mengcek key yang ditekan dan dikirim ke com2 untuk transfer data again: mov ah,01 ;cek key yang ditekan menggunakan int 16h, ah=01 ;inisialisasi port com ;com2 ;4800,tanpa parity,1 stop, 8 bit data
;jika ZF=1, tidak ada key yang ditekan ;jika tidak ada key cek port port ;ya, ada key yang ditekan, ambil ! ;kita harus menggunakan int 16h 2 kali, untuk keuda
;dengan ah=0 untuk mengambil karakter. al=ascii karakter yang ditekan cmp al,1bh Je exit Mov ah,1 Mov dx,01 Int 14h ;cek com2 untuk melihat apakah ada karater, jika ada ambil dan tampilkan next: mov ah,03 mov dx,01 int 14h and ah,01 cmp ah,01 jne again mov ah,02 Mov dx,01 Int 14h Mov ah,02 Int 21h Jmp again Exit: mov ah, 4ch Int 21h ;terus memonitor keyboard ;keluar ke DOS ;ambil ;dl mempunyai karakter yang akan ditampilkan Mov dl,al ;dan tampilkan menggunakan int 21h ;ah mempunyai status com, mask seluruh bit kecuali D0 ;cek D0 untuk melihat jika ada sebuah karakter ;tidak ada data, untuk memonitor keyboard ;ya, com2 mempunyai data, ambil! ;ambil status com2 ;apakah key ESC? ;ya exit ;tidak, kirim karakter ke com2
Main
menggunakan C dengan lebih mudah . Berikut program komunikasi data serial menggunakan fungsi BIOSCOM. Listing Program 2. Komunikasi serial menggunakan C (SerialPC.c) //Program komunikasi serial menggunakan fungsi bioscom //Dibuat oleh Widodo Budiharto //nilai port 0 untuk COM1, 1 untuk COM2 dan seterusnya. //8 bit teratas dari return value ialah untuk status //8 bit terendeah tergantung pada perintah yang telah ditentukan //perintah dapat berisi : // 0 | Set parameter komunikasi ke nilai dalam abyte // 1 | Mengirim karakter dalam abyte // 2 | Menerima sebuah karakter dari jalur komunikasi // 3 | Kembalikan status saat ini dari port komunikasi // abyte ialah kombinasi dari bit berikut // // // // // // 0x00 | 1 stop bit 0x00 | No parity 0x60 0xA0 0x04 | 2 stop bits 0x80 0x02 | 7 data bits 0x03 | 8 data bits 0x00 0x20 110 baud 150 baud 0x40 300 baud 600 baud 1200 baud 2400 baud
// //
0xC0
//Sebagai contoh, 0xEB //(0xE0|0x08|0x00|0x03) untuk abyte akan menset //port komunikasi ke 9600 baud, odd parity,1 stop bit, dan 8 bit data //bioscom menggunakan BIOS 0x14 interrupt. //Menyertakan header file yang dibutuhkan #include <bios.h> #include <conio.h> //definisi port #define COM1 #define TRUE #define FALSE //definisi settings #define SETTINGS ( 0x80 | 0x02 | 0x00 | 0x00) int main(void) { int in, out, status, DONE = FALSE; bioscom(0, SETTINGS, COM1);//3 parameter dari bioscom cprintf("Komunikasi serial menggunakan BIOSCOM, tekan [ESC] untuk keluar \n"); while (!DONE) { 0 1 0 #define DATA_READY 0x100
status = bioscom(3, 0, COM1); if (status & DATA_READY) if ((out = bioscom(2, 0, COM1) & 0x7F) != 0) putch(out); if (kbhit()) { if ((in = getch()) == '\x1B') DONE = TRUE; bioscom(1, in, COM1); } } return 0; } Jika Anda ingin membuat aplikasi menggunakan bahasa Visual Basic .NET, berikut contohnya : Program Inisialisasi dan membuka port komunikasi Membuat instance Dim moRS232 as New Rs232() With moRs232 .Port = 1 .BaudRate = 2400 .DataBit = 8 bit .StopBit = Rs232.DataStopBit.StopBit_1 .Parity = Rs232.DataParity.Parity_None ' 1 Stop bit ' No Parity 'Menggunakan COM1 ' baud rate sebesar 2400 8 data
Anda dapat menambahkan control dari jalur DTR/RTS setelah port dibuka moRS232.Dtr = True moRS232.Rts = True Mengirim data moRS232.TxData = txtTx.Text moRS232.Tx() Menerima Data moRS232.Rx(10) 'Ambil 10 byte dari buffer serial Dim sRead as String=moRs232.RxData Untuk informasi lebih lanjut mengenai kode diatas anda dapat mengunjungi http://www.codeworks.it/net/VBNetRs232.htm Penerapan Port Serial Komputer Berbagai aplikasi elektronika dapat berkomunikasi dengan port serial komputer. Program berikut akan menampilkan karakter ke LCD menggunakan port serial . IC MAX 232 ialah IC yang umum digunakan sebagai RS232 Converter, meskipun dapat anda gantikan dengan rangkaian transistor.
Listing Program Interfacing LCD dengan port Serial Komputer (LCDSerial.c) #include <dos.h> #include <stdio.h> #include <conio.h> #define PORT1 0x3F8 /* alamat port*/ /* Definisi alamat base port serial */ /* COM1 0x3F8 /* COM2 0x2F8 /* COM3 0x3E8 /* COM4 0x2E8 void main(void) */ */ */ */
{ int c; int count; char init[] = { 0x0F, 0x01, 0x38 }; /* 0x0F - Init Display */ /* 0x01 - Clear Display */ /* 0x38 - Dual Line / 8 Bits */ outportb(PORT1 + 1 , 0x0); /* mematikan interupt - Port1 */ outportb(PORT1 + 3 , 0x80); /* SET DLAB ON */ outportb(PORT1 + 0 , 0x0C); /* Set Baud rate */ /* /* /* /* outportb(PORT1 + 1 , 0x00); outportb(PORT1 + 3 , 0x03); /* 8 Bits, No Parity, 1 Stop Bit */ outportb(PORT1 + 2 , 0xC7); /* FIFO Control Register */ outportb(PORT1 + 4 , 0x0B); /* Turn on DTR, RTS, and OUT2 */ /* Register Select (DTR) */ outportb(PORT1 + 4 , (inportb(PORT1 + 4) | 0x01)); /* 0 = Instruction Register */ for (count = 0; count < 3; count++) { outportb(PORT1, init[count]); delay(20); } /* kirim Init Data Bytes */ /* delay untuk INIT */ 0x06 = 19,200 BPS */ 0x0C = 9,600 BPS */ 0x18 = 4,800 BPS */ 0x30 = 2,400 BPS */
/* Register Select (DTR) */ /* 1 = Data Register */ outportb(PORT1 + 4 , (inportb(PORT1 + 4) & 0xFE)); printf("\nContoh program LCD Serial. Tekan ESC untuk keluar \n"); do { if (kbhit()){ c = getch(); outportb(PORT1, c); printf("%c",c); } } while (c !=27); }
Latihan:
1. Buat program yang dapat mengontrol stepper motor seperti gambar berikut :
Gambar Pengendali motor stepper dengan 89C2051 dan port serial 2. Buat program untuk komunikasi serial antara 2 komputer menggunakan bahasa C, namun mengkombinasikan dengan bahasa assembly sebagai berikut : //Program komunikasi serial antara 2 PC //00H bios function (AL register) //Register Dx 0->com1, 1->com2, 2->com3, 3->com4 //Konfigurasi: 9600 bd,no parity,2 stop bits dan 8 data bit //AL register value is 1 1 1 0 0 1 1 1 -> 0xE7 #include <stdio.h> #include <process.h> #include <conio.h> #include <dos.h> #include <bios.h>
#define TRUE 1 #define PARAM 0xA7 #define COM1 0 #define COM2 1 void init_port(void); char state_port(void); void send_byte(unsigned char); unsigned char read_byte(void); void keyb(void); int tecla = 1; void main ( void ) { unsigned char read_com; unsigned char read_kb; clrscr(); init_port(); while(read_kb != 'c') { read_kb=getch(); send_byte(read_kb); read_com=read_byte(); if(read_com!=0){printf("%c",read_com);} }
} void init_port() { union REGS regs; regs.h.ah = 0x00; regs.x.dx = COM2; regs.h.al = PARAM; int86( 0x14, ®s, ®s); } //mengembalikan keadaan port char state_port() { union REGS regs; regs.h.ah = 0x03; regs.x.dx = COM2; int86( 0x14, ®s, ®s); if(regs.h.ah & 0x80) printf("\t EXCEED TIME\n"); if(regs.h.ah & 0x40) printf("\t TSR EMPTY\n"); if(regs.h.ah & 0x20) printf("\t THR EMPTY\n"); if(regs.h.ah & 0x10) printf("\t INTERRUPTION\n"); if(regs.h.ah & 0x08) printf("\t THREAT ERROR\n"); if(regs.h.ah & 0x04) printf("\t PARITY ERROR\n"); if(regs.h.ah & 0x02) printf("\t OVERLOAD ERROR\n"); return (regs.h.ah); } //penanganan keyboard void keyb()
{ union u_type{int a;char b[3];}keystroke;char inkey=0; if(bioskey(1)==0) return; keystroke.a=bioskey(0); inkey=keystroke.b[1]; switch (inkey) { case 1: keyb=0; return; /*ESC*/ default: keyb=15; return; } } //kirim karakter ke port serial void send_byte(unsigned char byte) { union REGS regs; regs.h.ah = 0x01; regs.x.dx = COM2; regs.h.al = byte; int86( 0x14, ®s, ®s); if( regs.h.ah & 0x80) { printf("\t SENDING ERROR "); exit(1); } }
//membaca sebuah karakter dari port serial unsigned char read_byte() { int x,a; union REGS regs; if((estate_port() & 0x01)) { regs.h.ah = 0x02; regs.x.dx = COM2; int86(0x14,®s,®s); if(regs.h.ah & 0x80) { printf("\t Penerimaan data error"); exit(1); } return(regs.h.al);} else { return(0);}}
Pengenalan PPI 8255 Programmable peripheral Interface (PP() 8255 ialah chip antarmuka 24 bit (3 port) yang dapat diprogram sesuai keinginan kita. PPI 8255 merupakan chip yang paling banyak digunakan untuk interfacing komputer yang dihubungkan ke port ISA komputer. Anda juga dapat memesan card PPI 8255 ini melalui
Innovative Electronics dengan harga yang sangat terjangkau, karena umumnya hanya dibutuhkan 1 IC tambahan sebagai address decoder yaitu 74LS688 beserta jumper. Gambar 14.1 ialah pin IC 8255, dimana perlu diingat bahwa pin gnd berada di pin 7 dan Vcc berada di pin ke 26.
Berikut penjelasan masing-masing pin : PA0-PA07 Ini ialah port A yang terdiri dari 8 bit , dapat diprogram sebagai input atau output dengan mode bi-directional input/output. PB0-PB7 Port B ini dapat deprogram sebagai input /output, tetapi tidak dapat digunakan sebagai port bi-directional. PC0-PC7
Port C ini dapat diprogram sebagaiinput/output. Bahkan dapat dipecah menjadi 2 yaitu CU( bit PC4-PC7) dan CL (bit PC0-PC3) yang dapat diprogram sebagai input/output . RD dan WR Sinyal control aktif rendah ini dihubungkan ke 8255. Jika 8255 menggunakan desain peripheral I/O, IOR adan IOW dari system bus dihubungkan ke kedua pin ini. RESET Pin aktif tinggi ini digunakan untuk membersihkan control register. Ketika RESET diaktifkan, seluruh port diinisialisasi sebagai port input. Pada saat CS memilih chip, A0 dan A1 yang memilih port tertentu. 3 pin ini digunakan untuk mengakses port A, B atau C, atau control register sesuai Tabel Tabel Pemilihan port 8255 CS* 0 0 0 0 1 A1 0 0 1 1 x A0 0 1 0 1 X Yang dipilih Port A Port B Port C Control register 8255 tidak dipilih
Pada saat port A, B dan C digunakan sebagai I/), perlu diset juga mode operasi dari port tersebut. Ada 4 mode operasi yang dimiliki 8255 yaitu : 1. Mode 0, ini ialah mode yang paling sederhana, dimana semua port dapat deprogram sebagai input/putput. Pada mode ini seluruh bit sebagai output atau input, tidak ada bit yang dapat dikontrol secara individual. 2. Mode 1, pada mode ini port A dan B dapat digunakan sebagai input atau output dengan kemampuan jabat tangan. Sinyal jabat tangan disediakan oleh bit-bit port C 3. Mode 2, port A dapat digunakan sebagai port bi-directional I/O dengan kemampuan jabat tangan dimana sinyalnya disediakan oleh port C. Port B dapat digunakan sebagai mode I/O sederhana atau mode 1 jabat tangan. 4. Mode BSR ( bit set/reset ). Pada mode ini, hanya bit individual port C yang dapat diprogram Berikut contoh bahasa assembly untuk membuat PPI 8255 dengan port A sebagai input dan Port B dan Port C sebagai output.
PORTA PORTB
PORTC
EQU 52H MOV AL, 90H MOV CNTLREG,AL IN AL, PORTA OUT PORTB, AL OUT PORTC, AL
Contoh
berikut
merupakan
koneksi
8255
dengan
sebuah printer . Program di bawah ini akan menampilkan pesan Selamat mencoba 8255,Menggunakan buku Saya $. Tanda $ menandakan akhir dari pesan
8255 r
Printe
Listing Program Program menampilkan string ke printer (PrinterPPI.asm) DATA_SAYA CR, LF DB Menggunakan buku Saya, CR,LF, $ PA PB PC CWP LF CR EQU 300H EQU 301H EQU 302H EQU 303H EQU 0AH EQU 0DH DB Selamat mencoba 8255,
Dari segmen kode : MOV AL, 10100000B mode 1 MOV DX,CWP OUT DX, AL word MOV AL, 00001101B a ;PC6=1 untuk INT ;DX=303 CW port ; mengirim control ; control PA= out
; menggunakan
MOV SI, OFFSET DATA_SAYA ;S1= data address LAGI: karakter CMP JZ AH, S OVER ;apakah selesai? ; jika ya, keluar MOV AH, [SI] ; ambil sebuah
MOV DX, PC BACK: C AND, AL, 08 tinggi JZ BACK MOV DX, PA DX=300, port data MOV AL, AH OUT DX, AL printer INC SI JMP AGAIN OVER: ; naikkan data pinter ; tetap lakukan ; ke DOS ; dan ;kirim karakter ke ;jika tidak, tetpa mengecek ; jika ya, buat ;apakah INTRa ;DX =302,alamat port C IN AL, DX ;ambil status byte dari port
Gambar di bawah ini memperlihatkan koneksi port paralel dengan PPI 8255.
Pemrograman C untuk PPI 8255 C sangat mendukung pemrograman hardware komputer. Untuk memprogram Bus ISA yang akan berfungsi mengendalikan Kartu PPI (PPI Card) menggunakan bahasa C/C++,, kita menggunakan fungsi outport untuk 8 bit data dan outportb untuk 16 bit data. Berikut tampilan Bus ISA
Berikut contoh program C untuk mengeluarkan data 0-255 di port B dan C, sedangkan port A sebagai input.
Listing Program 2. Program Mengeluarkan data di PPI (PPI.C) //Menyertakan header file #include <stdio.h> #include <conio.h> //mendefinisikan konstanta //symbol 0x menandakan address komputer #define PA 0x300 //port A di alamat 300H
#define PB 0x301 //port B di alamat 301H #define PC 0x302 //port C di alamat 302H #define CW 0x303 //Control Word di alamat 303H void main() { int data=0; int nilai; clrscr(); printf (Program PPI 8255\n) outportb (CW, 0x90);//port A input, port B dan C output //membuat looping data dari 0-255 for (data=0;data<=255;data++) { nilai=inportb (PA); printf (Data yang masuk di port A %d \n, nilai); outportb (PB, data);//mengeluarkan data di port B printf (Mengeluarkan data: %d \n, di port B,data); delay(500); //delay 0.5 detik outportb (PC, data);//mengeluarkan data di port C printf (Mengeluarkan data: %d \n, di port C,data); delay(500); //delay 0.5 detik } getch(); } Koneksi DAC di PPI 8255
Untuk koneksi ke DAC, anda dapat menggunakan IC DAC 8 bit misalnya MC1408 secara langsung .