Port Seri MCS51
Oleh Budhy Sutanto
Umumnya orang selalu menganggap port seri
pada MCS51 adalah UART yang bekerja secara asinkron, jarang yang menyadari port
seri tersebut bisa pula bekerja secara sinkron, pada hal sebagai port seri yang
bekerja secara sinkron merupakan sarana yang baik sekali untuk menambah
input/output bagi mikrokontroler.
Dikenal 2 macam
cara transmisi data secara seri. Kedua
cara tersebut dibedakan oleh sinyal denyut (clock)
yang dipakai untuk men-‘dorong’ data seri, kalau clock dikirim bersama dengan
data seri, cara tersebut dikatakan sebagai transmisi data seri secara sinkron.
Sedangkan dalam transmisi data seri secara asinkron,
clock tidak dikirim bersama data seri, rangkaian penerima data harus
membangkitkan sendiri clock pendorong data seri.
Port seri MCS51 bisa
dipakai dalam 4 mode kerja yang berbeda. Dari 4 mode
tersebut, 1 mode diantaranya bekerja secara sinkron dan 3 lainnya bekerja secara
asinkron. Secara ringkas ke-empat mode kerja tersebut bisa dibedakan
sebagai berikut:
Mode
0 Mode ini bekerja secara sinkron, data seri dikirim dan diterima
melalui kaki P3.0
(RxD), dan
kaki P3.1
(TxD)
dipakai untuk menyalurkan clock pendorong data seri yang dibangkitkan MCS51.
Data dikirim/diterima 8 bit sekali gus, dimulai dari
bit yang bobotnya paling kecil (bit 0) dan diakhiri dengan bit yang bobotnya
paling besar (bit 7). Kecepatan pengiriman data (baud rate) adalah 1/12
frekuensi osilator kristal.
Mode 1
Mode ini dan mode-mode berikutnya bekerja secara asinkron, data dikirim melalui
kaki P3.1
(TxD) dan
diterima melalui kaki
P3.0 (RxD).
Pada Mode 1 data dikirim/diterima 10 bit sekali gus, diawali dengan 1 bit start,
disusul dengan 8 bit data yang dimulai dari bit yang bobotnya paling kecil (bit
0), diakhiri dengan 1 bit stop. Pada MCS51 yang berfungsi sebagai penerima bit
stop ditampung pada
RB8 dalam register
SCON.
Kecepatan pengiriman data (baud rate) bisa diatur sesuai
dengan keperluan.
Mode inilah yang umum dikenal sebagai UART (Universal
Asynchronous Receiver/Transmitter).
Mode 2 Data
dikirim/diterima 11 bit sekali gus, diawali dengan 1 bit start, disusul 8 bit
data yang dimulai dari bit yang bobotnya paling kecil (bit 0), kemudian bit ke 9
yang bisa diatur lebih lanjut, diakhiri dengan 1 bit stop.
Pada MCS51 yang berfungsi sebagai pengirim, bit 9
tersebut berasal dari bit
TB8 dalam
register SCON.
Pada MCS52 yang berfungsi sebagai penerima, bit 9
ditampung pada bit
RB8 dalam register
SCON,
sedangkan bit stop diabaikan tidak ditampung. Kecepatan pengiriman data (baud
rate) bisa dipilih antara 1/32 atau 1/64 frekuensi osilator
kristal.
Mode 3 Mode
ini sama dengan Mode 2, hanya saja kecepatan
pengiriman data (baud rate) bisa diatur sesuai dengan keperluan, seperti halnya
Mode 1.
Pada mode asinkron (Mode 1, Mode 2 dan
Mode 3), port seri MCS51 bekerja secara full duplex, artinya pada saat
yang sama port seri ini bisa mengirim data sekali gus menerima data.
Register
SBUF
merupakan register penghubung port seri. Dalam ke-empat mode di atas, semua
instruksi yang mengakibatkan perubahan isi
SBUF
akan mengakibatkan port seri mengirimkan data keluar
dari MCS51. Agar port seri bisa menerima data, bit
REN dalam
register SCON
harus bernilai ‘1’.
Pada mode 0, proses penerimaan data dimulai dengan instruksi
CLR RI,
sedangkan dalam mode lainnya proses penerimaan data diawali oleh bit start yang
bernilai ‘0’.
Data yang diterima port seri dari luar MCS51, diambil dengan instruksi
MOV A,SBUF.
Mengambil data dari
SBUF dan
menyimpan data ke
SBUF sesungguhnya bekerja pada dua register yang berlainan, meskipun
nama registernya sama-sama
SBUF.
Register-register Port Seri MCS51
MCS51 dilengkapi dengan 2 register dan
beberapa bit tambahan untuk keperluan pemakai port seri.
Gambar 1 Register SBUF
SBUF
merupakan SFR
(Special Function Register) yang terletak pada memori-data internal dengan nomor
$99.
SBUF
mempunyai kegunaan ganda, data yang disimpan pada
SBUF
akan dikirim keluar MCS51 lewat port seri, sedangkan
data dari luar MCS51 yang diterima port seri diambil dari
SBUF pula.
Jadi meskipun hanya menempati satu nomor memori-data
internal (nomor $99),
sesungguhnya SBUF
terdiri dari 2 register yang berbeda.
Gambar 2 Register SCON
SCON
merupakan SFR
(Special Function Register) yang terletak pada memori-data internal dengan nomor
$98,
merupakan register utama untuk mengatur kerja port seri MCS51. Setelah
reset semua bit dalam
SCON bernilai
‘0’.
·
Bit SM0
dan bit SM1
(bit 7 dan bit 6 pada register
SMOD) dipakai
untuk menentukan mode kerja port seri. Setelah reset kedua bit ini bernilai ‘0’
·
Bit REN
(bit 4) dipakai untuk mengaktipkan kemampuan port seri menerima data. Pada mode
0 kaki RxD
(kaki P3.0)
dipakai untuk mengirim data seri (REN=’0’)
dan juga untuk menerima data seri (REN=’1’).
Sifat ini terbawa pula pada saat port seri bekerja pada mode 1, 2 dan 3,
meskipun pada mode-mode tersebut kaki
RxD hanya
dipakai untuk mengirim data, agar kaki
RxD bisa
dipakai untuk menerima data terlebih dulu harus dibuat
REN=’1’.
Setelah reset bit REN
bernilai ‘0’.
·
Pada mode kerja 2 dan mode kerja 3, port seri bekerja dengan 9 bit
data, SBUF
yang kapasitasnya 8 bit tidak cukup untuk keperluan ini. Bit ke-sembilan yang
akan dikirim terlebih dulu diletakkan di
TB8 (bit 3),
sedangkan bit RB8
(bit 2) merupakan bit yang dipakai untuk menampung bit ke-sembilan yang diterima
port seri.
·
Pada mode kerja 1,
RB8 dipakai
untuk menampung bit stop yang diterima, dengan demikian apa bila
RB8 bernilai
‘1’ maka
data diterima dengan benar, sebaliknya apa bila
RB8=’0’
berarti terjadi kesalahan kerangka (framing error).
Kalau bit SM2
(bit 5) bernilai ‘1’,
jika terjadi kesalahan kerangka,
RI tidak
akan menjadi ‘1’
meskipun SBUF
sudah berisi data dari port seri.
Bit ke 9 ini bisa dipakai sebagai bit pariti, hanya saja bit pariti yang dikirim
harus ditentukan sendiri dengan program dan diletakkan pada
TB8, dan bit
pariti yang diterima pada
RB8 dipakai
untuk menentukan integritas data secara program pula. Tidak
seperti dalam UART standard, semuanya itu dikerjakan oleh perangkat keras dalam
IC UART.
·
Bit TI
(bit 1) merupakan petanda yang setara dengan petanda
TDRE
(Transmitter Data Register Empty) yang umum dijumpai pada UART standard. Setelah
port seri selesai mengirim data yang disimpan ke-dalam
SBUF, bit
TI akan
bernilai ‘1’
dengan sendirinya, bit ini harus di-nol-kan dengan program agar bisa dipakai
untuk memantau keadaan
SBUF dalam
pengiriman data berikutnya.
Sub-rutin SerialOut
berikut dipakai untuk mengirim data seri, bisa dipakai untuk semua mode port
seri. Baris 02 menunggu
TI menjadi ‘1’,
dimaksud untuk memastikan pengiriman data sebelumnya sudah selesai. Data
yang akan dikirim sebelumnya sudah disimpan di
A, pada baris
03 data tersebut dikirim melalui port seri dengan cara meletakannya di
SBUF.
Agar
TI bisa
dipakai untuk memantau keadaan
SBUF pada
pengiriman data berikutnya, pada baris 04
TI di-nol-kan.
01: SerialOut:
02: JNB TI,$ ; tunggu data sebelumnya selesai
dikirim
03: MOV SBUF,A ; kirim data baru
04: CLR TI ; petanda ada pengiriman baru
05: RET
·
Bit RI
(bit 0) merupakan petanda yang setara dengan petanda
RDRF
(Receiver Data Register Full) yang umum dijumpai pada UART standard. Setelah
SBUF menerima
data dari port seri, bit
RI
akan bernilai ‘1’
dengan sendirinya, bit ini harus di-nol-kan dengan program agar bisa dipakai
untuk memantau keadaan
SBUF dalam
penerimaan data berikutnya.
Sub-rutin
SerialIn
berikut dipakai untuk menerima data seri, bisa dipakai untuk semua mode port
seri. Baris 02 menunggu
RI menjadi ‘1’,
dimaksud untuk memastikan sudah ada data baru yang diterima pada
SBUF.
Pada baris 03 data pada
SBUF diambil
ke A. Agar
RI bisa
dipakai untuk memantau keadaan
SBUF pada
pengiriman data berikutnya, pada baris 04
RI di-nol-kan.
01: SerialIn:
02: JNB RI,$ ; tunggu SBUF berisi data baru
03: MOV A,SBUF ; ambil data
04: CLR RI ; pentanda data sudah diambil
05: RET
Gambar 3 Bit SMOD dalam Register PCON
Mode 0 port seri
UART merupakan standard
yang dipakai untuk komunikasi data seri dengan komputer, komunikasi data seri
dengan modem dan lain sebagainya.
Komunikasi data seri secara sinkron seperti
mode 0, merupakan komunikasi data seri yang banyak dipakai untuk menghubungkan
IC-IC digital dalam sebuah sistem, misalnya pada IC Serial EEPROM, cara ini
belakangan menjadi makin populer karena rangkaiannya sederhana dan tidak makan
tempat.
Dalam dunia digital, dikenal 3 macam teknik
transmisi data seri secara sinkron untuk keperluan di atas, yang paling terkenal
adalah teknik ciptaan Philips yang dinamakan sebagai I2C (Inter IC
Communication), Motorola mengenalkan teknik yang dinamakan sebagai SPI (Serial
Peripheral Interface) dan National Semiconductor menciptakan MicroWire.
Transmisi data seri yang dipakai pada mode
0, tidak sepadan dengan 3 teknik yang disebut di atas, tapi dengan perancangan
yang cermat mode 0 ini bisa dihubungkan ke SPI, sehingga bisa dipakai untuk
menghubungkan MCS51 dengan mikrokontroler Motorola MC68HC11.
Sinyal data seri sinkron yang ada pada kaki
P3.0 dan
P3.1,
sesungguhnya murni merupakan sinyal yang biasa dipakai untuk mengendalikan
shift-register, dengan demikian dengan menghubungkan shift register ke port seri,
bisa menambah port input maupun port output dengan mudah.
Menambah port output
Rangkaian Gambar 1 merupakan rangkaian
menambah port output 8 bit pada AT89C2051, meskipun demikian
cara ini bisa dipakai pada AT89C51 tanpa perubahan apapun.
Gambar 1 Penambahan Port Output 8 bit dengan
74LS164
Untuk keperluan menambah port output secara
seri, yang diperlukan adalah serial in parallel out shift register, dalam
rangkaian Gambar 1 dipakai IC 74LS164. Data seri dari
P3.0 (kaki
nomor 2) AT89C2051 dihubungkan ke input data seri
A &
B (kaki nomor
1 & 2) 74LS164, sinyal denyut (clock) pendorong data seri didapat dari kaki
P3.1 (kaki
nomor 3) AT89C2051, dihubungkan ke input
CLK (kaki
nomor 8) IC 74LS164.
Saat port seri mengirim
data keluar dari AT89C2051, data seri ditempatkan pada kaki
P3.0 dan kaki
P3.1
mengeluarkan 8 pulsa sinyal denyut (clock) untuk mendorong data seri tersebut
masuk ke 74LS164. Data seri tersebut diubah menjadi data paralel yang
bisa didapat pada kaki
QA sampai
QH (kaki
nomor 3 sampai 6 dan kaki nomor 10 sampai 13), namun data pada kaki-kaki ini
berubah-rubah seirama dengan pergeseran data pada saat data dikirim, untuk
keadaan tertentu hal ini sering-sering mengganggu dan tidak dikehendaki.
Untuk mengatasi hal ini dipakai IC 74HC574
Octal 3-state Non-inverting D Flip-flop, input 74HC574 (D1..D8)
satu-per-satu dihubungkan ke output 74LS164 (QA..QH),
setelah data selesai didorong dalam 74LS164, kaki
P3.7 (kaki
nomor 11) AT89C2051 mengeluarkan sinyal yang diterima 74HC574 pada kaki
CLK (kaki
nomor 11), sinyal ini merupakan perintah bagi
74HC574 agar me-‘rekam’ data yang ada pada input-inputnya dan ditempatkan pada
output-outputnya.
Rangkaian ini tidak memerlukan rutin
persiapan (initialization routine), hal ini disebabkan karena setelah reset
register SCON
bernilai $00, yang artinya port seri bekerja dalam mode 0, dan seperti sudah
dibahas diatas sebagai output port seri tidak memerlukan pengaturan khusus.
Rutin
ExtraOutput
pada Potongan Program 1 dipakai untuk mengeluarkan data 8 bit ke output 74HC574.
Pengiriman data seri diawali dengan instruksi
MOV SBUF,A
pada baris 2, baris 3 menunggu sampai pengiriman data seri selesai, bit petanda
(flag) TI
dalam register SCON
dikembalikan ke ‘0’
untuk keperluan pengiriman data berikutnya (baris 4), baris 5 sampai 7 membuat
pulsa agar sinyal pada output 74LS164 direkam ke 74HC574.
Potongan Program 1
01:
ExtraOutput:
02:
MOV SBUF,A
03:
JNB TI,A
04:
CLR TI
05:
CLR P3.7
06:
NOP
07:
SETB P3.7
08:
RET
Menambah port input
Rangkaian Gambar 2 merupakan rangkaian
menambah port input 16 bit pada AT89C2051. Untuk keperluan menambah port input
secara seri, yang diperlukan adalah parallel in serial out shift
register, dalam rangkaian Gambar 2 dipakai 2 chip IC 74LS165. Data paralel
ditempatkan pada input
A sampai
H (kaki 2
sampai 5 dan kaki 10 sampai 14) 74LS165, sebelum mengambil data AT89C2051 me-nol-kan
sesaat kaki LD*
(kaki 1) 74LS165, untuk merekam data pada input masuk ke shift register.
Setelah itu pada kaki
P3.1
AT89C2051 mengambil data dari 74LS165 dengan cara mengeluarkan 8 pulsa sinyal
denyut (clock) untuk mendorong data dalam shift register 74LS165 masuk ke
AT89C2051 lewat kaki
P3.2.
Rangkaian dalam Gambar 2 memakai 2 chip
74LS165 untuk membentuk port input 16 bit dengan cara menghubungkan kedua
74LS165 secara seri (kaki
QH U2
dihubungkan ke kaki
SER U3, kaki
CLK U2 dan U3
dihubungkan jadi satu, demikian juga kaki
LD* ).
Gambar 2 Penambahan Port Input 16 bit dengan
74LS165
Pengiriman data seri mode 0 adalah 8 bit
sekali pengiriman, dengan demikian untuk mengambil
data input 16 bit dari 2 chip 74LS165 dilakukan dalam dua kali pengambilan.
Potongan Program 2
01:
ExtraInput:
02:
CLR P3.7
03:
NOP
04:
SETB P3.7
05:
ACALL Input8bit
06:
MOV R0,A
07:
ACALL Input8bit
08:
MOV R1,A
09:
RET
10: ;
11:
Input8Bit:
12:
CLR RI
13:
JNB RI,$
14:
MOV A,SBUF
15:
RET
Rutin
ExtraInput
pada Potongan Program 2 dipakai untuk mengambil data 16 bit dari input 2 chip
74HC165. Baris 2 sampai 4 me-nol-kan sesaat kaki
LD* (kaki 1)
74LS165, kemudian mengambil 8 bit data yang pertama dan disimpan di
R0 (baris 5
dan 6), 8 bit data yang kedua diambil dan disimpan ke
R1 pada baris
7 dan 8.
Sub-rutin
Input8bit
pada baris 11 bertugas untuk mengambil data 8 bit. Proses pengambilan
data dimulai dengan instruksi
CLR RI pada
baris 12, setelah instruksi ini AT89C2051 mengeluarkan 8 pulsa sinyal denyut
pada kaki P3.2
untuk mendorong data 8 bit pada 74LS165 masuk kaki
P3.0.
Instruksi pada baris 13 menunggu sampai 8 bit pulsa denyut selesai dikirim, dan
data diambil dengan instruksi
MOV A,SBUF
pada baris 14.
Sebelum memakai sub-rutin ExtraInput,
terlebih dulu harus menjalankan instruksi
SETB REN,
agar port seri bisa berfungsi sebagai input.
Penutup
Cara menghubungkan secara seri 2 shift
register 74LS165 untuk memperoleh port input 16 bit, bisa pula dipakai untuk
membangun port output 16 bit dengan 74LS164. Bahkan bila diperlukan input/output
dengan jumlah bit lebih banyak, bisa dibuat rangkaian yang terdiri dari beberapa
chip shift register.
Proses pengiriman data seri lebih lambat
dibanding dengan pengiriman data paralel, tapi pengiriman data 8 bit yang
dibicarakan di atas hanya memerlukan waktu 8 mikro-detik,
dalam banyak keperluan masih bisa diterima.
|