TEKS BERJALAN

SELAMAT DATANG DI WEB HENRY TORUAN

Kamis, 12 November 2009

PERCOBAAN 2 89S51

SAKLAR PUSH BUTTON

referensi dari internet

TUJUAN:

1. Mahasiswa memahami rangkaian mikrokontroller dengan interface ke saklar

2. Mahasiswa dapat memahami program assembly untuk mengambil data saklar dan mengeluarkan data ke LED.

3. Mahasiswa memahami beberapa instruksi assembly dasar, MOV, Setb, Clr, RL dan RR.



clip_image001
Gambar 2.1. Rangkaian Interface Push Button

Pada gambar 2.1 tersebut tampak rangkaian push button, bila saklar ditekan maka port sesuai dengan bit tersebut akan mendapat logika low ‘0’ dan sebaliknya bila saklar tidak ditekan maka port tersebut akan mendapat logika high ‘1’.

Percobaan 2.1. Ambil Data Saklar

Pada percobaan ini, LED akan nyala bila saklar ditekan sesuai dengan bit tersebut.
Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut:

1. Buka jumper pada EN_DAC apabila sedang terhubung.

2. Hubungkan modul Microcontroller Trainer dengan power supply +5V

3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer

4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program

5. Ketik program berikut ini:

Org 0h

Start: Mov A, P2 ;Ambil data dari P2 dan Simpan ke A

Mov P0, A ;Kirim data A ke P0

sjmp start

end

6. Simpanlah program yang anda ketik dan beri nama : prog21a.asm

7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.

8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software (Lihat Petunjuk Penggunaan)

9. Lakukan pengamatan pada LED.


Percobaan 2.2. Putar Kanan-Kiri

Pada percobaan ini, LED akan berjalan kekanan atau kekiri mengikuti penekanan tombol P2.0 atau P2.1.
Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut:

1. Hubungkan modul Microcontroller Trainer dengan power supply +5V

2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer

3. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program

4. Ketik program berikut ini:

org 0h

CekP20: JB P2.0,CekP21 ; Menguji bit P2.0, apakah adalah logika '1'

call RLeft ; Jika P2.0=0, maka LED putar kiri

CekP21: JB P2.1,CekP20 ; Menguji bit P2.1, apakah adalah logika '1'

call RRight ; Jika P2.1=0, maka LED putar kanan

sjmp CekP20 ; jump forever to CekP2.0

;================================================

;Subrutin ini digunakan untuk menggerakkan LED Ke Kanan

;================================================

RLeft: mov A,#11111110b;send data to Acc

RLeft1: mov P0,A ;send data to P0

call delay ;call delay time

JB P2.1,RLeft2 ;Menguji bit P2.1, apakah adalah logika '1'

sjmp EndRLeft ;Jika P2.1=0, maka lompat ke EndRLeft

RLeft2: RL A

sjmp RLeft1

EndRLeft: ret

;

;==============================================

;Subrutin ini digunakan untuk menggerakkan LED Ke Kiri

;==============================================

RRight: mov A,#01111111b ;send data to Acc

RRight1: mov P0,A ;send data to P0

call delay ;call delay time

JB P2.0,RRight2 ;Menguji bit P2.0, apakah adalah logika '1'

sjmp EndRRight ;Jika P2.0=0, maka lompat ke EndRRight

RRight2: RR A

sjmp RRight1

EndRRight: ret

;=======================================

;subroutine delay time

;=======================================

delay: mov R1,#255

del1: mov R2,#255

del2: djnz R2,del2

djnz R1,del1

ret

end

5. Simpanlah program yang anda ketik dan beri nama : prog22a.asm

6. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.

7. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)

8. Lakukan pengamatan pada LED.

9. Lakukan modifikasi pada percobaan tersebut sesuai dengan dengan mengganti port tersebut dengan P2.2 ( putar kanan ) dan P2.3 ( putar kiri ).


Selengkapnya...

Rabu, 11 November 2009

PERCOBAAN 1 89S51

DISPLAY LED

referensi dari internet

 

TUJUAN:

1. Mahasiswa memahami rangkaian mikrokontroller untuk menghidupkan dan mematikan LED.

2. Mahasiswa dapat memahami program assembly untuk menghidupkan dan mematikan LED

3. Mahasiswa memahami beberapa instruksi assembly dasar, MOV, Setb, Clr, RL dan RR.

4. Mahasiswa memahami pembuatan instruksi waktu tunda



clip_image001
Gambar 1.1 Rangkaian Display LED

Perhatikan pada gambar 1.1 tersebut. Delapan buah LED terhubung ke port 0, yang difungsikan sebagai output. Pada konfigurasi tersebut LED akan nyala bila diberi logika LOW ‘0’ melalui port 0, dan LED akan padam bila diberi logika HIGH ‘1’ melalui port 0. Agar Display LED ini dapat aktiv maka jumper EN LED harus dihubungkan singkat.

Percobaan 1.1. Instruksi MOV

Pada percobaan 1.1 ini LED akan dihidupkan/ dimatikan dengan mengirimkan data tertentu pada port 0.
Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut:

1. Hubungkan jumper pada LED_EN, untuk mengaktifkan 8 buah LED

2. Hubungkan modul Microcontroller Trainer dengan power supply +5

3. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer

4. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program

5. Ketik program berikut ini:

Org 0h

Start: Mov P0,#11110000b ; Menghidupkan 8 buah LED

sjmp start

End

6. Simpanlah program yang anda ketik dan beri nama : prog11a.asm

7. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.

8. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)

9. Lakukan pengamatan pada LED

10. Gantilah data tersebut diatas dengan data seperti pada tabel berikut dan lakukan pencatatan LED mana yang padam.

Percobaan 1.2. Pembuatan Subrutine Waktu Tunda

Pada percobaan ini, 8 LED akan berkedip secara kontinu.
Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut:

1. Hubungkan modul Microcontroller Trainer dengan power supply +5V

2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer

3. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program

4. Ketik program berikut ini:

Org 0h

Start: Mov P0,#11111111b ; Kirim data biner 11111111 ke P0

Call Delay ; Memanggil waktu tunda

Mov P0,#00000000b ; Kirim data biner 00000000 ke P0

Call Delay ; Memanggil waktu tunda

Sjmp start ;

Delay: mov R1,#255

Del1: mov R2,#255

Del2: djnz R2,del2

djnz R1,del1

ret

end

5. Simpanlah program yang anda ketik dan beri nama : prog12a.asm

6. Pada program MIDE pilih Build /F9 untuk melakukan kompilasi program dari *.asm ke *.hex.

7. Lakukan pemrograman mikrokontroller menggunakan Program ISP Software

8. Lakukan pengamatan pada LED

9. Gantilah data tersebut untuk mengedipkan sebuah LED, dua buah LED dan seterusnya

Percobaan 1.3. Instruksi Setb dan Clr

Pada percobaan ini, sebuah LED atau lebih dapat dihidupkan atau dimatikan dengan perintah setb dan clr.
Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut:

1. Hubungkan modul Microcontroller Trainer dengan power supply +5V

2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer

3. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program

4. Ketik program berikut ini:

Org 0h

Start: Clr P0.0 ; Mengirimkan logika ‘0’ ke P0.0

Sjmp start ; jump ke start

end

5. Simpanlah program yang anda ketik dan beri nama : prog13a.asm

6. Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.

7. Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)

8. Lakukan pengamatan pada LED

9. Gantilah data tersebut untuk menghidupkan LED yang lain: LED 2, LED 3, LED 4, LED 5, LED 6, LED 7 dan LED 8.

10. Lakukan percobaan berikut untuk mengedipkan LED 1, dengan mengetikka program berikut ini.

Org 0h

Start: Clr P0.0 ; Kirim logika ‘0’ ke P0.0

Clr P0.1 ; Kirim logika ‘0’ ke P0.1

Clr P0.2 ; Kirim logika ‘0’ ke P0.2

Clr P0.3 ; Kirim logika ‘0’ ke P0.3

Clr P0.4 ; Kirim logika ‘0’ ke P0.4

Clr P0.5 ; Kirim logika ‘0’ ke P0.5

Clr P0.6 ; Kirim logika ‘0’ ke P0.6

Clr P0.7 ; Kirim logika ‘0’ ke P0.7

Call Delay ; Memanggil waktu tunda

Setb P0.0 ; Kirim logika ‘1’ ke P0.0

Setb P0.1 ; Kirim logika ‘1’ ke P0.1

Setb P0.2 ; Kirim logika ‘1’ ke P0.2

Setb P0.3 ; Kirim logika ‘1’ ke P0.3

Setb P0.4 ; Kirim logika ‘1’ ke P0.4

Setb P0.5 ; Kirim logika ‘1’ ke P0.5

Setb P0.6 ; Kirim logika ‘1’ ke P0.6

Setb P0.7 ; Kirim logika ‘1’ ke P0.7

Sjmp start ; lompat ke start

;

Delay: mov R1,#255

Del1: mov R2,#255

Del2: djnz R2,del2

djnz R1,del1

ret

end

11. Rencanakan program untuk mengedipkan dua buah LED, tiga buah LED dan seterusnya dengan instruksi Setb dan Clr.

Percobaan 1.4. Instruksi RL/ RR ( Rotate Left dan Right )

Pada percobaan ini, sebuah LED akan berjalan dari kiri ke kanan dan sebaliknya, program ini memanfaatkan instruksi RL dan RR.
Untuk melakukan percobaan ini lakukan beberapa langkah sebagai berikut:

