PC Interfacing

 

 

 

Pengenalan Komunikasi Serial

Pada prinsipnya, komunikasi serial ialah komunikasi dimana pengiriman data dilakukan per bit, sehingga lebih lambat dibandingkan komunikasi parallel seperti pada port printer yang mampu mengirim 8 bit sekaligus dalam sekali detak.  Beberapa contoh komunikasi serial ialah mouse, scanner dan system akuisisi data yang terhubung ke port COM1/COM2.

 

Peralatan Komunikasi Serial

Devais 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. “Space” (logika 0) ialah tegangan antara + 3 hingga +25 V.
  2. “Mark” (logika 1) ialah tegangan antara –3 hingga –25 V.
  3. Daerah antara + 3V hingga –3V tidak didefinisikan /tidak terpakai
  4. Tegangan open circuit tidak boleh melebihi 25 V.
  5. Arus hubungan singkat tidak boleh melebihi 500mA.

 

Komunikasi serial membutuhkan port sebagai saluran data.  Berikut tampilan port serial DB9 yang umum digunakan sebagai port serial

                                      9 pin.jpg (13906 bytes)

Gambar  Port DB9 jantan

9 PIN PIN OUT.GIF (33246 bytes)

                                                Gambar Port DB9 betina

 

 

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. Umumnyua COM1 berada dialamat 3F8H, sedangkan COM2 dialamat 2F8H.

 

Tabel Jenis SInyal RS232 yang umum  digunakan

 

 

 

 
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. Sering juga sebagai buffer serial digunakan chip DS275.

Untuk menghubungkan antara 2 buah PC, biasanya digunakan format null mode, dimana pin TxD dihubungkan dengan RxD pasangan, pin Sinyal ground (5) dihubungkandengan SG di pasangan,  dan masing masing  pin DTR, DSR dan CD dihubung singkat, dan pin RTS dan CTS dihubung singkat di setiap devais.

 

 

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. Pin TxD ke pin RxD computer lain
  2. Pin RXD dihubungkan ke pin TxD komputer lain
  3. RTS dan CTS dihubung singkat
  4. DSR dan DTR dihubung singkat
  5. GND dihubungkan ke GND komputer lain

 

Program  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                ;inisialisasi port com

                mov dx,1                ;com2

                mov al,0c3h           ;4800,tanpa parity,1 stop, 8 bit data

                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

                int 16h                    ;jika ZF=1, tidak ada key yang ditekan

                jz next                     ;jika tidak ada key cek port port

                mov ah,0                ;ya, ada key yang ditekan, ambil !

                int 16h                    ;kita harus menggunakan int 16h 2 kali, untuk keuda kalinya

                ;dengan ah=0 untuk mengambil karakter. al=ascii karakter  yang ditekan

                cmp al,1bh             ;apakah key ESC?

                Je exit                     ;ya exit

                Mov ah,1               ;tidak, kirim karakter ke com2

                Mov dx,01

                Int 14h

                ;cek com2 untuk melihat apakah ada karater, jika ada ambil dan tampilkan

next:        mov ah,03              ;ambil status com2

                mov dx,01

                int 14h

                and ah,01               ;ah mempunyai status com, mask seluruh bit kecuali D0

                cmp ah,01              ;cek D0 untuk melihat jika ada sebuah karakter

                jne again                ;tidak ada data, untuk memonitor  keyboard

                mov ah,02              ;ya, com2 mempunyai data, ambil!

                Mov dx,01

                Int 14h                    ;ambil

                Mov dl,al               ;dan tampilkan menggunakan int 21h

                Mov ah,02             ;dl mempunyai karakter yang akan ditampilkan

                Int 21h

                Jmp again              ;terus memonitor keyboard

Exit:         mov ah, 4ch           ;keluar ke DOS

                Int 21h

Main       endp

                End

 

