Senin, 20 September 2010


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
#include
//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
#include
#include
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
#include
#include
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
#include
#include
/*****************************************/
/*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
#include
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
#include
#include
#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
#include
#include
#include
#include

#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


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
#include
#include
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