Senin, 04 Juni 2007

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:


Gambar 1

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 :

1. Assembly Listing

2. Skematik rangkaian Modul UART dalam format PDF (Portable Data Format).


Oleh Susanto W.K


◄ Newer Post Older Post ►