Anda juga dapat memprogram komunikasi serial antara 2 PC menggunakan C dengan lebih mudah . Berikut program komunikasi data serial menggunakan fungsi BIOSCOM.

 

 Program   Komunikasi serial menggunakan C (SerialC.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   |Sets the communications parameters to the value in abyte.

//   1   | Sends the character in abyte out over the communications line

//   2   | Receives a character from the communications line.

//   3   | Returns the current status of the communications port.

 

//abyte ialah kombinasi dari bit berikut

 

//    0x02 |  7 data bits    0x00     110 baud

//    0x03 |  8 data bits    0x20     150 baud

//                                                0x40     300 baud

//    0x00 |  1 stop bit     0x60     600 baud

//    0x04 |  2 stop bits    0x80    1200 baud

//    0x00 |  No parity      0xA0    2400 baud

//    0x08 |  Odd parity     0xC0    4800 baud

//    0x18 |  Even parity    0xE0    9600 baud

 

//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       0

#define DATA_READY 0x100

#define TRUE       1

#define FALSE      0

//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)

   {

      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,  menggunakan kelas Rs232, berikut contohnya :
 
‘ Program Inisialisasi  dan membuka port komunikasi 

Private Sub btnOpenCom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpenCom.Click

moRS232 = New Rs232() ‘buat ojek serial

                Try

                '// setup parameter koneksi

With moRS232

                .Port = miComPort

                .BaudRate = CInt(txtBaudrate.Text)

                .DataBit = 8

                .StopBit = Rs232.DataStopBit.StopBit_1

                .Parity = Rs232.DataParity.Parity_None

                .Timeout = CInt(txtTimeout.Text)

.WorkingMode = CType(IIf(chkOl.Checked, Rs232.Mode.Overlapped, Rs232.Mode.NonOverlapped), Rs232.Mode)

                btnAsyncTx.Enabled = (.WorkingMode = Rs232.Mode.Overlapped)

                btnAsync.Enabled = (.WorkingMode = Rs232.Mode.Overlapped)

                chkOl.Enabled = False

End With

'// inisialisasi port serial

                moRS232.Open()

                '// Set state of RTS / DTS

                moRS232.Dtr = (chkDTR.CheckState = CheckState.Checked)

                moRS232.Rts = (chkRTS.CheckState = CheckState.Checked)

                Catch Ex As Exception

                MessageBox.Show(Ex.Message, "Error koneksi ", MessageBoxButtons.OK)

                Finally

                                btnCloseCom.Enabled = moRS232.IsOpen

                                btnOpenCom.Enabled = Not moRS232.IsOpen

                                btnTx.Enabled = moRS232.IsOpen

                                btnRx.Enabled = moRS232.IsOpen

                                btnCheck.Enabled = moRS232.IsOpen

                End Try

End Sub

 

Untuk menulis data, gunakan fungsi-fungsi berikut ini :

Private Sub Kirim_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTx.Click

     ‘gunakan fungsi write()

      moRS232.Write(txtTx.Text)

      'moRS232.Write(Chr() & Chr(3) & Chr(0) & Chr(0) & Chr(0) & Chr(16) & Chr(68) & Chr(83))

                                ' Bersihkan textbox

                                txtRx.Text = String.Empty

                                txtRx.Refresh()

                                lbHex.Items.Clear()

                                If chkAutorx.Checked Then Button1_Click(Nothing, Nothing)

End Sub

Untuk membaca data gunakan fungsi-fungsi  Read dan InputStreamString seperti berikut :

 

Try

                ‘gunakan fungsi Read()

                moRS232.Read(CInt(txtBytes2Read.Text))

                txtRx.Text = moRS232.InputStreamString

                txtRx.ForeColor = Color.Black

                txtRx.BackColor = Color.White

                '// Fills listbox with hex values

                Dim aBytes As Byte() = moRS232.InputStream

                Dim iPnt As Int32

                For iPnt = 0 To aBytes.Length - 1

                lbHex.Items.Add(iPnt.ToString & ControlChars.Tab & String.Format("0x{0}",

aBytes(iPnt).ToString("X")))

                Next

Catch Ex As Exception

                txtRx.BackColor = Color.Red

                txtRx.ForeColor = Color.White

                txtRx.Text = "Terjadi error " & Ex.Message & "  data fetched: " & moRS232.InputStreamString

End Try

 

 

Gambar Program Komunikasi Serial VB .NET

 

 

Kita juga dapat menggunakan komponen yang sudah dibuat oleh suatu perusahaan, misalnya PortController.Net yang terdapat pada CD Program, sehingga pemrograman menjadi lebih mudah seperti contoh mebuka dan menulis ke suatu port serial  berikut :

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        myPortController.Open("COM1")

    End Sub

Private Sub SendButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SendButton.Click

        myPortController.Write(SendText.Text)

        SendText.Clear()

    End Sub

Private Sub myPortController_OnDataReceived(ByVal sender As Object, ByVal e As System.EventArgs) Handles myPortController.OnDataReceived

        ReceiveText.AppendText(myPortController.Read())

    End Sub

 

 

 

Jika hanya menggunakan bahasa Visual Basic 6, tempelkan kontrol MSComm1, dan masukkan kode untuk menset MSComm1 dimana memperoleh input dari suatu combobox berikut :

 

MsComm1.commPort=cmbPort.ListIndex +1

MsComm1.Settings=cmbbitspersecond.text

MSComm1.Handshaking=cmbFlowControl.LinstIndex

 

Interfacing Port Paralel

 

Pengenalan  Port Paralel

Port paralel ialah port 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.       Mode kompatibilitas

2.       mode nibble

3.       mode byte

4.       mode EPP (enhanced parallel port)

5.       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 dapat menerima  4 bit (nibble) pada arah yang mundur, misalnya dari alat ke computer. Mode byte  menggunakan fitur bi-directional parallel untuk menerima 1 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.       menulis byte ke data port

2.       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 dilakukan yang akan meningkatkan kecepatan Port ECP juga mempunyai kelebihan menggunakan saluran DMA dan buffer FIFO, jadi data dapat digeser tanpa menggunakan instruksi I/O.

Protokol  EPP mempunyai 4 macam siklus transfer data yang berbeda yaitu :

  1. Siklus baca data (Data read)
  2. Siklus baca alamat (Address Read)
  3. Siklus tulis data (data write)
  4. 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, yaitu 1284 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.

 pinout diagram

 

  Tabel  Nama pin dari konektor parallel port  DB 25 dan Centronics

Pin DB25

Pin Centronics

Sinyal

SPP

Arah  In/out

Register

Hardware di invert

1

1

nStrobe

In/Out

Control

Ya

2

2

Data 0

Out

Data

 

3

3

Data 1

Out

Data

 

4

4

Data 2

Out

Data

 

5

5

Data 3

Out

Data

 

6

6

Data 4

Out

Data

 

7

7

Data 5

Out

Data

 

8

8

Data 6

Out

Data

 

9

9

Data 7

Out

Data

 

10

10

nAck

In

Status

 

11

11

Busy

In

Status

Ya

12

12

Paper-Out / Paper-End

In

Status

 

13

13

Select

In

Status

 

14

14

nAuto-Linefeed

In/Out

Control

Ya

15

32

nError / nFault

In

Status

 

16

31

nInitialize

In/Out

Control

 

17

36

nSelect-Printer / nSelect-In

In/Out

Control

Ya

18 - 25

19-30

Ground

Gnd

 

 

 

 

Untuk mengeluluarkan data di port parallel, anda gunakan fungsi outport (8 bit ) dan outportb(16 bit)   sebagai berikut :

 

Program  pengendali lampu led di port paralel(iopar.c)

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
outport(0x378,0);//lampu led mati
sleep(5); //tunda 5 detik
outport(0x378,1); //lampu led hidup
sleep(5);

return 0;
}

 

Program 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. Pada Sistem Operasi Berbasis Windows 2000 keatas, biasanya tidak bisa mengakses hardware secara langsung, anda membutuhkan program pendukung misalnya Userport.

 

 Gambar 9.1  Contoh aplikasi VB

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 Rangkaian LED ke port parallel

 

Gambar berikut contoh penggunakan port paralel untuk mengendalikan 5 buah 7 segment menggunakan IC 74LS244 dan 75492, anda juga dapat kembangkan menggunakan dot matrix 5x7. 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

 

 

                        Gambar Contoh aplikasi port paralel

Alamat Port

Port Paralel  mempunyai 3 alamat seperti pada tabel 9.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

Penjelasan

3BCH - 3BFH

Digunakan untuk paralel port di kartu video,  tidak mendukung alamat ECP

378H - 37FH

Alamat untuk  LPT 1

278H - 27FH

Alamat untuk  LPT 2

 

 

 

 

Ketika komputer 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.:

Program penerima data port paralel (paralel.c)

#include <stdio.h>
#include <dos.h>
#include <conio.h>
/*****************************************/
/*membaca input data dari port paralel */
/*****************************************/

int Read_Input()
{

int Byte;
Byte=inportb(0x378);
return Byte;

}
void main (void)
{

int PP_Input;
clrscr();
PP_Input = Read_Input();
printf("%d",PP_Input);
getch();}

Ketika BIOS mengeset alamat ke peralatan printer Anda, ia menyimpan alamat pada lokasi tertentu di memory, seperti pada Tabel 9.3. 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

 

Alamat Awal

Fungsi

0000:0408

LPT1's Base Address

0000:040A

LPT2's Base Address

0000:040C

LPT3's Base Address

0000:040E

LPT4's Base Address

 

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.

 

Program mencari alamat port paralel(Caripar.c)

#include <stdio.h>

#include <dos.h>

void main(void)

{

unsigned int far *ptraddr;  /* Pointer ke lokasi alamat port */

unsigned int address;       /* alamart Port */

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++;

}

 

 

Aplikasi Port Paralel 

Berikut contoh program C untuk mengontrol 8 buah alat melalui penekanan tombol keyboard :

 

Program pengontrol menggunakan  port parallel (Kontrolpar.c)

/*

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("Alat ke 1 terhubung ke D0 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. 

Contoh aplikasi berikut akan mengukur suhu melalui port parallel dan sensor DS1722. Pin SERMODE ialah Serial interface mode, sedangkan CE ialah Chip Enable seperti penjelasan pada Tabel

 

Tabel No Pin dan Fungsi DS1722

 

No. Pin

Nama Pin

Keterangan

7

SERMODE

Serial Interface Mode

2

CE

Chip Enable

3

SCLK

Serial Clock

5

SDO

Serial Data Out

6

SDI

Serial Data In

8

VDDA

Analog supply voltage

 

 

 

           

 

            Gambar Rangkaian sensor temperatur

 

Terlihat pada gambar, yang dibutuhkan hanya sinyal SCK, SDI dan SD0 untuk mengirim data ke port parallel. An3315.pdf merupakan tutorial menulis program bahasa C untuk 2 wire di port parallel.

 

 

 

Program Sensor Temperatur  DS1722 (Ds1722.c)

// Sensor berbasis DS1722 di port Paralel

#include <stdio.h>

#include <dos.h>

#include <conio.h>

#include <process.h>

#include <alloc.h>

 

#define VDD_ON  0x01  /* power to PIC through VDD_ON on pin 2 (D0) */

#define SCK          0x02  /* serial clock for SPI provided by PC       */

#define PCSDO    0x04  /* serial data out from PC on Data bit 2     */

#define PCSDI      0x20  /* note this is on Status register (bit 1)   */

#define SSOUT    0x40  /* =CE, active high, not low as for PIC SPI  */

#define MCLR_HI 0x80  /* MCLR* on pin 9 (Data bit 7) normally high */

#define OPERATE VDD_ON | MCLR_HI  /* normal operation of DS1722    */

/* adjust these to match the CPU speed */

#define DELTIME 10000             /* settling time after transfers */

#define SECDELA 10000000          /* to get about 1 s sampling     */

 

void dodelay(long);

void outportd(unsigned char);

int dport,sport;

 

void main(void)

{

unsigned char LSB,transfer(unsigned char,unsigned char);

char MSB; /* note this is signed */

void outportd(unsigned char outbyte);

int i,j,it;

float T;

 

/* LPT1 port addresses */

if(!(dport = peek(0x40,0x08)))

 { printf("\n\n\nLPT1 not available... aborting\n\n\n"); exit(1); }

sport = dport + 1;           /* status port address */

/* Initialize the Printer DATA Port for PIC operation */

/* includes putting SCK in the neutral 0 position: ~ is bitwise negation */

outportd(OPERATE&~SSOUT);

 

printf("hit key to stop list\n");

transfer(0x80,0xE8);   /* initialize DS1722 */

for(j=0;j<20;j++)

 { if(kbhit()) break;

   printf(" config %X: ",transfer(00,0));    dodelay(SECDELA);

   printf(" LSB %X: ",LSB=transfer(0x01,0)); dodelay(SECDELA);

   printf(" MSB %X: ",MSB=transfer(0x02,0)); dodelay(SECDELA);

   printf("T=%10.4f\n",T=MSB+(float)LSB/256.);

 } /* for loop */

}

unsigned char transfer(unsigned char outbyte,unsigned char outdata)

{ /* output address byte on Data2, data byte, getting inbyte on Status5 */

  unsigned char outmask,inbyte,statusmask;

  int ibit;

  inbyte=0x00;

/* raise SSOUT for 2 byte transfer, SCK also in lowered neutral position */

  outportd(OPERATE|SSOUT);

  for(ibit=0;ibit<8;ibit++)                          

   { outportd(OPERATE|SCK|SSOUT);                    

     outmask=outbyte&0x80; outbyte=outbyte<<1;

     if(outmask)outportd(OPERATE|SCK|PCSDO|SSOUT); /* output of 1 or  */

       else outportd(OPERATE|SCK|SSOUT);        /* of 0 on PCSDO   */

     if(outmask)outportd(OPERATE|PCSDO|SSOUT);    /* lower clock SCK */

       else outportd(OPERATE|SSOUT);            /* retaining data  */

   }

  for(ibit=0;ibit<8;ibit++)                           /* output outdata  */

   {                                                  /* & input inbyte  */

     outportd(OPERATE|SCK|SSOUT);              /* raise clock SCK */

     outmask=outdata&0x80; outdata=outdata<<1;

     if(outmask)outportd(OPERATE|SCK|PCSDO|SSOUT); /* output of 1 or  */

       else outportd(OPERATE|SCK|SSOUT);        /* of 0 on PCSDO   */

     if(outmask)outportd(OPERATE|PCSDO|SSOUT);     /* lower clock SCK */

       else outportd(OPERATE|SSOUT);                  /* retaining data  */

     statusmask=inportb(sport);                       /* read status port*/

     statusmask=statusmask&PCSDI;                     /* mask input line */

     inbyte=inbyte<<1; inbyte=inbyte&0xFE; inbyte|=statusmask>>5;

   }

/* lower SSOUT at end of 2 byte transfer, lower SCK to neutral position  */

  outportd(OPERATE&~SSOUT);

  return inbyte;

}

void outportd(unsigned char outbyte)

{  dodelay(DELTIME); outportb(dport,outbyte); dodelay(DELTIME); }

void dodelay(long deltime)

{ long i; for(i=0; i<deltime; i++) ; }

 

 

Pada program diatas, program  melakukan pendeteksian Port LPT1, lalu melakukan inisialisasi DS1722 untuk membaca temperatur dan dikirim ke port LPTI1 dengan delay tertentu.

 

 

 

Interfacing Port ISA

Gambar berikut merupakan format DAC yang umum, dimana input berupa 8 bit atau lebih, dan outputnya berupa sinyal analog, yang biasanya diperoleh dari suatu rangkaian op-amp

 

 

                  Gambar Blok diagram DAC standar

 

Ada 3 modus operasi pada PIO 8255 yang dapat dipilih melalui software yaitu :

  • Mode 0 : basic input/output
  • Mode 1 : strobed input/output
  • Mode 2:  bidirectional bus

Jika reset input mendapat input high, semua port akan diset ke mode input dimana semua 24  jalur ditahan pada logika 1 oleh bus internal.  PPI 8255 dapat dibuat sebagai antarmuka DAC atau ADC.  Untuk mencoba DAC yang terprogram paling mudah menggunakan PPI 8255 dalam mode 0.  Langkah-langkah:

  • Pasang Card PPI 8255 ISA, anda juga dapat menggunakan Card PPI 8255 berbasiskan PCI
  • Hubungkan DAC ke port A
  • Hubungkan keluaran DAC ke Osiloskop
  • Buat program berikut :

 

//Program Pembangkit sinyal Sinus berbasis 8255

#include <conio.h>

#include <stdio.h>

#include <math.h>

main()

{

printf (“======================”);

printf (“ Pembangkit sinyal sinus\n”);

outp (0x303, 0x80); //konfigurasi 8255

printf (“======================”);

unsigned char v1;

float Vout, magnitude; int a;

printf (“\n Tekan sembarang tombol untuk keluar\n”)

do

{

for (a=0;a<360;a++)

{

Vout =5.0 +5.0* sin ((3.14*a)/180));

magnitude=Vout*25.6;

v1=(char)magnitude;

delay(1);

outp(0x300,v1)

}

}

while (!kbhit());

return (0);

}

 

