UART
UART banyak digunakan dalam komunikasi data seri dengan format data yang spesifik.
IC 89C51 memiliki fasilitas cukup lengkap, salah satu fasilitas yang ada adalah UART pada IC ini yang dipakai untuk pengiriman dan penerimaan data secara seri (P3.0 sebagai Rx dan P3.1 sebagai Tx), namun dalam kenyataannya UART yang ada pada IC AT89C51 bukanlah UART yang sebenarnya, sehingga untuk keperluan alat peraga dibuat simulasi untuk membuat sebuah UART Software dengan menggunakan IC AT89C51 sehingga proses pengiriman data dengan menggunakan UART dapat dimengerti dengan baik, juga diketahu kesalahan yang mungkin terjadi pada proses transmisi. Untuk mendukung UART Software yang dibuat, dibuat juga modul UART, dimana modul ini terdapat 4 buah tampilan 7 ruas untuk mengetahui data yang dikirim dan diterima. SW1 berupa DIP Switch dipakai untuk memberikan input data yang akan dikirim, sedangkan switch yang lain digunakan untuk mengontrol status dari data yang akan dikirim dan diterima. Push button yang digunakan berfungsi untuk menandakan pengiriman data (Strobe Data). Selain itu juga diberikan indikator kesalahan dari data yang diterima berupa LED dan status data yang diterima.
Adapun Gambar panel dari modul UART yang dibuat dapat dilihat sebagai berikut:
Panel Modul UART
Serial Input dan Serial Output
Dalam keadaan mula-mula tanpa sinyal (tidak ada data yang dikirim ataupun tidak ada data yang diterima), serial port (Tx dan RX) dalam keadaan high (logic ‘1’) dikenal dengan Marking State, namun apabila terdapat pengiriman data secara serial asinkron terjadi pengiriman data dengan format tertentu yaitu seperti yang terlihat pada gambar 2 di bawah:
Gambar 2
Format Data Transmisi Serial Asinkron
Pengiriman data selalu diawali dengan start bit (selalu low ‘0’) kemudian selalu diakhiri dengan bit (selalu high ‘1’), Dalam pengiriman Data secara serial dikenal dengan Baudrate yaitu banyaknya bit yang dikirimkan dalam waktu satu detik. Misalnya baudrate suatu sistem serial adalah 9600 berarti dalam 1 detik terdapat pengiriman sebanyak 9600 bit. Baudrate ini harus sama antara pengirim dan penerina agar kesalahan tidak terjadi. Baudrate standard antara lain adalah 19200, 9600, 4800, 2400,1200, 600, 300, 150, 110, 100 dan 75.
Untuk mensinkronkan antara pemancar dan penerima digunakan start bit. Setelah start bit, bit-bit data dikirimkan satu persatu secara bergantian dimulai dari LSB (Least Significant Bit) hingga MSB (Most Significant Bit) Kemudian bila perlu dikirimkan parity untuk mendeteksi bilamana terdapat kesalahan dalam transmisi. Kemudian akan berlogika ‘1’ selama waktu paling sedikit 1 bit untuk menunjukan bahwa data karakter sudah berakhir. Bit terakhir ini dikenal dengan stop bit.
Dari gambar 2 di atas dapat dilihat bahwa data yang hendak dikirim diletakkan dalam sebuah bingkai (frame) yaitu start bit dan stop bit dan pengirimannya dilakukan per bit melalui start bit, sampai stop bit yang terakhir. Oleh karena itu data yang dikirim harus digeser setiap kali telah terjadi pengiriman 1 bit data. Berikut ini adalah potongan program untuk mengirimkan data per bit melalui P3.1 kemudian menggeser data tersebut.
Potongan Program 1 – Pengiriman Data
1 : PENGIRIMAN_DATA:
2 : SETB ENDOFTX
3 : CJNE R0,#0,KIRIMDATA
4 : CLR P3.1
5 : CLR PULSER
6 : SETB PULSER
7 : CLR PULSER
8 : INC R0
9 : MOV COUNT1,#KONSTANTA
10 : SJMP CHECKAGAIN
11 : KIRIMDATA:
12 : DJNZ COUNT1,CHECKAGAIN
13 : MOV COUNT1,#KONSTANTA
14 : CJNE R0,#9,K_STOPBIT
15 : MOV C,T_DATA9
16 : MOV P3.1,C
17 : CLR PULSER
18 : SETB PULSER
19 : CLR PULSER
20 : INC R0
21 : SJMP CHECKAGAIN
22 : K_STOPBIT:
23 : CJNE R0,#10,K_STOPBIT2
24 : JNB NO_PAR,DATA10
25 : JB STOP,DATA10
26 : MOV R0,#0
27 : CLR TRANSMIT
28 : CLR ENDOFTX
29 : SJMP CHECKAGAIN
30 : DATA10:
31 : MOV C,T_DATA10
32 : MOV P3.1,C
33 : CLR PULSER
34 : SETB PULSER
35 : CLR PULSER
36 : INC R0
37 : SJMP CHECKAGAIN
38 : K_STOPBIT2:
39 : CJNE R0,#11,SELESAIKIRIM
40 : JB NO_PAR,SELESAI
41 : JB STOP,DATA11
42 : SELESAI:
43 : SETB P3.1
44 : CLR PULSER
45 : SETB PULSER
46 : CLR PULSER
47 : MOV R0,#0
48 : CLR TRANSMIT
49 : CLR ENDOFTX
50 : SJMP CHECKAGAIN
51 : DATA11:
52 : MOV C,T_DATA11 ;KIRIM T_DATA11
53 : MOV P3.1,C
54 : CLR PULSER ;BUAT PULSA UNTUK LA
55 : SETB PULSER
56 : CLR PULSER
57 : INC R0 ;FLAG DATA DINAIKKAN
58 : SJMP CHECKAGAIN ;CHECK RECEIVE
59 : SELESAIKIRIM:
60 : CJNE R0,#12,DATAYANGDIKIRIM
61 : MOV R0,#0 ;SEMUA FLAG DIBERSIHKAN
62 : CLR TRANSMIT
63 : CLR ENDOFTX
64 : CHECKAGAIN:
65 : RET
Potongan Program 2 – Penerimaan Data
1: PENERIAMAAN_DATA:
2: INC R1
3: MOV C,P3.0
4: MOV A.7,C
5: ANL A,#10000000B
6: ORL A,BUFFER2
7: MOV BUFFER2,A
8: RET
Program di atas dapat dijelaskan sebagai berikut: R1 digunakan sebagai tanda jumlah bit yang telah diterima. Data pada port Rx akan disimpan pada buffer2 melalui MSB dan dengan menggunakan sifat dari gerbang OR dan AND maka data akan digeser terus sampai waktu tertentu (tergantung konfigurasi yang ditentukan). Program ini juga harus diletakan pada interupsi timer agar terbentuk baudrate yang tetap sehingga data yang diterima adalah benar.
Data Input dan Status Input
Untuk mengirimkan data pada serial port, hal yang harus dilakukan pertama kali adalah memberikan data input dan status data yang akan dikirimkan. Untuk mengambil data digunakan Dip Switch-8 sedangkan untuk mengambil status dari data digunakan Switch DPDT yang masing-masing dihubungkan pada port 0 dan port 2 dari AT89C51.
Proses pengambilan data dan status dapat dilihat pada potongan program sebagai berikut:
Potongan Program 3 – CheckD_Strobe
1: CHECKD_STROBE:
2: JB D_STROBE,ENDD_STROBE
3: MOV A,P0
4: CPL A
5: MOV DATAKIRIM,A
6: MOV BUFFER1,DATAKIRIM
7: ACALL ISIDATA9
8: ACALL PECAHKAN_DATA_OUT
9: SETB TRANSMIT
10: ENDD_STROBE:
11: RET
Apabila potongan program ini dipanggil akan melihat apakah pada D_STROBE adalah low, apabila low maka data akan disimpan pada variabel DATAKIRIM, setelah itu akan diletakan pada BUFFER1, sebagai tempat untuk menggeser data agar data dapat dikirim secara bit per bit. Namun sebelumnya perlu dibangkitkan dahulu data ke 9 ke 10 dan ke 11 dari data yang akan dikirim berupa parity, dan stop bit. Hal ini dapat dilihat pada baris ke 7 dari potongan program di atas, dimana pada baris ke 7 ini akan dipanggil sub-rutin untuk mengisikan data ke 9, ke 10 dan ke 11 dari data yang akan dikirimkan.
Pada baris ke 8 akan dipanggil sub-rutin untuk memecahkan data yang akan dikirim agar dapat ditampilkan pada tampilan 7 ruas seperti yang telah dijelaskan pada potongan program 1. Pada baris ke 9 Flag untuk transmit diaktifkan untuk menandakan bahwa terdapat data yang akan dikirimkan.
Potongan Program 4 – CheckC_Strobe
1: CHECKC_STROBE:
2: JB C_STROBE,ENDC_STROBE
3: MOV C,P2.1
4: MOV STOP,C
5: MOV C,P2.2
6: MOV PAR,C
7: MOV C,P2.3
8: MOV NO_PAR,C
9: ENDC_STROBE:
10: RET
Potongan program di atas dapat dijelaskan sebagai berikut: STOP, PAR dan NO_PAR merupakan variabel penampung status data. Namun sebelum disimpan pada masing-masing variabel, dilihat dulu apakah pada C_STROBE adalah low (baris ke 2 dari potongan program), apabila low baru semua status disimpan. Hal ini dimaksudkan agar status dari data tidak berubah-ubah.
Tampilan 7 Ruas
Untuk menampilkan data yang dikirim digunakan 2 buah tampilan 7 ruas LED yang dibentuk dengan D1 dan D2 sedangkan untuk menampilkan data yang diterima digunakan 2 buah lagi tampilan 7 ruas LED yang dibentuk dengan D3 dan D4. Keempat display 7 ruas itu dinyalakan secara bergantian dengan frekuensi yang tinggi dengan menggunakan prinsip multipeks, sehingga seolah-olah akan nampak nyala secara terus menerus.
Proses pengaturan sistem tampilan itu semuanya diatur melalui program yang telah disimpan dalam ROM AT89C51. Potongan program itu seperti berikut:
Potongan Program 6 – Program Timer1Interupt:
1: TIMER1INTERUPT:
2: MOV P1,KIRIM1
3: ACALL DELAY
4: MOV P1,KIRIM2
5: ACALL DELAY
6: MOV P1,TERIMA1
7: ACALL DELAY
8: MOV P1,TERIMA2
9: DELAY:
10: PUSH A
11: MOV A,#3
12: DJNZ A,*
13: POP A
14: RET
Potongan program di atas dapat dijelaskan sebagai berikut :kirim1, kirim2, terima1 dan terima2 merupakan variabel yang berfungsi untuk menampung kombinasi tertentu yang akan menampilkan display tertentu pada tampilan 7 ruas, dimana isi dari variabel ini dirubah pada bagian lain dari program sesuai dengan perubahan yang terjadi pada variabel ini. Kemudian isi dari variabel ini diumpankan pada port 1 (baris 2, 4, 6 dan 8 pada potongan program di atas), untuk mengendalikan sistem tampilan pada modul ini.
Delay merupakan sub-rutin yang berfungsi untuk menunda waktu, agar angka yang ditampilkan bisa tertahan sesaat sebelum berganti. Pada baris ke 10 aliran program dikembalikan ke program utama. Dimana potongan program ini diletakan pada interrupt timer 1 sehingga akan terus dipanggil apabila telah terjadi interrupt pada timer 1.
Output LED
Pada modul serial yang dibuat ini terdapat output LED yang memberikan tanda berupa parity yang diterima dan error yang terjadi apabila terjadi error. Error yang diperiksa adalah parity error, framing error dan overrun error. Parity Error akan terjadi apabila parity yang diterima dalah tidak sama dengan parity yang dibangkitkan oleh AT89C51 terhadap konfigurasi modul. Framming error adalah error yang terjadi karena stop bit yang diterima adalah salah. Sedangkan Overrun Error adalah error yang terjadi karena data pada buffer belum dipindahkan namun telah terjadi penerimaan data baru (data tertumpuk). Berikut ini adalah potongan program yang berfungsi untuk menampilakan output LED
Potongan Program 7 – Out
1: OUT:
2: CLR O_FLAG
3: JB NO_PAR,NOPARITYSELECT
4: SJMP PARITYSELECT
5: NOPARITYSELECT:
6: SETB PARITY
7: SETB P_ERROR
8: SJMP ERR_YG_LAIN
9: PARITYSELECT:
10: MOV C,R_DATA9
11: MOV PARITY,C
12: JC SATU
13: JNB PAR,NOLGENAP
14: JB PARBANGKIT0,TERJADIP_ERROR
15: SJMP NO_PAR_ERROR
16: NOLGENAP:
17: JB PARBANGKIT,TERJADIP_ERROR
18: SJMP NO_PAR_ERROR
19: SATU:
20: JNB PAR,SATUGENAP
21: JNB PARBANGKIT0,TERJADIP_ERROR
22: SJMP NO_PAR_ERROR
23: SATUGENAP:
24: JNB PARBANGKIT0,TERJADIP_ERROR
25: SJMP NO_PAR_ERROR
26: TERJADIP_ERROR:
27: CLR ERROR1
28: SJMP ERR_YG_LAIN
29: NO_PAR_ERROR:
30: SETB ERROR2
31: ERR_YG_LAIN:
32: ACALL FRAMMING_CHECK
33: ACALL OVERRUN_CHECK
34: END_TOTAL:
35: MOV C,ERROR1
36: MOV P_ERROR,C
37: MOV C,ERROR2
38: MOV O_ERROR,C
39: MOV C,ERROR3
40: MOV F_ERROR,C
Penjelasan program adalah sebagai berikut : pada baris 3 akan dilihat dulu konfigurasi dari status data, apabila no-parity maka parity dan parity error akan tidak aktif. Apabila ada parity maka akan dibangkitkan parity berdasar pada data yang telah diterima dan akan dibandingkan dengan parity yang diterima (baris 14, baris 17, baris 21, dan baris 24) apabila terjadi error maka LED akan dinyalakan dengan perintah ‘CLR ERROR1’. Kemudian akan dipanggilkan rutin framming_check dan overrun_check
Potongan Program 8 – Frame _Check:
1: FRAME_CHECK:
2: JNB NO_PAR,DATAKE9
3: JB STOP,SBITADA21
4: JNB R_DATA10,TERJADIFRAMMING
5: SJMP TIDAKTERJADIFRAMMING
6: SBITADA21:
7: JNB R_DATA10,TERJADIFRAMMING
8: JNB R_DATA11,TERJADIFRAMMING
9: SJMP TIDAKTERJADIFRAMMING
10: DATAKE9:
11: JB STOP,SBITADA2
12: JNB R_DATA9,TERJADIFRAMMING
13: SJMP TIDAKTERJADIFRAMMING
14: SBITADA2:
15: JNB R_DATA9,TERJADIFRAMMING
16: JNB R_DATA10,TERJADIFRAMMING
17: TIDAKTERJADIFRAMMING:
18: SETB ERROR3
19: SJMP KEMBALIFRAMMING
20: TERJADIFRAMMING:
21: CLR ERROR3
22: KEMBALIFRAMMING:
23: RET
Potongan program di atas hanya melihat apakah stop bit yang diterima adalah ‘1’ apabila ‘0’ maka akan ditampilakan pesan kesalahan, namun sebelum itu perlu dilihat dulu dimana letak stop bit dan ada berapa buah stop bit yang ada. Pengecekan jumlah stop bit dapat dilihat pada baris 3 dan baris 11. Sedangkan pengecekan awal stop bit dapat dilihat pada baris ke 2. Pada baris 18 dan baris 21 memberikan tampilan kesalahan pada LED.
Materi lain yang dapat di download :
2. Skematik rangkaian Modul UART dalam format PDF (Portable Data Format).
Oleh Susanto W.K
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
No comments:
Post a Comment