1. Hubungkan modul Microcontroller Trainer dengan power supply +5V

2. Hubungkan modul Microcontroller Trainer dengan rangkaian programmer

3. Buka Program M-IDE Studio for MCS-51, sebagai editor dan compiler program

4. Ketik program berikut ini:

Org 0H

Start: Mov A,#11111110b

Mov R0,#7

Kiri: Mov P2,A

Call Delay

RL A

DEC R0

CJNE R0,#0,Kiri

Mov R0,#7

Kanan: Mov P2,A

Call Delay

RR A

DEC R0

CJNE R0,#0,Kanan

Sjmp Start

;

Delay: mov R1,#255

Del1: mov R2,#255

Del2: djnz R2,del2

djnz R1,del1

ret

end

5. Simpanlah program yang anda ketik dan beri nama : prog14a.asm

6.Pada program MIDE tersebut pilih Build /F9 atau untuk melakukan kompilasi program dari *.asm ke *.hex.

7.Lakukan pemrograman mikrokontroller dengan menggunakan Program ISP Software ( Lihat Petunjuk Penggunaan)

8.Lakukan pengamatan pada LED

9.Lakukan perubahan pada program tersebut untuk menjalankan dua buah LED kekiri dan kekanan, tiga buah LED kekiri dan kekanan , dan seterusnya.


Selengkapnya...

KEIL C51 uVision3

oleh : Henry Toruan

Cara menggunakan KEIL C51 uVision3 (Editor,simulator dan compiler C serta downloader) untuk mikrokontroler 8051 :

1. Memulai proyek baru

Project>New uVision project>Pilih lokasinya>Isi nama file *.uv2>save

2. Memilih komponen target

Untuk memilih komponen target 89S52 pilih pada database Atmel>AT89S52>OK



clip_image002

Setelah muncul dialog box berikut pilih No

clip_image004

3. Untuk memulai memprogram dengan bahasa C, Pilih File>New. Pada jendela text ketikkan program rancangan dan simpan dengan memilih File>Save As> Isi namanya dengan akhiran c, contohnya code1.c dan file tersebut harus ditambahkan pada source group1.

clip_image006

4. Kemudian Pilih Rebuilt all target files

clip_image008

5. Kemudian Pilih Start Stop Debug Session

clip_image010

Kemudian Pilih Run untuk menjalankan simulasi dan Pilih perangkat keluaran dengan memilih Peripherals>I/O Ports>Port1 untuk kasus ini.

6. Untuk berhenti Pilih Halt dan untuk memulai dari awal Pilih Reset.

clip_image012

Pada saat simulasi berjalan akan tampak pada port 1.0 akan kedap – kedip.

clip_image014

7. Untuk membentuk file HEX, Pilih Flash>Configure Flash Tools

clip_image016


Selengkapnya...

Senin, 09 November 2009

Small Device C Compiler (MCS-51)

referensi dari internet

Mengapa SDCC ?

SDCC Merupakan open source , retargetable, optimizing C compiler yang pertama kali dikembangkan oleh Sandeep Dutta untuk mikrokontroller/mikroprosesor 8-bit, SDCC mendukung beberapa arsitektur mikrokontroller/mikroprosessor 8-bit antara lain: Intel MCS-51,Zilog Z80, Atmel AVR, Microchip PIC, Freescale (Motorola) HC08. Disini kita akan bahas penggunaan SDCC untuk MCS-51 Family yang cukup banyak dipakai saat ini



Pemrograman dengan bahasa C lebih mudah di bandingkan menggunakan bahasa assembly (bahasa mesin), SDCC merupakan C compiler gratis (freeware) sehingga anda tidak perlu mengeluarkan biaya untuk membeli compiler komersial yang harganya cukup mahal, dari segi code yang dihasilkan optimasi sdcc sangat bagus

Sebelumnya anda sudah harus mengerti pemrogramman dasar menggunakan bahasa C untuk PC

Instalasi SDCC

Sebelum anda bereksperimen dengan SDCC maka sebelumnya anda harus menginstall SDCC pada komputer anda.

langkah - langkah Instalasi SDCC :

1. Download Win 32 SDCC Setup file pada situs sdcc.sourceforge.net

2. Jalankan file setup yang telah anda download tadi

3. Ikuti langkah yang mucul pada dialog yang muncul, dan gunakan nilai defaultnya, terakhir ketika installer menanyakan untuk menambah path ke system path, pilih Yes sehingga anda akan dapat meng-compile dari sembarang folder

4. Setelah selesai restart komputer anda.

5. Test apakah SDCC sudah terinstall dengan benar, dengan masuk ke command prompt ketik sdcc -v untuk menampilkan versi sdcc yang anda install, berikut langkahnya :

a) Klik Start->Run kemudian ket ik cmd , klik Ok maka akan muncul window command prompt

b) Ketik sdcc -v, jika tampil versi SDCC maka SDCC telah terinstall dengan benar

image

Tipe Data

SDCC medukung beberapa tipe data standar sebagai berikut :

· bool 1 Bit (0,1)

· char 8 bits (signed -128~+127, unsigned 0~255)

· int 16 bits (signed -32768~ +32767, unsigned 0~ +65535)

· long 32 bits(signed -2147483648~ +2147483647, unsigned 0~ +4294967296)

· float 32 bits (4 bytes IEEE 754)

SDCC juga mendukung tipe data spesifik sesuai dengan arsitektur MCS 51 antara lain :

near/data
mendeklarasikan variabel menggunakan storage class near/data akan menyebabkan variabel diletakkan dalam directly Adressable RAM MCS-51 (internal RAM), MCS-51 mempunyai 128 directly Adressable RAM MCS-51

far/xdata
mendeklarasikan variabel menggunakan storage class far/xdata akan menyebabkan variabel diletakkan dalam RAM eksternal

idata
mendeklarasikan variabel menggunakan storage class idata akan menyebabkan variabel diletakkan dalam indirectly Adressable memory

code
mendeklarasikan variabel menggunakan storage class code akan menyebabkan varibel diletakkan dalam program memory, variabel ini mempunyai sifat read-only (constant) dan biasanya digunakan untuk menyimpan suatu look up table/konstanta

#include <at89x51.h>

code unsigned char pola[10] = {0x00,0xff,0xF0,0x0f,0x81}; // Tabel llok

void delay()

{

int i;

for(i=0;i<50000;i++); // Loop 50000 kali

}

void main(void)

{

data unsigned char i = 0;

while (1) // program loop

{

P0 = pola[i++];

delay();

if (i==5)

i=0;

}

}

bit
Deklarasi variabel menggunakan storage class bit akan menyebabkan variabel ini disimpan dalam bit adressable memory pada MCS-51, jumlah total variabel ini adalah 128 (MCS-51 hanya mempunyai 128 bit-adressable memory)

sfr
storage class sfr digunakan untuk mengakses Special Function Register (SFR) MCS-51

sbit
storage class sbit digunakan untuk mengakses Bit Adressable pada Special Function Register (SFR) MCS-51

In line Assembler

Anda dapat menyisipkan kode assember MCS-51 dalam program c anda ( in line Assembler), dengan dimulai keyword _asm dan di akhiri oleh keyword _endasm; contoh:

#include <at89x51.h> // header, definisi port ada pada file ini

_asm

mov P1,#200

mov P2,#255

nop

nop

_endasm;

I/O Port Acess

I/O Port access dapat langsung dilakukan dengan memberikan nilai pada nama port yang ingin anda akses, port yang tersedia disesuaikan mikrokontroler yang digunakan. Nama port haruslah huruf kapital mis: P0,P1,P2,P3 sesuai dengan file header, penggunaan huruf kecil akan menimbulkan kesalahan, contoh:

#include <at89x51.h> // header, definisi port ada pada file ini

P1 = 0xF0 ; // memberikan nilai 0x kepada port 1

P2 = 200 ; // memberikan nilai 200 kepada port 2

i = P2 ; // membaca nilai pada P2 dan nilainya di berikan ke variabel i

akses port secara bit dilakukan dengan cara menggukanan keyword PX_Y , sesuai dengan definisi di file headernya, X diganti dengan port yang akan diakses, sedangkan Y diganti dengan dengan bit yang akan di akses, mis: P1_0 artinya Port 1 bit ke 0 (P1.0) , bit hanya mempunyai dua keadaan logika yaitu on(1)/off(0). Berikut contoh pengaksesan port secara bit:

#include <at89x51.h> // header, definisi port ada pada file ini

bit i;

P1_0 = 1 ; // memberikan nilai 1 kepada port P1.0

P1_1 = 0 ; // memberikan nilai 0 kepada port P1.1

i = P1_0 ; // membaca nilai pada P1.0 dan nilainya di berikan ke variabel i

Definisi file header device untuk SDCC dapat dilihat pada folder include-mcs51 berikut merupakan contoh header, penggunaan file header ini disesuaikan dengan mikrokontroller yang digunakan.

#ifndef AT89x51_H

#define AT89x51_H

/* BYTE addressable registers */

__sfr __at 0x80 P0 ;

__sfr __at 0x81 SP ;

__sfr __at 0x82 DPL ;

__sfr __at 0x83 DPH ;

__sfr __at 0x87 PCON ;

__sfr __at 0x88 TCON ;

__sfr __at 0x89 TMOD ;

__sfr __at 0x8A TL0 ;