Program diatas akan membangkitkan sinyal sinus karena terdapat pembangkitan nilai sinus pada rumus Vout =5.0 +5.0* sin ((3.14*a)/180)). Alamat yang digunakan ialah 300H, yang merupakan alamat standar port ISA untuk eksperimen.

 

 

Contoh berikut menerapkan PPI 8255 dengan V B 6.

 

 

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)

Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)

 

Private Sub Form_Load()

End Sub

Out &H303, &H90

'End Sub

 

Private Sub Timer1_Timer()

Label3.Caption = Format(Date, "dd-mmm-yyyy")

Label4.Caption = Format(Time, "hh:mm:ss")

End Sub

 

Private Sub Timer2_Timer()

Label2.Text = Inp(&H300)

If x = 50 Then

    Out &H301, &H1

End If

End Sub

 

 

 

USB (Universal Serial Bus)

 

Mengenal USB

USB ialah port yang sangat diandalkan saat ini dengan bentuknya yang kecil dan kecepatan datanya yang tinggi. Anda dapat menghubungkan hingga 127 produk usb dalam 1 komputer. USB versi 1.1 mendukung 2 kecepatan yaitu mode kecepatan penuh 12Mbits/s dan kecepatan rendah 1.5 Mbits/s. USB 2.0 mempunyai kecepatan 480Mbits/s yang dikenal sebagai mode kecepatan tinggi.

