::Programming
 

 
 

 

 

 

 
my Project with uC:

Remote Control

Communication to PC

PWM Motor Control

Sensor for Robot

Interface to Camera

Temperature control

Tachometer

 
Powered by  :   
 

PROGRAMMING   
 


 BAHASA ASEMBLY MCS51

Sebuah mikrokontroller tidak akan bekerja bila tidak diberikan program kepadanya. Program tersebut memberitahukan mikrokontroller apa yang harus dia lakukan. Bahasa Assembly adalah bahasa komputer yang kedudukannya di antara bahasa mesin dan bahasa level tinggi misalnya bahasa C atau Pascal. Bahasa C atau Pascal dikatakan sebagai bahasa level tinggi karena memakai kata-kata dan pernyataan yang mudah dimengerti manusia, meskipun masih jauh berbeda dengan bahasa manusia sesungguhnya. Bahasa mesin adalah kumpulan kode biner yang merupakan instruksi yang bisa dijalankan oleh komputer. Sedangkan bahasa Assembly memakai kode Mnemonic untuk menggantikan kode biner, agar lebih mudah diingat sehingga lebih memudahkan penulisan program.

KONSTRUKSI PROGRAM ASSEMBLY

Bentuk umum semua instruksi dalam assembler MCS51 Intel dapat ditulis sebagai berikut:

           [label:] Mnemonik       [operand][,operand][,operand]

1.       Label mewakili nomor memori-program dari instruksi pada baris bersangkutan, pada saat menulis instruksi JUMP, Label ini ditulis dalam bagian operand untuk menyatakan nomor memori-program yang dituju.

2.       Mnemonic (artinya sesuatu yang memudahkan diingat) merupakan singkatan perintah, dikenal dua macam mnemonic, yakni manemonic yang dipakai sebagai instruksi mengendalikan prosesor, misalnya ADD, MOV, DJNZ dan lain sebagainya.  Ada pula mnemonic yang dipakai untuk mengatur kerja dari program Assembler misalnya ORG, EQU atau DB, mnemonis untuk mengatur kerja dari program Assembler ini dinamakan sebagai ‘Assembler Directive’.

3.       Operand, yaitu bagian yang letaknya di belakang bagian mnemonic, merupakan pelangkap bagi mnemonic. Kalau sebuah instrksi di-ibaratkan sebagai kalimat perintah, maka mnemonic merupakan subjek (kata kerja) dan operand merupakan objek (kata benda) dari kalimat perintah tersebut.

4.       Komentar merupakan bagian yang sekedar sebagai catatan, tidak berpengaruh pada prosesor juga tidak berpengaruh pada kerja program Assembler, tapi bagian ini sangat penting untuk keperluan dokumentasi.

SIMBOL ASSEMBLER KHUSUS

Assembler telah menyediakan beberapa simbol untuk menunjukkan register-register tertentu sebagai operand. Simbol assembler khusu tersebut adalah :

Simbol Khusus

Arti

A

R0-R7

DPTR

PC

C

AB

Akumulator

Register serbaguna

Data pointer, register 16 bit

Program Counter

Carry Flag

Akumulator/register B

PENYEBUTAN DATA DALAM MCS51

Data bisa berada diberbagai tempat yang berlainan, dengan demikian dikenal beberapa cara untuk menyebut data ( ‘Addressing Mode’), antara lain sebagai berikut:

1.      Pengalamatan Tak Langsung

Operand pengalamatan tak langsung menunjuk ke sebuah register yang berisi lokasi alamat memori yang akan digunakan dalam operasi. untuk melaksanakan engalamatan tak langsung digunakan simbol @.

contoh :           

ADD     A,@R0 ;Tambahkan isi RAM yang lokasinya ditunjukan olehregister R0 ke akumulator

DEC @R1          ;Kurangi satu isi RAM yang alamatnya ditunjukan oleh register R1

MOVX @DPT,A  ;Pidahkan isi dari akumulator ke momori luar yang lokasinya ditunjukan oleh data   pointer (DPTR)

2.      Pengalamatan Langsung

Pengalamatan langsung dilakukan dengan memberikan nilai ke suatu register secara langsug. untuk melaksanakan hal tersebut digunakan tanda #.

conttoh:           

MOV A,#01H ;Isi akumuator dengan bilangan 01H

MOV DPTR,19AH ;Isi register DPTR dengan bilangan 19AH

3.      Pengalamatan Bit

Pengalamatan Bit adalah penunjukan alamat lokasi bit .Untuk melaksanakan pengalamatan bit dilakukan dengan tanda titik (.).

Contoh;

SETB TR1         ; Set TR1 (logika 1 pada TR1)

SETB P1.0        ; Logika 1 pada P1.0

PENG-COPY-AN DATA

Kode dasar untuk kelompok ini adalah MOV, singkatan dari MOVE yang artinya memindahkan, meskipun demikian lebih tepat dikatakan perintah ini mempunyai makna peng-copy-an data. Hal ini bisa dijelaskan berikut : setelah instruksi MOV A,R7 dikerjakan, Akumulator A dan register serba guna R7  berisikan data yang sama, yang asalnya tersimpan di dalam R7.

