Bagian Dalam Mikrokontroler MCS-51

| | Tidak ada komentar
Pada artikel ini akan dijelaskan beberapa register dari mikrokontroler keluarga MCS-51 atau 8051 yang paling sering digunakan dan mengilustrasikan kegunaannya pada instruksi MOV dan ADD.

Register

Dalam CPU, register digunakan untuk menyimpan informasi secara sementara. Informasi tersebut dapat berupa sebuah byte data yang hendak diproses atau sebuah data alamat yang menunjuk pada suatu data lainnya. Register-register pada 8051 pada umumnya berupa register 8-bit. Dalam 8051 hanya ada satu tipe data, yaitu 8-bit. Register 8-bit tersebut ditunjukkan pada gambar dibawah ini mulai dari MSB (Most Significant Bit) D7 sampai LSB (Least Significant bit) D0. Dengan tipe data 8-bit tersebut, setiap data yang memiliki lebar lebih dari 8-bit harus dipecah menjadi beberapa bagian data 8-bit sebelum dapat diproses oleh CPU. Karena dalam mikrokontroler 8051 memiliki banyak register, maka pada artikel kali ini hanya akan membahas beberapa register yang paling sering digunakan saja.

Gambar register 8-bit
D7 D6 D5 D4 D3 D2 D1 D0

Register yang paling banyak digunakan adalah A (Accumulator), B, R0, R1, R2, R3, R4, R5, R6, R7, DPTR (DataPointer), dan PC (Program Counter). Semua register tersebut merupakan register 8-bit kecuali DPTR dan PC. Akumulator atau register A, digunakan dalam semua instruksi aritmatika dan logika. Untuk lebih memahami penggunaan dari register-register tersebut, kita dapat melihatnya dalam konteks dari dua buah instruksi sederhana, MOV dan ADD.

Gambar beberapa register 8-bit dan 16-bit pada 8051
Gambar beberapa register 8-bit dan 16-bit pada 8051

Instruksi MOV

Secara sederhana, instruksi MOV adalah menyalin isi data dari register satu ke register lainnya, dengan format sebagai berikut:

MOV   destination, source   ;Menyalin isi operand source ke operand destination

Instruksi ini memerintahkan CPU untuk memindahkan (sebenarnya adalah menyalin) operand source ke operand destination.Sebagai contoh, "MOV A,R0" adalah menyalin isi register R0 ke register A. Setelah instruksi ini dijalankan isi dari kedua register tersebut akan bernilai sama. Instruksi MOV tidak mengubah isi dari operand source. Program berikut ini adalah contoh untuk mengubah isi akumulator menjadi 55h (h adalah hex), lalu kemudian memindahkan nilainya kedalam beberapa register dalam CPU. Perhatikan tanda "#" dalam instruksi tersebut. Tanda tersebut mengindikasikan bahwa simbol setelahnya adalah sebuah nilai.

      MOV  A,#55H  ;Isi A dengan nilai 55H
      MOV  R0,A    ;Salin isi A ke dalam R0
                   ;(sekarang A=R0=55H)
      MOV  R1,A    ;Salin isi A ke dalam R1
                   ;(sekarang A=R0=R1=55H)
      MOV  R2,A    ;Salin isi A ke dalam R2
                   ;(sekarang A=R0=Rl=R2=55H)
      MOV  R3,#95H ;Isi R3 dengan nilai 95H
                   ;(sekarang R3=95H)
      MOV  A,R3    ;Salin isi R3 ke dalam A
                   ;(sekarang A=R3=95H)