Saat ini transfer data menggunakan port USB sudah semakin marak, port USB menjadi pilihan utama karena ukuran yang ringkas dan kecepatan transfer data yang cukup besar.  Sebagai perbandingan, Bus  PCI saat ini mendukung transfer data hingga 132 MB/s, dimana AGP (pada 66MHz) mendukung hingga 533 MB/s. AGP  dapat melakukan ini karena kemampuannya untuk mentransfer data pada ujung naik dan turun detak 66MHz.

Ada dua macam konektor USB : konektor A untuk hubungan ke host dan konektor B untuk hubungan ke peranti USB . Secara fisik dapat dibedakan dengan mudah  untuk menghindari kesalahan pemasangan.

   

                                      

Konektor jenis A     Konektor jenis B

Gambar Konektor USB

 

Untuk  menghubungkan lebih luas seperti menghubungkan ke piranti berukuran kecil layaknya seperti handphone, PDA, dan sebagainya. Dibuat untuk konektor mini-A dan mini-AB. Semua jenis konektor USB di hubungkan dengan empat kabel sebagaimana tabel   berikut di bawah ini

 

     Tabel Pengkabelan USB.

Pin

Warna Kabel

Fungsi

1

Merah

VBus ( 5 volt )

2

Putih

D-

3

Hijau