__sfr __at 0x8B TL1 ;

__sfr __at 0x8C TH0 ;

__sfr __at 0x8D TH1 ;

__sfr __at 0x90 P1 ;

__sfr __at 0x98 SCON ;

__sfr __at 0x99 SBUF ;

__sfr __at 0xA0 P2 ;

__sfr __at 0xA8 IE ;

__sfr __at 0xB0 P3 ;

__sfr __at 0xB8 IP ;

__sfr __at 0xD0 PSW ;

__sfr __at 0xE0 ACC ;

__sfr __at 0xE0 A ;

__sfr __at 0xF0 B ;

/* BIT addressable registers */

/* P0 */

__sbit __at 0x80 P0_0 ;

__sbit __at 0x81 P0_1 ;

__sbit __at 0x82 P0_2 ;

__sbit __at 0x83 P0_3 ;

__sbit __at 0x84 P0_4 ;

__sbit __at 0x85 P0_5 ;

__sbit __at 0x86 P0_6 ;

__sbit __at 0x87 P0_7 ;

/* TCON */

__sbit __at 0x88 IT0 ;

__sbit __at 0x89 IE0 ;

__sbit __at 0x8A IT1 ;

__sbit __at 0x8B IE1 ;

__sbit __at 0x8C TR0 ;

__sbit __at 0x8D TF0 ;

__sbit __at 0x8E TR1 ;

__sbit __at 0x8F TF1 ;

/* P1 */

__sbit __at 0x90 P1_0 ;

__sbit __at 0x91 P1_1 ;

__sbit __at 0x92 P1_2 ;

__sbit __at 0x93 P1_3 ;

__sbit __at 0x94 P1_4 ;

__sbit __at 0x95 P1_5 ;

__sbit __at 0x96 P1_6 ;

__sbit __at 0x97 P1_7 ;

/* SCON */

__sbit __at 0x98 RI ;

__sbit __at 0x99 TI ;

__sbit __at 0x9A RB8 ;

__sbit __at 0x9B TB8 ;

__sbit __at 0x9C REN ;

__sbit __at 0x9D SM2 ;

__sbit __at 0x9E SM1 ;

__sbit __at 0x9F SM0 ;

/* P2 */

__sbit __at 0xA0 P2_0 ;

__sbit __at 0xA1 P2_1 ;

__sbit __at 0xA2 P2_2 ;

__sbit __at 0xA3 P2_3 ;

__sbit __at 0xA4 P2_4 ;

__sbit __at 0xA5 P2_5 ;

__sbit __at 0xA6 P2_6 ;

__sbit __at 0xA7 P2_7 ;

/* IE */

__sbit __at 0xA8 EX0 ;

__sbit __at 0xA9 ET0 ;

__sbit __at 0xAA EX1 ;

__sbit __at 0xAB ET1 ;

__sbit __at 0xAC ES ;

__sbit __at 0xAF EA ;

/* P3 */

__sbit __at 0xB0 P3_0 ;

__sbit __at 0xB1 P3_1 ;

__sbit __at 0xB2 P3_2 ;

__sbit __at 0xB3 P3_3 ;

__sbit __at 0xB4 P3_4 ;

__sbit __at 0xB5 P3_5 ;

__sbit __at 0xB6 P3_6 ;

__sbit __at 0xB7 P3_7 ;

__sbit __at 0xB0 RXD ;

__sbit __at 0xB1 TXD ;

__sbit __at 0xB2 INT0 ;

__sbit __at 0xB3 INT1 ;

__sbit __at 0xB4 T0 ;

__sbit __at 0xB5 T1 ;

__sbit __at 0xB6 WR ;

__sbit __at 0xB7 RD ;

/* IP */

__sbit __at 0xB8 PX0 ;

__sbit __at 0xB9 PT0 ;

__sbit __at 0xBA PX1 ;

__sbit __at 0xBB PT1 ;

__sbit __at 0xBC PS ;

/* PSW */

__sbit __at 0xD0 P ;

__sbit __at 0xD1 FL ;

__sbit __at 0xD2 OV ;

__sbit __at 0xD3 RS0 ;

__sbit __at 0xD4 RS1 ;

__sbit __at 0xD5 F0 ;

__sbit __at 0xD6 AC ;

__sbit __at 0xD7 CY ;

/* BIT definitions for bits that are not directly accessible */

/* PCON bits */

#define IDL 0x01

#define PD 0x02

#define GF0 0x04

#define GF1 0x08

#define SMOD 0x80

#define IDL_ 0x01

#define PD_ 0x02

#define GF0_ 0x04

#define GF1_ 0x08

#define SMOD_ 0x80

/* TMOD bits */

#define M0_0 0x01

#define M1_0 0x02

#define C_T0 0x04

#define GATE0 0x08

#define M0_1 0x10

#define M1_1 0x20

#define C_T1 0x40

#define GATE1 0x80

#define M0_0_ 0x01

#define M1_0_ 0x02

#define C_T0_ 0x04

#define GATE0_ 0x08

#define M0_1_ 0x10

#define M1_1_ 0x20

#define C_T1_ 0x40

#define GATE1_ 0x80

#define T0_M0 0x01

#define T0_M1 0x02

#define T0_CT 0x04

#define T0_GATE 0x08

#define T1_M0 0x10

#define T1_M1 0x20

#define T1_CT 0x40

#define T1_GATE 0x80

#define T0_M0_ 0x01

#define T0_M1_ 0x02

#define T0_CT_ 0x04

#define T0_GATE_ 0x08

#define T1_M0_ 0x10

#define T1_M1_ 0x20

#define T1_CT_ 0x40

#define T1_GATE_ 0x80

#define T0_MASK 0x0F

#define T1_MASK 0xF0

#define T0_MASK_ 0x0F

#define T1_MASK_ 0xF0

/* Interrupt numbers: address = (number * 8) + 3 */

#define IE0_VECTOR 0 /* 0x03 external interrupt 0 */

#define TF0_VECTOR 1 /* 0x0b timer 0 */

#define IE1_VECTOR 2 /* 0x13 external interrupt 1 */

#define TF1_VECTOR 3 /* 0x1b timer 1 */

#define SI0_VECTOR 4 /* 0x23 serial port 0 */

#endif

Interrupt Routine

Interrupt/Interrupsi adalah pembelokan(vector) eksekusi program utama ke suatu program interrupt (intterupt routine). Interupsi diakibatkan oleh suatu event yang telah ditentukan sebelumnya mis: timer overflow, serial port, external interrupt. interrupt routine ini dikenal dengan istilah ISR (Interrupt Service Routine).

interrupt Routine di implementasikan dengan format sebagai berikut :

void nama_fungsi_interrupt (void) interrupt nomor_interrupt using nomor_bank

{

...

}

nama_fungsi_intterupt adalah nama fungsi yang dapat berupa sembarang nama yang valid untuk sebuah fungsi, nomor_interrupt disesuaikan dengan jenis interrupt yang akan di handle oleh fungsi ini sesuai dengan tabel dibawah, sedangkan nomor_bank merupakan parameter opsional unttuk memilih bank yang akan digunakan untuk menyimpan variabel dalam routine interrupt ini.

image

Aturan dalam penggunaan interrupt :

  • Variabel global yang digunakan/diakses dari ISR harus dideklarasikan volatile, agar compiler tidak melakukan optimisasi pada varibel ini
  • Hindari memangil suatu fungsi dari ISR, jika harus dilakukan maka fungsi harus dideklarasikan sebagai reentrant
  • Disable intterupt ketika melakukan operasi yang menggunakan data 16 bit /32 bit

Contoh :

#include <at89x51.h> // header

volatile unsigned char n ; // variabel global

void SerialISR (void) interrupt 4

{

if (RI)

{

n = SBUF; // Save Rx byte

RI = 0; // Reset Rx interrupt flag

}

else if (TI)

{

SBUF = n; // Load byte to Tx

TI = 0; // Reset Tx interrupt flag

}

}

void main(void)

{

// 1. Inisialissasi Serial Port

EA = 0; // Disable global interrupt mask

SCON1 = 0x50; // Set UART to 8N1, Rx enabled

TMOD |= 0x20; // Set Timer 1 as Mode 2

TH1 = 0xDD; // Set SCI_1 for 2400 baud

TR1 = 1; // Enable Timer 1

ES = 1; // Enable interrupts for serial port

EA = 1; // Enable global interrupt mask

// 2. mengirim data (Tx) 0x53

n = 0x53 ;

SBUF1 = n;

// 3. Program loop...

while (1);

}

Model Memory

SDCC mendukung dua model memory yaitu :

· Small (RAM internal)

· Large (RAM eksternal)

Secara default SDCC akan menggunakan model memory small, dan semua variabel tanpa storage class akan dilokasikan di RAM Internal, ketika menggunakan model memory large maka semua variabel tanpa storage class akan dialokasikan di RAM eksternal. untuk menggunakan model memory large maka pada saat compile harus diikutkan parameter --model-large contoh :

sdcc --model-large nama_file_source.c

Langkah Pemrogramman

1. Pembuatan source program, pembuatan source program dapat dilakukan menggunakan sembarang teks editor mis : notepad, tetapi langkah baiknya jika dibuat di teks editor yang mempunyai fasilitas syntax highlighting (Programmer Notepad), kemudian simpan file source yang telah dibuat dengan ekstensi .c