Saat menulis program untuk mikrokontroller 8051, hal-hal yang harus diperhatikan adalah sebagai berikut:
  1. Sebuah nilai dapat langsung diberikan pada register-register seperti register A, B, atau R0 s/d R7. Namun bagaimanapun juga untuk mengindikasikan bahwa sebuah simbol adalah sebuah nilai dan bukan sebagai alamat atau yang lainnya, maka sebelum nilai tersebut harus diberi tanda pound atau pagar atau "#".
          MOV  A,#23h   ;Mengisi A dengan nilai 23h
          MOV  R0,#12h  ;Mengisi R0 dengan nilai 12h
          MOV  R1#1Fh  ;Mengisi R1 dengan nilai 1Fh
          MOV  R2,#2Bh  ;Mengisi R2 dengan nilai 2Bh
          MOV  B,#3Ch   ;Mengisi B dengan nilai 3Ch
          MOV  R7,#9Dh  ;Mengisi R7 denga nilai 9Dh
          MOV  R6,#0F9h ;Mengisi R6 denga nilai F9h
          MOV  R5,#12   ;Mengisi R5 denga nilai 12 desimal
    
    Perhatikan pada instruksi "MOV R6,#0F9h", bilangan 0 antara # dan F digunakan untuk mengindikasikan bahwa F merupakan bilangan heksa dan bukan merupakan sebuah huruf. Dengan kata lain"MOV R6,#F9h" akan menyebabkan sebuah error.
  2. Jika nilai 0 s/d F kita isikan pada sebuah register 8-bit, maka hanya akan mengubah 4-bit terkecil dari register tersebut, sedangkan 4-bit teratas dari register tersebut akan bernilai 0. Misalnya dengan instruksi "MOV A,#5", maka sejatinya instruksi tersebut sama dengan "MOV A,#05h", sehingga akan menghasilkan A = 05h. Dan dalam bilangan biner adalah A = 00000101.
  3. Mengisikan sebuah nilai yang terlalu besar ke register (lebih besar dari yang sanggup ditampung oleh register yang bersangkutan) akan menghasilkan error.
          MOV  A,#7F2h  ; 7F2h > (8-bit atau FFh atau 255 desimal)
          MOV  R2,#456  ; 456d > (8-bit atau FFh atau 255 desimal)
    
  4. Untuk mengisikan nilai ke dalam sebuah register, kita harus mengimbuhkan simbol pound (#). Jika tidak ada simbol tersebut, maka assembler akan menganggapnya sebagai sebuah alamat memori. Sebagai contoh, "MOV A,17h" yang berarti pindahkan isi nilai dari alamat 17h ke dalam A. Jika kita ingin mengisi register A dengan nilai 17h, maka kita harus menuliskannya dengan instruksi "MOV A,#17h". Tidak adanya simbol pagar tersebut tidak akan membuat assembler menghasilkan pesan error, namun bisa jadi assembler akan membuatkan kode yang bukan seperti kemauan kita.

Instruksi ADD

Instruksi ADD memiliki format sebagai berikut:

ADD   A, source   ;Jumlahkan source dengan akumulator

Instruksi ADD akan mengatakan kepada CPU untuk menjumlahkan byte source dengan isi register A dan menempatkan hasilnya didalam register A. Untuk menjumlahkan dua buah bilangan seperti 25H dan 34H, masing-masing bilangan tersebut dapat dipindahkan ke sebuah register terlebih dahulu dan kemudian keduanya dijumlahkan.
      MOV  A,#25h   ;Isi A dengan nilai 25h
      MOV  R2,#34h  ;Isi R2 dengan nilai 34h
      ADD  A,R2     ;Tambahakan keduanya
                    ;Jadi A = A + R2
Menjalankan program di atas akan menghasilkan A = 59h (25h + 34h = 59h) dan nilai pada register R2 tidak akan berubah setelah instruksi ADD, yakni 34h. Sekali lagi operand source tidak akan berubah. Program di bawah ini adalah contoh program dengan cara yang lebih kompleks.
      MOV  R5,#25h  ;Isi R7 dengan nilai 25h
      MOV  R7,#34h  ;Isi R5 dengan nilai 34h
      MOV  A,#0     ;Isi A dengan nilai 0 (clear A)
      ADD  A,R5     ;Tambahakan A dengan isi R5
                    ;Jadi A = A + R5
      ADD  A,R7     ;Tambahakan A dengan isi R7
                    ;Jadi A = A + R7
Program di atas akan menghasilkan nilai 59h yang akan ditempatkan pada register A. Ada banyak jalan menuju Roma, namun sedapat mungkin kita mencari jalan yang paling singkat dan cepat. Dibawah ini adalah cara yang lebih cepatnya.
      MOV  A,#25h  ;Isi A dengan nilai 25h
      ADD  A,#34h  ;Tambahakan A dengan 34h
Dapat kita lihat dari berbagai contoh di atas bahwa operand tujuan selalu adalah A. Jika kita memaksa menuliskan kode seperti "ADD R2,A" tentu akan menghasilkan error. 8051 memang hanya mendukung operasi arimatika dan logika menggunakan A sebagai akumulatornya, dan dengan kata lain operasi tersebut dibatasi selebar 8-bit. Namun walaupun demikian, hal itu sudah lebih dari cukup untuk membuat program untuk berbagai aplikasi yang relatif canggih.

Kita tahu bahwa 8051 juga memiliki 2 buah register 16-bit, walaupun dirancang bukan untuk keperluan manipulasi data. Namun jika anda bertanya apakah CPU 8051 dapat memanipulasi data yang lebih besar dari 8-bit? Tentu saja, tidak ada hal yang tidak mungkin. Seperti yang sudah kita ketahui sebelumnya bahwa komputer 8-bit, idealnya hanya memproses data sampai selebar 8-bit. Dalam kasus tertentu beberapa perintah dalam 8051 dapat diurutkan untuk dapat menangani data yang lebih besar, seperti data 16-bit, 24-bit, maupun 32-bit. Semua bisa dilakukan. Tentu dengan memecah data tersebut dalam beberapa data 8-bit,dan kemudian memprosesnya satu-persatu kemudian menyatukan kembali data tersebut sehingga seperti hasil yang kita inginkan. Dalam prakteknya hal itu bisa dilakukan dengan membuat kode-kode yang rumit dan teliti.

Sumber:
1. Mazidi, Muhammad Ali., The 8051 Microcontroller and Embedded Systems - Using Assembly and C.

Tidak ada komentar

Posting Komentar