D+

4

Hitam

Ground

 

Fungsi USB

Suatu piranti USB dapat dikatakan sebagai sebuah  alat transceiver( pengirim sekaligus penerima ) Baik host maupun USB itu sendiri. Sebuah istilah baru di perkenalkan, yakni USB function yang maksudnya adalah peralatan USB yang memilki kemampuan khusus. Seperti printer, scanner, modem, dan lain-lainnya.

 

Data dikirim secara serial, maka piranti USB harus mampu menangani gelombang kontinyu. Gelombang ini di hubungkan langsung ke pin data USB dari sebuah sumber tegangan dengan impedansi output 39W. Sumber tegangan rangkaian terbuka untuk keperluan ini ada pada kemungkinan terburuk dari adanya overshoot dan undershoot.

Pada  koneksi USB dengan kecepatan 12 MHz digunakan kabel twisted-pair yang terlindung dengan impedansi 90W  kurang lebih 15% dan delay maksimumnya 26ns.Sedang impedansi pada drivernya harus antara 28W hingga 44W. Jika di ukur, arus yang masuk dan keluar piranti USB V1.1 tidak boleh melebihi 10,71 VOH mA. Tegangan logika yang di masukan ke D+ dan D- tidak boleh melebihi 0.3 VOH untuk logika rendah dan juga harus turun sebesar 0.7 VOH untuk logika tinggi.