2. Compile source program, jika terjadi kesalahan cek kesalahan sesuai dengan pesan yang muncul, setelah proses compile berhasil maka akan terbentuk suatu file hex(.ihx) yang merupakan kode biner dari program yang telah kita buat.

3. Pemrograman ke dalam mikrokontroller menggunakan programmer, file hex siap untuk di masukkan kedalam mikrokontroller

4. Mikrokontroller dijalankan pada rangkainnya (Run)

sdcc nama_file_source.c


Selengkapnya...

Minggu, 08 November 2009

Perangkat H/W dan S/W 89S51

referensi dari internet

1. Compiler MIDE Studio

M-IDE Studio adalah salah satu cara yang digunakan untuk menjalankan kompilasi untuk divais MCS-51. M-IDE Studio mempunyai beberapa fitur yang dapat digunakan untuk edit, compil, dan debug file.
The M-IDE Studio juga dapat digunakan untuk menulis program dalam bahasa C. Dengan menggunakan software ini, maka kita dapat melihat error pada report file LST.



clip_image001

Gambar 1.19. M-IDE Studio

Bila anda perhatikan pada menu toolbar dan menu pilihan, tampak terlihat disable. Hal ini karena file belum dibuat. Untuk membuat sebuah file, lakukan langkah-langkah berikut:

1. Membuat File Baru
Untuk membuat file baru, klik pada menu File atau short cut seperti yang ditunjukkan pada gambar, sehingga akan tampak halaman kosong.

clip_image002

Figure 1.20. File baru dengan halaman kosong

2. Menulis sebuah program

Tulis program assembly pada halaman kosong, dan lakukan penyimpanan file. Bila file telah tersimpan maka akan tampak teks instruksi yang berwarna-warni. Sebagaimana yang ditunjukan pada gambar 3.

clip_image003

Gambar 1.21 Menu penyimpanan file

3. Kompilasi

Agar file dengan ekstensi ASM tersebut dapat diloadkan ke mikrokontroller, maka perlu dilakukan kompilasi dari file ASM ke HEX.

clip_image004

Gambar 1.22 Kompilasi file

4. Debug

clip_image005

Gambar 1.23 Debug file

Hardware dan program downloader

clip_image007

Gambar Sistem minimum AT89S51

clip_image009 clip_image011

Gambar Downloader


Program downloader dapat menggunakan AEC_ISP dengan tahapan berikut untuk mendownload program :

MASUK KE TAMPILAN AEC_ISP, KEMUDIAN PILIHLAH MENU
<A>. LOAD HEX FILE TO FLASH BUFFER <ENTER>
KEMUDIAN MUNCUL TULISAN
INPUT FILE NAME : <KETIK NAMA FILE LENGKAP DENGAN HEX NYA> <ENTER>
CONTOH :
INPUT FILE NAME : LAT1.HEX <ENTER>

3. PILIH MENU
<E>. PROGRAM <ENTER>
TUNGGU SAMPAI 100 % <ENTER>

4. PILIH MENU
<I>. RESET

Note :

Bila menggunakan pengolah kata sebagai editor asemblinya, untuk mempermudah pekerjaan anda dalam mengkompilasi program tersebut, dapat dilakukan :

1. Buat file A.bat dengan listing sebagai berikut :

x8051 %1 -d
pause
l8051 -c %1
del %1.obj
del %1.lst
aec_isp

ingat untuk mengkopikan program x8051.exe dan l8051.exe pada direktori yang sama dengan data.

2. UNTUK PROSES KOMPILASI LAKUKAN LANGKAH BERIKUT:

1. KETIK DI PROMPT C:\A <NAMA FILE> <ENTER>
MISAL : C:\A LAT1 <ENTER>
C:\ <ENTER>
2. HASIL KOMPILASI ADALAH FILE DENGAN EKSTENSI *.HEX
ANDA AKAN MASUK KE TAMPILAN AEC_ISP

dan lakukan hal seperti diatas.


Selengkapnya...

Jumat, 06 November 2009

Pengalamatan 8051

referensi dari internet


Pengalamatan

Mode pengalamatan, mengacu bagaimana anda mengalamati suatu lokasi memori tertentu Mode pengalamatan pada set instruksi 8051 adalah ditunjukkan sebagai berikut

Immediate Addressing MOV A,#20h
Direct Addressing MOV A,30h
Indirect Addressing MOV A,@R0
External Direct MOVX A,@DPTR
Code Indirect MOVC A,@A+DPTR

1. Immediate Addressing
Immediate addressing dinamakan seperti ini, karena nilai yang akan disimpan didalam memori, secara langsung berada dalam kode.

image

Immediate addressing adalah pengalamatan yang sangat cepat karena nilai yang akan diloadkan berada didalam instruksi tersebut.

2. Direct Addressing
Disebut direct addressing karena nilai yang akan disimpan didalam memori, diperoleh secara langsung dari memori yang lain.

image

3. Indirect Addressing
Indirect addressing adalah mode pengalamatan yang sangat ampuh, yang memberikan fleksibelitas dalam hal transfer data. Indirect addressing juga satu-satunya cara untuk mengakses 128 byte ekstra dari internal RAM yang ditemukan pada keluarga 8052.

MOV A,@R0

Instruksi ini menyebabkan 8051 menganalisa nilai dari register R0. 8051 kemudian akan mengambil data dari akumulator dengan nilai yang berasal dari alamat RAM internal yang ditunjukkan oleh R0. Sebagai contoh, misal R0 akan digunakan untuk menandai alamat RAM 40h yang berisi data 67h. Ketika instruksi diatas, dieksekusi maka 8051 akan melihat nilai dari R0, yang berisi 40h, dan mengirimkan isi RAM 40h (dalam hal ini mempunyai nilai 67h) ke akumulator.

MOV R0,#99h ;
MOV @R0,#01h;

Instruksi tersebut adalah tidak valid. Karena indirect addressing selalu mengacu ke RAM internal, dua instruksi ini akan menulis nilai 01 ke RAM internal alamat 99h pada 8052. Pada 8051 instruksi tersebut akan menghasilkan hasil yang tak terdifinisi, karena 8051 hanya mempunyai internal RAM 128 byte

image ;

Selengkapnya...

Kamis, 05 November 2009

Organisasi Memori 8051

referensi dari internet

Semua divais 8051 mempunyai ruang alamat yang terpisah untuk memori program dan memori data, seperti yang ditunjukkan pada gambar1.1. dan gambar 1.2. Pemisahan secara logika dari memori program dan data, mengijinkan memori data untuk diakses dengan pengalamatan 8 bit, yang dengan cepat dapat disimpan dan dimanipulasi dengan CPU 8 bit. Selain itu, pengalamatan memori data 16 bit dapat juga dibangkitkan melalui register DPTR. Memori program ( ROM, EPROM dan FLASH ) hanya dapat dibaca, tidak ditulis. Memori program dapat mencapai sampai 64K byte. Pada 89S51, 4K byte memori program terdapat didalam chip. Untuk membaca memori program eksternal mikrokontroller mengirim sinyal PSEN ( program store enable )

clip_image001

Gambar 1.1. Diagram blok mikrokontroller 8051

Memori data ( RAM ) menempati ruang alamat yang terpisah dari memori program. Pada keluarga 8051, 128 byte terendah dari memori data, berada didalam chip. RAM eksternal (maksimal 64K byte). Dalam pengaksesan RAM Eksternal, mikrokontroller mingirimkan sinyal RD ( baca ) dan WR ( tulis ).

clip_image002clip_image003

Gambar 1.2. Arsitektur Memori Mikrokontroller 8051

1. Program Memory
Gambar 1.2. menunjukkan suatu peta bagian bawah dari memori program. Setelah reset CPU mulai melakukan eksekusi dari lokasi 0000H. Sebagaimana yang ditunjukkan pada gambar 1.3, setiap interupsi ditempatkan pada suatu lokasi tertentu pada memori program. Interupsi menyebabkan CPU untuk melompat ke lokasi dimana harus dilakukan suatu layanan tertentu.
Interupsi Eksternal 0, sebagi contoh, menempatai lokasi 0003H. Jika Interupsi Eksternal 0 akan digunakan, maka layanan rutin harus dimulai pada lokasi 0003H. Jika interupsi ini tidak digunakan, lokasi layanan ini dapat digunakan untuk berbagai keperluan sebagai Memori Program.

clip_image004

Gambar 1.3. Peta Interupsi mikrokontroller 8051

2. Memory Data
Pada gambar 1.2. menunjukkan ruang memori data internal dan eksternal pada keluarga 8051. CPU membangkitkan sinyal RD dan WR yang diperlukan selama akses RAM eksternal. Memori data internal terpetakan seperti pada gambar 1.2. Ruang memori dibagi menjadi tiga blok, yang diacukan sebagai 128 byte lower, 128 byte upper dan ruang SFR.
Alamat memori data internal selalu mempunyai lebar data satu byte. Pengalamatan langsung diatas 7Fh akan mengakses satu alamat memori, dan pengalamatan tak langsung diatas 7Fh akan mengakses satu alamat yang berbeda. Demikianlah pada gambar 1.4 menunjukkan 128 byte bagian atas dan ruang SFR menempati blok alamat yang sama, yaitu 80h sampai dengan FFh, yang sebenarnya mereka terpisah secara fisik
128 byte RAM bagian bawah dikelompokkan lagi menjadi beberapa blok, seperti yang ditunjukkan pada gambar 1.5. 32 byte RAM paling bawah, dikelompokkan menjadi 4 bank yang masing-masing terdiri dari 8 register. Instruksi program untuk memanggil register-register ini dinamai sebagai R0 sampai dengan R7. Dua bit pada Program Status Word (PSW) dapat memilih register bank mana yang akan digunakan. Penggunaan register R0 sampai dengan R7 ini akan membuat pemrograman lebih efisien dan singkat, bila dibandingkan pengalamatan secara langsung.