Perintah MOV dibedakan sesuai dengan jenis memori AT8951. Perintah ini pada memori data dituliskan menjadi MOV, misalkan :

MOV A,$20

MOV A,@R1

MOV A,P1

MOV P3,A

Untuk pemakaian pada memori program, perintah ini dituliskan menjadi MOVC, hanya ada 2 jenis instruksi yang memakai MOVC, yakni:

MOVC A,@A+DPTR  ; DPTR sebagai register indirect

MOVC A,@A+PC    ; PC sebagai register indirect

Selain itu, masih dikenal pula perintah MOVX, yakni perintah yang dipakai untuk memori data eksternal (X singkatakan dari External). Perintah ini hanya dimiliki oleh anggota keluarga MCS51 yang mempunyai memori data eksternal, misalnya AT89C51 dan lain sebagainya, dan jelas tidak dikenal oleh kelompok AT89Cx051 yang tidam punya memori data eksternal.  Hanya ada 6 macam instruksi yang memakai MOVX, instruksi-instruksi tersebut adalah:

MOVX A,@DPTR

MOVX A,@R0

MOVX A,@R1

MOVX @DPTR,A

MOVX @R0,A

MOVX @R1,A

INSTRUKSI JUMP

Instruksi ini mengubah urautan normal pelaksanaan suatu program. Dengan instruksi ini program yang sedang dilaksanakan akan mencabang ke suatu alamat tertentu.

Jump adalah mnemonik untuk instruksi  jump (lompat), yang memberitahukan mikrokontroller untuk mengambil instruksi  berikutnya dari lokasi memori yang telah ditunjuk alamatnya

2000H             -----------

                        -----------

                        -----------

2005H             Jump 3000H

2006H             ----------

                        ----------        

                              :

                              :

3000H             ----------

                        ----------

Mikrokontroler MCS51 mempunyai 3 macam intruksi JUMP, yakni instruksi LJMP (Long Jump), instruksi AJMP (Absolute Jump) dan instruksi SJMP (Short Jump). Kerja dari ketiga instruksi ini persis sama, yakni memberi nilai baru pada Program Counter, kecepatan melaksanakan ketiga instruksi ini juga persis sama, yakni memerlukan waktu 2 periode instruksi (jika MCS51 bekerja pada frekuensi 12 MHz, maka instruksi ini dijalankan dalam waktu 2 mikro-detik), yang berbeda dalam jumlah byte pembentuk instruksinya, instruksi LJMP dibentuk dengan 3 byte, sedangkan instuksi AJMP dan SJMP cukup 2 byte.

Instruksi LJMP bisa menjangkau semua memori-program MCS51 yang jumlahnya 64 KiloByte. Instruksi AJMP menjangkau satu daerah memori-program MCS51 sejauh 2 KiloByte, sedangakan instruksi SJMP dapat menjangkau jarak antara instruksi itu dengan LABEL DaerahLain asal tidak lebih dari 127 byte

INSTRUKSI CALL

Call adalah mnemonik untuk instruksi “call the subroutine” (panggil subrutin). Setiap instruksi call harus diikuti label yang berisi alamat tertentu dari sub rutin yang dikehendaki. Misalnya jika ada subrutin akar kuadarat dengan label program akar, maka eksekusi dari instruksi :

                        CALL Akar

akan menyebabkan lompatan ke sub rutin akar kuadrat.

Instruksi ACALL dipakai untuk me-‘manggil’ program sub-rutin dalam daerah memori-program 2 KiloByte yang sama, setara dengan instruksi AJMP yang sudah dibahas di atas. Sedangkan instruksi LCALL setara dengan instruksi LCALL, yang bisa menjangkau seluruh memori-program mikrokontroler MCS51 sebanyak 64 KiloByte.

            Pada setiap subrutin yang siap dipanggil selalu diakhiri dengan mnemonik RET. RET adalah mnemonik untuk instruksi “return” (kembali). Ini memberitahukan Program Counter untuk kembali ke progam semula yang telah ditinggalkan.

                        ------------

                        ------------

                        CALL Akar

                        ------------

                        -----------

                               :

                               :

Akar:               ------------

                        ------------

                        -----------

                        RET

TIMER

Pada kontrol internal, timer dihidup matikan dengan men-set TR) (kontrol software). Pada kntrol eksternal, timer dihidup matikan dengan memberikan logika 0 pada pena INT0 atau INT1.

Berikut adalah tabel pengaturan Timer Mode (TMOD) yang akan bermanfaat pada saat pembuatan program dengan memanfaatkan fasilitaas Timer/Counter MCS51.

Sebagai Timer

Mode

Fungsi TIMER 0

Kontrol internal

Kontrol Eksternal

0

1

2

3

13 bit timer

16 bit timer

8 bit auto reload

Dua bit timer