Karena ada piranti USB yang berkomunikasi pada kecepatan rendah 1.5 MHz, maka kombinasi kabel dan piranti USB harus mengandung kapasitas tunggal dengan nilai 200pF hingga 450pF di pin D+ dan D-. Perambatan delay pada kabel kecepatan rendah harus kurang dari 18 ns. Data sinyal yang naik turun diukur dari 10% hingga 90% dari sinyal,dengan toleransi 10%. Waktu untuk ini dari 4ns hingga 20ns, tergantung kecepatan USB yang digunakan. 

Sudah saatnya anda membangun aplikasi menggunakan port USB.  Jika anda ingin membangun sistem elektronika berbasis port USB, dapat menggunakan chip FTDI atau modul FTDI, antara lain :

·   FT2232C , IC USB UART/FIFO

 

 FT2232L -

 

   Gambar Chip FT2232C

 

 

IC ini mempunyai fitur :

·         Single chip USB <=> asynchronous serial data transfer

·         Full handshaking & modem interface signals

·         UART interface mendukung  7/8 data bits, 1/2 stop bits dan Odd/Even/Mark/Space/No Parity

·         Data transfer rate 300 Baud => 3M Baud (TTL)

·         Data transfer rate 300 Baud => 1M Baud (RS232)

·         Data transfer rate 300 Baud => 3M Baud (RS422/RS485)