clip_image006

Gambar 1.4. Memori data internal

clip_image008

Gambar 1.5. RAM internal 128 byte paling bawah

Semua pada lokasi RAM 128 byte paling bawah dapat diakses baik dengan menggunakan pengalamatan langsung dan tak langsung. 128 byte paling atas hanya dapat diakses dengan cara tak langsung, gambar 1.6.

clip_image009

Gambar 1.6. RAM internal 128 byte paling atas

3. Special Function Register

Sebuah peta memori yang disebut ruang special function register ( SFR ) ditunjukkan pada gambar berikut. Perhatikan bahwa tidak semua alamat-alamat tersebut ditempati, dan alamat-alamat yang tak ditempati tidak diperkenankan untuk diimplementasikan. Akses baca untuk alamat ini akan menghasilkan data random, dan akses tulis akan menghasilkan efek yang tak jelas.
Accumulator
ACC adalah register akumulator. Mnemonik untuk instruksi spesifik akumulator ini secara sederhana dapat disingkat sebagai A.
Register B
Register B digunakan pada saat opersi perkalian dan pembagian. Selain untuk keperluan tersebut diatas, register ini dapat digunakan untuk register bebas.
Program Status Word
Register PSW terdiri dari informasi status dari program yang secara detail ditunjukkan pada Tabel 1.1.
Stack Pointer
Register Pointer stack mempunyai lebar data 8 bit. Register ini akan bertambah sebelum data disimpan selama eksekusi push dan call. Sementara stack dapat berada disembarang tempat RAM. Pointer stack diawali di alamat 07h setelah reset. Hal ini menyebabkan stack untuk memulai pada lokasi 08h.
Data Pointer
Pointer Data (DPTR) terdiri dari byte atas (DPH) dan byte bawah (DPL). Fungsi ini ditujukan untuk menyimpan data 16 bit. Dapat dimanipulasi sebagai register 16 bit atau dua 8 bit register yang berdiri sendiri.

clip_image011

Gambar 1.7. Peta SFR

Ports 0, 1, 2 dan 3

P0, P1, P2 dan P3 adalah SFR yang ditempati oleh Port 0, 1, 2 dan 3. Menulis suatu logika 1 terhadap sebuah bit dari sebuah port SFR ( P0, P1, P2 atau P3) menyebabkan pin output port yang bersesesuaian akan berada dalam kondisi logika high ‘1’. Dan sebaliknya

Buffer Data Serial
Buffer serial sesungguhnya merupakan dua buah register yang terpisah, buffer pemancar dan buffer penerima. Ketika data diisikan ke SBUF, maka akan menuju ke buffer pemancar dan ditahan untuk proses transmisi. Ketika data diambil dari SBUF, maka akan berasal dari buffer penerima.

Registers Timer
Pasangan register ( TH0, TL0) dan (TH1, TL1) adalah register pencacah 16 bit untuk Timer/ Counter 0 dan 1, masing-masing.

Register Control
Registers IP, IE, TMOD, TCON, SCON, dan PCON terdiri dari bit control dan status.

Program Status Word
PSW atau Program Status Word berisi bit-bit status yang berkaitan dengan kondisi atau keadaan CPU mikrokontroler pada saat tersebut. PSW berada dalam lokasi ruang SFR ( perhatikan pada gambar 1.9, dengan lokasi alamat D0h ). Pada PSW ini kita dapat memantau beberapa status yang meliputi: carry bit, auxiliary carry ( untuk operasi BCD ), dua bit pemilih bank register, flag overflow, sebuah bit paritas dan dua flag status yang bisa didifinisikan sendiri. Bit carry dapat juga anda guakan pada keperluan operasi aritmatika, juga bisa digunakan sebagai universal akumulator untuk beberapa operasi boolean.

Table 1.2.1 Program Status Word

clip_image002

Bit RS0 dan RS1 dapat digunakan untuk memilih satu dari empat bank register sebagaimana ditunjukkan pada tabel 19.2. Bit paritas dapat digunakan untuk mengetahuai jumlah logika '1' pada akumulator: P=1 bila pada akumulator mempunyai logika '1' yang jumlahnya ganjil, dan P=0 jika akumulator mempunyai logika '1' yang jumlahnya genap. Dua bit yang lain PSW1 dan PSW5 dapat digunakan untuk berbagai macam tujuan

Tabel 1. 2. Alamat rekening bank

clip_image002[5] Selengkapnya...

Rabu, 04 November 2009

Interupsi 8051

referensi dari internet


8051 mempunyai 5 buah sumber interupsi. Dua buah interupsi eksternal, dua buah interupsi timer dan sebuah interupsi port serial.
Meskipun memerlukan pengertian yang lebih mendalam, pengetahuan mengenai interupsi sangat membantu mengatasi masalah pemrograman mikroprosesor/mikrokontroler dalam hal menangani banyak peralatan input/output. Pengetahuan mengenai interupsi tidak cukup hanya dibahas secara teori saja, diperlukan contoh program yang konkrit untuk memahami.
Saat kaki RESET pada IC mikroprosesor/mikrokontroler menerima sinyal reset (pada MCS51 sinyal tersebut berupa sinyal ‘1’ sesaat, pada prosesor lain umumnya merupakan sinyal ‘0’ sesaat), Program Counter diisi dengan sebuah nilai. Nilai tersebut dinamakan sebagai vektor reset (reset vector), merupakan nomor awal memori-program yang menampung program yang harus dijalankan.
Pembahasan di atas memberi gambaran bahwa proses reset merupakan peristiwa perangkat keras (sinyal reset diumpankan ke kaki Reset) yang dipakai untuk mengatur kerja dari perangkat lunak, yakni menentukan aliran program prosesor (mengisi Program Counter dengan vektor reset).
Program yang dijalankan dengan cara reset, merupakan program utama bagi prosesor.

Peristiwa perangkat keras yang dipakai untuk mengatur kerja dari perangkat lunak, tidak hanya terjadi pada proses reset, tapi terjadi pula dalam proses interupsi.
Dalam proses interupsi, terjadinya sesuatu pada perangkat keras tertentu dicatat dalam flip-flop khusus, flip-flop tersebut sering disebut sebagai ‘petanda’ (flag), catatan dalam petanda tersebut diatur sedemikian rupa sehingga bisa merupakan sinyal permintaan interupsi pada prosesor. Jika permintaan interupsi ini dilayani prosesor, Program Counter akan diisi dengan sebuah nilai. Nilai tersebut dinamakan sebagai vektor interupsi (interrupt vector), yang merupakan nomor awal memori-program yang menampung program yang dipakai untuk melayani permintaan interupsi tersebut.
Program yang dijalankan dengan cara interupsi, dinamakan sebagai program layanan interupsi (ISR - Interrupt Service Routine). Saat prosesor menjalankan ISR, pekerjaan yang sedang dikerjakan pada program utama sementara ditinggalkan, selesai menjalankan ISR prosesor kembali menjalankan program utama, seperti yang digambarkan dalam Gambar 1.

clip_image013

Gambar 1.8 Bagan kerja prosesor melayani interupsi

Sebuah prosesor bisa mempunyai beberapa perangkat keras yang merupakan sumber sinyal permintaan interupsi, masing-masing sumber interupsi dilayani dengan ISR berlainan, dengan demikian prosesor mempunyai beberapa vektor interupsi untuk memilih ISR mana yang dipakai melayani permintaan interupsi dari berbagai sumber. Kadang kala sebuah vektor interupsi dipakai oleh lebih dari satu sumber interupsi yang sejenis, dalam hal semacam ini ISR bersangkutan harus menentukan sendiri sumber interupsi mana yang harus dilayani saat itu.
Jika pada saat yang sama terjadi lebih dari satu permintaan interupsi, prosesor akan melayani permintaan interupsi tersebut menurut perioritas yang sudah ditentukan, selesai melayani permintaan interupsi perioritas yang lebih tinggi, prosesor melayani permintaan interupsi berikutnya, baru setelah itu kembali mengerjakan program utama.
Saat prosesor sedang mengerjakan ISR, bisa jadi terjadi permintaan interupsi lain, jika permintaan interupsi yang datang belakangan ini mempunyai perioritas lebih tinggi, ISR yang sedang dikerjakan ditinggal dulu, prosesor melayani permintaan yang perioritas lebih tinggi, selesai melayani interupsi perioritas tinggi prosesor meneruskan ISR semula, baru setelah itu kembali mengerjakan program utama. Hal ini dikatakan sebagai interupsi bertingkat (nested interrupt), tapi tidak semua prosesor mempunyai kemampuan melayani interupsi secara ini.

1. Sumber interupsi MCS51
Seperti terlihat dalam Gambar 2, AT89C51 mempunyai 6 sumber interupsi, yakni Interupsi External (External Interrupt) yang berasal dari kaki INT0 dan INT1, Interupsi Timer (Timer Interrupt) yang berasal dari Timer 0 maupun Timer 1, Interupsi Port Seri (Serial Port Interrupt) yang berasal dari bagian penerima dan bagian pengirim Port Seri.
Di samping itu AT89C52 mempunyai 2 sumber interupsi lain, yakni Interupsi Timer 2 bersumber dari Timer 2 yang memang tidak ada pada AT89C51.