00H

01H

02H

03H

08H

09H

0AH

0BH

Mode

Fungsi TIMER 1

Kontrol internal

Kontrol Eksternal

0

1

2

3

13 bit timer

16 bit timer

8 bit auto reload

-

00H

10H

20H

30H

80H

90H

A0H

B0H

Sebagai Counter

Mode

Fungsi

COUNTER 0

Kontrol internal

Kontrol Eksternal

0

1

2

3

13 bit timer

16 bit timer

8 bit auto reload

Satu bit timer

04H

05H

06H

07H

0CH

0DH

0EH

0FH

Mode

Fungsi

COUNTER 1

Kontrol internal

Kontrol Eksternal

0

1

2

13 bit timer

16 bit timer

8 bit auto reload

40H

50H

60H

C0H

D0H

E0H

Salah satu penggunaan fasilitas Timer adalah untuk pembangkitan waktu tuda dan pembangkitan frekuesni.

Program di atas bisa pula dibuat dengan memakai Timer 1 sebagai pengatur waktu tunda sebagai berikut :

    01:      MOV  TMOD,#%00100000 ; Timer 1 bekerja pada Mode 2

     02:      MOV  TH1,#$F6                     ; Nilai pengisi ulang TL1

     03:      SET  TR1                                  ; Timer 1 mulai mencacah

     04: Ulangi:

     05:      BIT  TF1,$                               ; Tunggu sampai melimpah

     06:      CPL  P1.0                                ; Keadaan pada P1.0 di-balik 

     07:      CLR  TF1                                  ; Hapus limpahan pencacah

     08:      SJMP Ulangi                           ; Ulangi terus tiada henti

Instruksi baris pertama mempersiapkan Timer 0 bekerja pada Mode 2 – Pencacah Biner 8 bit dengan Isi Ulang, bilangan pengisi ulang ditentukan sebesar $F6 yang disimpan ke register TH1 pada baris 2, instruksi berikutnya memerintahkan pencacah biner mulai mencacah. Pencacah biner yang dibentuk dengan register TL1 akan mencacah naik seirama dengan sikluas sinyal denyut, saat pencacah melimpah dari $FF ke $00 bit TR1 pada register TCON akan menjadi ‘1’ dan TL1 secara otomatis di isi ulang dengan bilangan $F0 yang tersimpan pada register TH0. Instruksi BIT TR1,$ menunggu bit TR1 menjadi ‘1’, yakni saat pecacah biner melimpah dari $FF ke $00 yang dibahas di atas. Lepas dari penantian tersebut, P1.0 dibalik keadaanya dengan instruksi CPL P1.0, TR1 dikembalikan menjadi 0 (harus dikembalikan sendiri dengan instruksi ini), agar bisa ditunggu lagi sampai menjadi ‘1’ kembali setelah instruksi SJMP Ulangi.

INTERUPSI

Apabila mikrokontroller sedang melaksanakan suatu program kita bisa menghentikan pelaksanaan program tersebut secara sementara dengan meminta interupsi. Apabila mikrokotroller mendapat permintaan interupsi, program counter akan diisi alamat dari vektor inteerupsi. Mikrokontroller kemudian melaksanakan rutin pelayanan interupsi mulai dari alamat terseut. Bila rutin pelayanan interupsi selesai dilakukan, mikrokontroller kembali ke pelaksanaan program utama yang ditinggalkan.

Contoh Program:

gelobang persegi menggunakan Timer Interupts

timer interupt dapat terjadi apabila timer register (TL1/TH1) melimpah dan men-set berdera limphan (TFx)

                     ORG                  0

 LJMP MAIN

                     ORG 000BH        ; VEKTRO INTERUPSI TIMER 0

T0ISR:         CPL P1.0            ;BALIK LOGIKA P1.0

                     RETI                    ; KEMBALI

MAIN:         MOV TMOD,#02H          ;TIMER 0 MODE 2

                     MOV TH0,#-50

                     SETB TR0            ; START TIMER

                     MOV IE,#82      ; AKTIFKAN TIMER 0 INTERUPSI

                     SJMP $                ; TIDAK MENGERJAKAN APA-APA

END

Setelah terjadi reset program counter menuju alamat 00H. Eksekusi pertama yangdilakukan adalah melompat ke label main. instruksi selanjutnya adalahmenginisialisasi timer 0 dengan mode 2 yatu 8 bit auto reload. pengisian TH0 dengankonstanta -50 berarti akan mengeset limphan setiap 50 mikro detik. Instruksi MOV IE,82H adalah untuk mengaktifkan sumber interupsi Timer 0. Sehingga setiap teradi limpahan maka akan terjadi permintaan interupsi. Permintaan interupsi dalam program diatas terjadi setiap 50 mikro detik. Rutin pelayanan interupsi adalah membalikan logika P1.0. Sehingga terbentuklah suatu gelombang perrsegi dengan perioda sebesar 50 mikro detik.

 


 
© 2004. Hantoro Dwi Putra