·         384 Byte Rx buffer/128 Byte Tx buffer for high data throughput

·         Rx buffer timeout  dapat disesuaikan

·         Dukungan built-in untuk  event characters dan kondisi  line break

·         Auto transmit buffer control untuk  RS485

·         Mendukung USB suspend/resume through SLEEP# and RI# pins

·         Mendukung daya tinggi USB bus powered devices melalui pin  PWREN#

·         Integrated level converter dan UART dan sinyal control untuk  interfacing ke logika 5V dan  3.3V

·         Kompatibel USB 1.1 dan USB 2.0

·         EEPROM programmable on-board melalui USB

 

·         FT245BM, IC USB FIFO  kecepatan tinggi

IC ini memiliki fitur yang mirip dengan IC TF2232C, untuk aplikasi Modem, PC, instrumentasi dan lain 0lainnya berbasis USB.

 

 

Selain dapat membeli chip tersebut, kita dapat juga membeli modul-modul DIP menggunakan chip FTDI, antara lain   DLP-2232M, yaitu modul menggunakan FT2232C3rd generation Dual USB UART/FIFO

 

                              

   Gambar DLP-2232M

 

Versi lainnya seperti DLP-USB245M ialah modul ekonomis menggunakan chip FT245BM sebagai USB FIFO. Modul ini memiliki chip pendukung antara lain 93C46 EEPROM untuk kustomisasi OEM. Beberapa chip dan model lainnya dapat anda miliki dari produk FTDI.

 

 

 

 

 

Gambar DLP-USB245M

 

Demikianlah penjabaran dari sistem bus dan penerapannya. Semoga Anda dapat mengembangkan berbagai aplikasi yang berhubungan dengan Bus Komputer.

 

 

 

LATIHAN :

 

 

 

1.       Buat rangkaian pengendali relay dari port paralel dan PPI 8255 menggunakan transistor 2N3904 dan 2N3053. Input berlogika tinggi dari keluaran port paralel akan mengaktifkan transistor 2N3904 dan arus diperkuat oleh 2N3053. Rangkaiannya sebagai berikut:

 

         Gambar Rangkaian driver relay