Bit IE0 (atau bit IE1) dalam TCON merupakan petanda (flag) yang menandakan adanya permintaan Interupsi Eksternal. Ada 2 keadaan yang bisa meng-aktip-kan petanda ini, yang pertama karena level tegangan ‘0’ pada kaki INT0 (atau INT1), yang kedua karena terjadi transisi sinyal ‘1’ menjadi ‘0’ pada kaki INT0 (atau INT1). Pilihan bentuk sinyal ini ditentukan lewat bit IT0 (atau bit IT1) yang terdapat dalam register TCON.
1. Kalau bit IT0 (atau IT1) =’0’ maka bit IE0 (atau IE1) dalam TCON menjadi ‘1’ saat kaki INT0=’0’.
2. Kalau bit IT0 (atau IT1) =’1’ maka bit IE0 (atau IE1) dalam TCON menjadi ‘1’ saat terjadi transisi sinyal ‘1’ menjadi ‘0’ pada kaki INT0.
Menjelang prosesor menjalankan ISR dari Interupsi Eksternal, bit IE0 (atau bit IE1) dikembalikan menjadi ‘0’, menandakan permintaan Interupsi Eksternal sudah dilayani. Namun jika permintaan Interupsi Ekternal terjadi karena level tegangan ‘0’ pada kaki IT0 (atau IT1), dan level tegangan pada kaki tersebut saat itu masih =’0’ maka bit IE0 (atau bit IE1) akan segera menjadi ‘1’ lagi!

Bit TF0 (atau bit TF1) dalam TCON merupakan petanda (flag) yang menandakan adanya permintaan Interupsi Timer, bit TF0 (atau bit TF1) menjadi ‘1’ pada saat terjadi limpahan pada pencacah biner Timer 0 (atau Timer 1).
Menjelang prosesor menjalankan ISR dari Interupsi Timer, bit TF0 (atau bit TF1) dikembalikan menjadi ‘0’, menandakan permintaan Interupsi Timer sudah dilayani.

Interupsi port seri terjadi karena dua hal, yang pertama terjadi setelah port seri selesai mengirim data 1 byte, permintaan interupsi semacam ini ditandai dengan petanda (flag) TI=’1’. Yang kedua terjadi saat port seri telah menerima data 1 byte secara lengkap, permintaan interupsi semacam ini ditandai dengan petanda (flag) RI=’1’.
Petanda di atas tidak dikembalikan menjadi ‘0’ menjelang prosesor menjalankan ISR dari Interupsi port seri, karena petanda tersebut masih diperlukan ISR untuk menentukan sumber interupsi berasal dari TI atau RI. Agar port seri bisa dipakai kembali setelah mengirim atau menerima data, petanda-petanda tadi harus di-nol-kan lewat program.

Petanda permintaan interupsi (IE0, TF0, IE1, TF1, RI dan TI) semuanya bisa di-nol-kan atau di-satu-kan lewat instruksi, pengaruhnya sama persis kalau perubahan itu dilakukan oleh perangkat keras. Artinya permintaan interupsi bisa diajukan lewat pemrograman, misalnya permintaan interupsi eksternal IT0 bisa diajukan dengan instruksi SETB IE0.

2. Mengaktifkan Interupsi
Semua sumber permintaan interupsi yang di bahas di atas, masing-masing bisa di-aktip-kan atau di-nonaktip-kan secara tersendiri lewat bit-bit yang ada dalam register IE (Interrupt Enable Register).
Bit EX0 dan EX1 untuk mengatur interupsi eksternal INT0 dan INT1, bit ET0 dan ET1 untuk mengatur interupsi timer 0 dan timer 1, bit ES untuk mengatur interupsi port seri, seperti yang digambarkan dalam Gambar 2. Di samping itu ada pula bit EA yang bisa dipakai untuk mengatur semua sumber interupsi sekali gus.
Setelah reset, semua bit dalam register IE bernilai ‘0’, artinya sistem interupsi dalam keadaan non-aktip. Untuk mengaktipkan salah satu sistem interupsi, bit pengatur interupsi bersangkutan diaktipkan dan juga EA yang mengatur semua sumber interupsi. Misalnya instruksi yang dipakai untuk mengaktipkan interupsi ekternal INT0 adalah SETB EX0 disusul dengan SETB EA.

clip_image002

3. Vektor Interupsi

Saat MCS51 menanggapi permintaan interupsi, Program Counter diisi dengan sebuah nilai yang dinamakan sebagai vektor interupsi, yang merupakan nomor awal dari memori-program yang menampung ISR untuk melayani permintaan interupsi tersebut. Vektor interupsi itu dipakai untuk melaksanakan inststuksi LCALL yang diaktipkan secara perangkat keras.
Vektor interupsi untuk interupsi eksternal INT0 adalah $0003, untuk interupsi timer 0 adalah $000B, untuk interupsi ekternal INT1 adalah $0013, untuk interupsi timer 1 adalah $001B dan untuk interupsi port seri adalah $0023.
Jarak vektor interupsi satu dengan lainnya sebesar 8, atau hanya tersedia 8 byte untuk setiap ISR. Jika sebuah ISR memang hanya pendek saja, tidak lebih dari 8 byte, maka ISR tersebut bisa langsung ditulis pada memori-program yang disediakan untuknya. ISR yang lebih panjang dari 8 byte ditulis ditempat lain, tapi pada memori-program yang ditunjuk oleh vektor interupsi diisikan instruksi JUMP ke arah ISR bersangkutan

clip_image002[5]

4. Tingkatan Perioritas

Masing-masing sumber interupsi bisa ditempatkan pada dua tingkatan perioritas yang berbeda. Pengaturan tingkatan perioritas isi dilakukan dengan bit-bit yang ada dalam register IP (Interrupt Priority).
Bit PX0 dan PX1 untuk mengatur tingkatan perioritas interupsi eksternal INT0 dan INT1, bit PT0 dan PT1 untuk mengatur interupsi timer 0 dan timer 1, bit PS untuk mengatur interupsi port seri, seperti yang digambarkan dalam Gambar 2.
Setelah reset, semua bit dalam register IP bernilai ‘0’, artinya semua sumber interupsi ditempatkan pada tingkatan tanpa perioritas. Masing-masing sumber interupsi bisa ditempatkan pada tingkatan perioritas utama dengan cara men-‘satu’-kan bit pengaturnya. Misalnya interupsi timer 0 bisa ditempatkan pada tingkatan perioritas utama dengan instruksi SETB PT1.
Sebuah ISR untuk interupsi tanpa perioritas bisa diinterupsi oleh sumber interupsi yang berada dalam tingkatan perioritas utama. Tapi interupsi yang berada pada tingkatan perioritas yang sama, tidak dapat saling meng-interupsi.
Jika 2 permintaan interupsi terjadi pada saat yang bersamaan, sedangkan kedua interupsi tersebut terletak pada tingkatan perioritas yang berlainan, maka interupsi yang berada pada tingkatan perioritas utama akan dilayani terlebih dulu, setelah itu baru melayani interupsi pada tingkatan tanpa perioritas.
Jika kedua permintaan tersebut bertempat pada tingkatan perioritas yang sama, perioritas akan ditentukan dengan urutan sebagai berikut : interupsi eksternal INT0, interupsi timer 0, interupsi ekternal INT1, interupsi timer 1 dan terakhir adalah interupsi port seri.
Bagan Lengkap Sistem Interupsi MCS51
Meskipun sistem interupsi MCS51 termasuk sederhana dibandingkan dengan sistem interupsi MC68HC11 buatan Motorola, tapi karena menyangkut 5 sumber interupsi yang masing-masing harus diatur secara tersendiri, tidak mudah untuk mengingat semua masalah tersebut, terutama pada saat membuat program sering dirasakan sangat merepotkan membolak-balik buku untuk mengatur masing-masing sumber interupsi tersebut.
Gambar 2 menggambarkan sistem interupsi MCS51 selangkapnya, berikut dengan masing-masing bit dalam register-register SFR (Special Function Register) yang dipakai untuk mengatur masing-masing sumber interupsi.
Saklar yang digambarkan dalam Gambar 2 mewakili bit dalam register yang harus diatur untuk mengendalikan sumber interupsi, kotak bergambar bendera kecil merupakan flag (petanda) dalam register yang mencatat adanya permintaan interupsi dari masing-masing sumber interupsi. Kedudukan saklar dalam gambar tersebut menggambarkan kedudukan awal setelah MCS51 di-reset.
Gambar ini sangat membantu saat penulisan program menyangkut interupsi MCS51.

clip_image002[2]

Selengkapnya...

Timer Counter MCS51

referensi dari internet

Timer dan Counter merupakan sarana input yang kurang dapat perhatian pemakai mikrokontroler, dengan sarana input ini mikrokontroler dengan mudah bisa dipakai untuk mengukur lebar pulsa, membangkitkan pulsa dengan lebar yang pasti, dipakai dalam pengendalian tegangan secara PWM (Pulse Width Modulation) dan sangat diperlukan untuk aplikasi remote control dengan infra merah.
Pada dasarnya sarana input yang satu ini merupakan seperangkat pencacah biner (binary counter) yang terhubung langsung ke saluran-data mikrokontroler, sehingga mikrokontroler bisa membaca kedudukan pancacah, bila diperlukan mikrokontroler dapat pula merubah kedudukan pencacah tersebut.
Seperti layaknya pencacah biner, bilamana sinyal denyut (clock) yang diumpankan sudah melebihi kapasitas pencacah, maka pada bagian akhir untaian pencacah akan timbul sinyal limpahan, sinyal ini merupakan suatu hal yang penting sekali dalam pemakaian pencacah. Terjadinya limpahan pencacah ini dicatat dalam sebuah flip-flop tersendiri.
Di samping itu, sinyal denyut yang diumpankan ke pencacah harus pula bisa dikendalikan dengan mudah. Hal-hal yang dibicarakan di atas diringkas dalam Gambar 1.
MCS-51 mempunyai dua buah register timer/ counter 16 bit, yaitu Timer 0 dan Timer 1. Keduanya dapat dikonfigurasikan untuk beroperasi sebagai timer atau counter, seperti yang terlihat pada gambar di bawah.

clip_image001

Gambar 1.9. Konsep dasar Timer/Counter sebagai sarana input

Sinyal denyut yang diumpankan ke pencacah bisa dibedakan menjadi 2 macam, yang pertama yalah sinyal denyut dengan frekuensi tetap yang sudah diketahui besarnya dan yang kedua adalah sinyal denyut dengan frekuensi tidak tetap.
Jika sebuah pencacah bekerja dengan frekuensi tetap yang sudah diketahui besarnya, dikatakan pencacah tersebut bekerja sebagai timer, karena kedudukan pencacah tersebut setara dengan waktu yang bisa ditentukan dengan pasti.
Jika sebuah pencacah bekerja dengan frekuensi yang tidak tetap, dikatakan pencacah tersebut bekerja sebagai counter, kedudukan pencacah tersebut hanyalah menyatakan banyaknya pulsa yang sudah diterima pencacah.
Untaian pencacah biner yang dipakai, bisa merupakan pencacah biner menaik (count up binary counter) atau pencacah biner menurun (count down binary counter).

Fasilitas Timer/Counter

Keluarga mikrokontroler MCS51, misalnya AT89C51 dan AT89Cx051, dilengkapi dengan dua perangkat Timer/Counter, masing-masing dinamakan sebagai Timer 0 dan Timer 1. Sedangkan untuk jenis yang lebih besar, misalnya AT89C52, mempunyai tambahan satu perangkat Timer/Counter lagi yang dinamakan sebagai Timer 2.
Perangkat Timer/Counter tersebut merupakan perangkat keras yang menjadi satu dalam chip mikrokontroler MCS51, bagi pemakai mikrokontroler MCS51 perangkat tersebut dikenal sebagai SFR (Special Function Register) yang berkedudukan sebagai memori-data internal.
Pencacah biner untuk Timer 0 dibentuk dengan register TL0 (Timer 0 Low Byte, memori-data internal nomor $6A) dan register TH0 (Timer 0 High Byte, memori-data internal nomor $6C).
Pencacah biner untuk Timer 1 dibentuk dengan register TL1 (Timer 1 Low Byte, memori-data internal nomor $6B) dan register TH1 (Timer 1 High Byte, memori-data internal nomor $6D).
Pencacah biner pembentuk Timer/Counter MCS51 merupakan pencacah biner menaik (count up binary counter) yang mencacah dari $0000 sampai $FFFF, saat kedudukan pencacah berubah dari $FFFF kembali ke $0000 akan timbul sinyal limpahan.
Untuk mengatur kerja Timer/Counter dipakai 2 register tambahan yang dipakai bersama oleh Timer 0 dan Timer 1. Register tambahan tersebut adalah register TCON (Timer Control Register, memori-data internal nomor $88, bisa dialamat secara bit) dan register TMOD (Timer Mode Register, memori-data internal nomor $89).
Pencacah biner Timer 0 dan 1
TL0, TH0, TL1 dan TH1 merupakan SFR (Special Function Register) yang dipakai untuk membentuk pencacah biner perangkat Timer 0 dan Timer 1. Kapasitas keempat register tersebut masing-masing 8 bit, bisa disusun menjadi 4 macam Mode pencacah biner seperti terlihat dalam Gambar 2a sampai Gambar 2d.
Pada Mode 0, Mode 1 dan Mode 2 Timer 0 dan Timer 1 masing-masing bekerja sendiri, artinya bisa dibuat Timer 0 bekerja pada Mode 1 dan Timer 1 bekerja pada Mode 2, atau kombinasi mode lainnya sesuai dengan keperluan.
Pada Mode 3 TL0, TH0, TL1 dan TH1 dipakai bersama-sama untuk menyusun sistem timer yang tidak bisa di-kombinasi lain.
Susunan TL0, TH0, TL1 dan TH1 pada masing-masing mode adalah sebagai berikut:

Mode 0 – Pencacah Biner 13 bit

clip_image002

Gambar 1.10 Mode 0 - Pencacah Biner 13 Bit

Pencacah biner dibentuk dengan TLx (maksudnya bisa TL0 atau TL1) sebagai pencacah biner 5 bit (meskipun kapasitas sesungguhnya 8 bit), limpahan dari pencacah biner 5 bit ini dihubungkan ke THx (maksudnya bisa TH0 atau TH1) membentuk sebuah untaian pencacah biner 13 bit, limpahan dari pencacah 13 bit ini ditampung di flip-flop TFx (maksudnya bisa TF0 atau TF1) yang berada di dalam register TCON.
Mode ini meneruskan sarana Timer yang ada pada mikrokontroler MCS48 (mikrokontroler pendahulu MCS51), dengan maksud rancangan alat yang dibuat dengan MCS48 bisa dengan mudah diadaptasikan ke MCS51. Mode ini tidak banyak dipakai lagi.

Mode 1 – Pencacah Biner 16 bit

clip_image003

Gambar 1.11 Mode 1 - Pencacah Biner 16 Bit

Mode ini sama dengan Mode 0, hanya saja register TLx dipakai sepenuhnya sebagai pencacah biner 8 bit, sehingga kapasitas pencacah biner yang tersbentuk adalah 16 bit. Seiring dengan sinyal denyut, kedudukan pencacah biner 16 bit ini akan bergerak dari $0000 (biner 0000 0000 0000 0000), $0001, $0002 … sampai $FFFF (biner 1111 1111 1111 1111), kemudian melimpah kembali menjadi $0000.

Mode 2 – Pencacah Biner 8 bit dengan Isi Ulang

clip_image004

Gambar 1.12 Mode 2 - Pencacah Biner 8 Bit dengan Isi Ulang

TLx dipakai sebagai pencacah biner 8 bit, sedangkan THx dipakai untuk menyimpan nilai yang diisikan ulang ke TLx, setiap kali kedudukan TLx melimpah (berubah dari $FF menjadi $00). Dengan cara ini bisa didapatkan sinyal limpahan yang frekuensinya ditentukan oleh nilai yang disimpan dalam TH0.

Mode 3 – Gabungan Pencacah Biner 16 bit dan 8 Bit

clip_image005

Gambar 1.13 Mode 3 – Gabungan Pencacah Biner 16 Bit dan 8 Bit

Pada Mode 3 TL0, TH0, TL1 dan TH1 dipakai untuk membentuk 3 untaian pencacah, yang pertama adalah untaian pencacah biner 16 bit tanpa fasiltas pemantau sinyal limpahan yang dibentuk dengan TL1 dan TH1. Yang kedua adalah TL0 yang dipakai sebagai pencacah biner 8 bit dengan TF0 sebagai sarana pemantau limpahan. Pencacah biner ketiga adalah TH0 yang dipakai sebagai pencacah biner 8 bit dengan TF1 sebagai sarana pemantau limpahan.
Register Pengatur Timer
Register TMOD dan register TCON merupakan register pembantu untuk mengatur kerja Timer 0 dan Timer 1, kedua register ini dipakai bersama oleh Timer 0 dan Timer 1.

clip_image007

Gambar 1.14 Denah susunan bit dalam register TMOD

Register TMOD dibagi menjadi 2 bagian secara simitris, bit 0 sampai 3 register TMOD (TMOD bit 0 .. TMOD bit 3) dipakai untuk mengatur Timer 0, bit 4 sampai 7 register TMODE (TMOD bit 4 .. TMOD bit 7) dipakai untuk mengatur Timer 1, pemakaiannya sebagai berikut :
1. Bit M0/M1 dipakai untuk menentukan Mode Timer seperti yang terlihat dalam Tabel di Gambar 3a.
2. Bit C/T* dipakai untuk mengatur sumber sinyal denyut yang diumpankan ke pencacah biner. Jika C/T*=0 sinyal denyut diperoleh dari osilator kristal yang frekuensinya sudah dibagi 12, sedangkan jika C/T*=1 maka sinyal denyut diperoleh dari kaki T0 (untuk Timer 0) atau kaki T1 (untuk Timer 1).
3. Bit GATE merupakan bit pengatur saluran sinyal denyut. Bila bit GATE=0 saluran sinyal denyut hanya diatur oleh bit TRx (maksudnya adalah TR0 atau TR1 pada register TCON). Bila bit GATE=1 kaki INT0 (untuk Timer 0) atau kaki INT1 (untuk Timer 1) dipakai juga untuk mengatur saluran sinyal denyut (lihat Gambar 4).

clip_image009

Gambar 1.15 Denah susunan bit dalam register TCON

Register TCON dibagi menjadi 2 bagian, 4 bit pertama (bit 0 .. bit 3, bagian yang diarsir dalam Gambar 3b) dipakai untuk keperluan mengatur kaki INT0 dan INT1, ke-empat bit ini dibahas dibagian lain.

clip_image002

Sisa 4 bit dari register TCON (bit 4..bit 7) dibagi menjadi 2 bagian secara simitris yang dipakai untuk mengatur Timer0/Timer 1, sebagai berikut:
1. Bit TFx (maksudnya adalah TF0 atau TF1) merupakan bit penampung limpahan (lihat Gambar 2), TFx akan menjadi ‘1’ setiap kali pencacah biner yang terhubung padanya melimpah (kedudukan pencacah berubah dari $FFFF kembali menjadi $0000). Bit TFx di-nol-kan dengan istruksi CLR TF0 atau CLR TF1. Jika sarana interupsi dari Timer 0/Timer 1 dipakai, TRx di-nol-kan saat MCS51 menjalankan rutin layanan interupsi (ISR – Interupt Service Routine).
2. Bit TRx (maksudnya adalah TR0 atau TR1) merupakan bit pengatur saluran sinyal denyut, bila bit ini =0 sinyal denyut tidak disalurkan ke pencacah biner sehingga pencacah berhenti mencacah. Bila bit GATE pada register TMOD =1, maka saluran sinyal denyut ini diatur bersama oleh TRx dan sinyal pada kaki INT0/INT1 (lihat Gambar 4).

Selengkapnya...

Selasa, 03 November 2009

Port Serial MCS51

referensi dari internet

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.

clip_image002

Gambar 1.17. Komunikasi serial dengan komputer

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.

1. Register-register Port Seri MCS51

MCS51 dilengkapi dengan 2 register dan beberapa bit tambahan untuk keperluan pemakai port seri.

clip_image004

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.

clip_image006

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’.
1. 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’
2. 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’.
3. 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.
4. 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.
5. 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

6. 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

clip_image008

Selengkapnya...

Senin, 02 November 2009

Bahasa Asembly MCS51

referensi dari internet

Secara fisik, kerja dari sebuah mikrokontroler dapat dijelaskan sebagai siklus pembacaan instruksi yang tersimpan di dalam memori. Mikrokontroler menentukan alamat dari memori program yang akan dibaca, dan melakukan proses baca data di memori. Data yang dibaca diinterprestasikan sebagai instruksi. Alamat instruksi disimpan oleh mikrokontroler di register, yang dikenal sebagai program counter. Instruksi ini misalnya program aritmatika yang melibatkan 2 register. Sarana yang ada dalam program assembly sangat minim, tidak seperti dalam bahasa pemrograman tingkat atas (high level language programming) semuanya sudah siap pakai. Penulis program assembly harus menentukan segalanya, menentukan letak program yang ditulisnya dalam memori-program, membuat data konstan dan tablel konstan dalam memori-program, membuat variabel yang dipakai kerja dalam memori-data dan lain sebagainya.

Program sumber assembly

Program-sumber assembly (assembly source program) merupakan kumpulan dari baris-baris perintah yang ditulis dengan program penyunting-teks (text editor) sederhana, misalnya program EDIT.COM dalam DOS, atau program NOTEPAD dalam Windows atau MIDE-51. Kumpulan baris-printah tersebut biasanya disimpan ke dalam file dengan nama ekstensi *.ASM dan lain sebagainya, tergantung pada program Assembler yang akan dipakai untuk mengolah program-sumber assembly tersebut.
Setiap baris-perintah merupakan sebuah perintah yang utuh, artinya sebuah perintah tidak mungkin dipecah menjadi lebih dari satu baris. Satu baris perintah bisa terdiri atas 4 bagian, bagian pertama dikenali sebagai label atau sering juga disebut sebagai symbol, bagian kedua dikenali sebagai kode operasi, bagian ketiga adalah operand dan bagian terakhir adalah komentar.
Antara bagian-bagian tersebut dipisahkan dengan sebuah spasi atau tabulator.

Bagian label

Label dipakai untuk memberi nama pada sebuah baris-perintah, agar bisa mudah menyebitnya dalam penulisan program. Label bisa ditulis apa saja asalkan diawali dengan huruf, biasa panjangnya tidak lebih dari 16 huruf. Huruf-huruf berikutnya boleh merupakan angka atau tanda titik dan tanda garis bawah. Kalau sebuah baris-perintah tidak memiliki bagian label, maka bagian ini boleh tidak ditulis namun spasi atau tabulator sebagai pemisah antara label dan bagian berikutnya mutlak tetap harus ditulis.
Dalam sebuah program sumber bisa terdapat banyak sekali label, tapi tidak boleh ada label yang kembar.
Sering sebuah baris-perintah hanya terdiri dari bagian label saja, baris demikian itu memang tidak bisa dikatakan sebagai baris-perintah yang sesungguhnya, tapi hanya sekedar memberi nama pada baris bersangkutan.
Bagian label sering disebut juga sebagai bagian symbol, hal ini terjadi kalau label tersebut tidak dipakai untuk menandai bagian program, melainkan dipakai untuk menandai bagian data.

Bagian kode operasi

Kode operasi (operation code atau sering disingkat sebagai OpCode) merupakan bagian perintah yang harus dikerjakan. Dalam hal ini dikenal dua macam kode operasi, yang pertama adalah kode-operasi untuk mengatur kerja mikroprosesor / mikrokontroler. Jenis kedua dipakai untuk mengatur kerja program assembler, sering dinamakan sebagai assembler directive.
Kode-operasi ditulis dalam bentuk mnemonic, yakni bentuk singkatan-singkatan yang relatip mudah diingat, misalnya adalah MOV, ACALL, RET dan lain sebagainya. Kode-operasi ini ditentukan oleh pabrik pembuat mikroprosesor/mikrokontroler, dengan demikian setiap prosesor mempunyai kode-operasi yang berlainan.
Kode-operasi berbentuk mnemonic tidak dikenal mikroprosesor/mikrokontroler, agar program yang ditulis dengan kode mnemonic bisa dipakai untuk mengendalikan prosesor, program semacam itu diterjemahkan menjadi program yang dibentuk dari kode-operasi kode-biner, yang dikenali oleh mikroprosesor/mikrokontroler.
Tugas penerjemahan tersebut dilakukan oleh program yang dinamakan sebagai Program Assembler.
Di luar kode-operasi yang ditentukan pabrik pembuat mikroprosesor/mikrokontroler, ada pula kode-operasi untuk mengatur kerja dari program assembler, misalnya dipakai untuk menentukan letak program dalam memori (ORG), dipakai untuk membentuk variabel (DS), membentuk tabel dan data konstan (DB, DW) dan lain sebagainya.

Bagian operand

Operand merupakan pelengkap bagian kode operasi, namun tidak semua kode operasi memerlukan operand, dengan demikian bisa terjadi sebuah baris perintah hanya terdiri dari kode operasi tanpa operand. Sebaliknya ada pula kode operasi yang perlu lebih dari satu operand, dalam hal ini antara operand satu dengan yang lain dipisahkan dengan tanda koma.
Bentuk operand sangat bervariasi, bisa berupa kode-kode yang dipakai untuk menyatakan Register dalam prosesor, bisa berupa nomor-memori (alamat memori) yang dinyatakan dengan bilangan atau pun nama label, bisa berupa data yang siap di-operasi-kan. Semuanya disesuaikan dengan keperluan dari kode-operasi.
Untuk membedakan operand yang berupa nomor-memori atau operand yang berupa data yang siap di-operasi-kan, dipakai tanda-tanda khusus atau cara penulisan yang berlainan.
Di samping itu operand bisa berupa persamaan matematis sederhana atau persamaan Boolean, dalam hal semacam ini program Assembler akan menghitung nilai dari persamaan-persamaan dalam operand, selanjutnya merubah hasil perhitungan tersebut ke kode biner yang dimengerti oleh prosesor. Jadi perhitungan di dalam operand dilakukan oleh program assembler bukan oleh prosesor!

Bagian komentar

Bagian komentar merupakan catatan-catatan penulis program, bagian ini meskipun tidak mutlak diperlukan tapi sangat membantu masalah dokumentasi. Membaca komentar-komentar pada setiap baris-perintah, dengan mudah bisa dimengerti maksud tujuan baris bersangkutan, hal ini sangat membantu orang lain yang membaca program.
Pemisah bagian komentar dengan bagian sebelumnya adalah tanda spasi atau tabulator, meskipun demikian huruf pertama dari komentar sering-sering berupa tanda titik-koma, merupakan tanda pemisah khusus untuk komentar.
Untuk keperluan dokumentasi yang intensip, sering-sering sebuah baris yang merupakan komentar saja, dalam hal ini huruf pertama dari baris bersangkutan adalah tanda titik-koma.
AT89S51 memiliki sekumpulan instruksi yang sangat lengkap. Instruksi MOV untuk byte dikelompokkan sesuai dengan mode pengalamatan (addressing modes). Mode pengalamatan menjelaskan bagaimana operand dioperasikan. Berikut penjelasan dari berbagai mode pengalamatan. Bentuk program assembly yang umum ialah sebagai berikut :

clip_image002

Selengkapnya...