Dasar Pemrograman AT89C2051 (Bagian 1)

Konstruksi dasar AT89Cx051

Meskipun termasuk tua, keluarga Mikrokontroler MCS51 adalah Mikrokontroler yang paling populer saat ini. Keluarga ini diawali oleh Intel yang mengenalkan IC Mikrokontroler type 8051 pada awal tahun 1980-an, 8051 termasuk sederhana dan harganya murah sehingga banyak digemari, banyak pabrik IC besar lain yang ikut memproduksnya, tentu saja masing-masing pabrik menambahkan kemampuan pada mikrokontroler buatannya meskipun semuanya masih dibuat berdasarkan 8051. Sampai kini sudah ada lebih 100 macam mikrokontroler turunan 8051, sehingga terbentuklah sebuah ‘keluarga besar mikrokontroler’ dan biasa disebut sebagai MCS51.

     Belakangan ini, pabrik IC Atmel ikut menambah anggota keluarga MCS51. Atmel merupakan pabrik IC yang sangat menguasai teknologi pembuatan Flash PEROM, jadi sudah selayaknya kalau Atmel memasukkan Flash PEROM ke dalam mikrokontroler buatannya. Usaha Atmel ini ternyatakan bagaikan menambah ‘darah’ baru bagi keluarga MCS51, dengan adanya Flash PEROM yang harganya murah maka tercapailah angan-angan banyak orang untuk membuat alat berbasis mikrokontroler yang sesederhana mungkin dan semurah mungkin.
     Produksi mikrokontroler MCS51 Atmel dibagi dua macam, yang berkaki 40 setara dengan 8051 yang asli, bedanya mikrokontroler Atmel berisikan Flash PEROM dengan kapasitas berlainan. AT89C51 mempunyai Flash PEROM dengan kapasitas 2 Kilo Byte, AT89C52 4 Kilo Byte, AT89C53 12 Kilo Byte, AT89C55 20 Kilo Byte  dan AT89C8252 berisikan 8 Kilo Byte Flash PEROM dan 2 Kilo Byte EEPROM.
     Yang berkaki 20 adalah MCS51 yang disederhanakan, penyederhanaan  dilakukan dengan cara mengurangi jalur untuk input/output paralel, kemampuan yang lain sama sekali tidak mengalami pengurangan. Penederhanaan ini dimaksudkan untuk membentuk mikrokontroler yang bentuk fisiknya sekecil mungkin tapi mempunyai kemampuan sama. Atmel memproduksi 3 buah mikrokontroler ‘mini’ ini, masing-masing adalah AT89C1051 dengan kapasitas Flash PEROM 1 Kilo Byte, AT89C2051 2 Kilo Byte dan AT89C4051 4 Kilo Byte. Ketiga mikrokontroler ini secara umum disebut sebagai AT89Cx051.
klik pada gambar untuk ukuran sebenarnya
 Gambar 1
Susunan kaki AT89Cx051 dan kontruksi dalam chip

Konstruksi AT89Cx051

     Gambar 1 memperlihatkan susunan kaki AT89C2051, susunan kaki ini sama persis dengan AT89C1051 dan AT89C4051. Demikian pula ketiga IC mempunyai konstruksi di dalam chip yang sama persis, perbedaannya hanya terletak pada kapasitas Flash PEROM.
      IC AT89Cx051 hanya memerlukan tambahan 3 kapasitor, 1 resistor dan 1 Xtal serta catu daya 5 Volt. Kapasitor 10 mikro-Farad dan resistor 10 Kilo Ohm dipakai untuk membentuk rangkaian reset, dengan adanya rangkaian reset ini AT89Cx051 otomatis di-reset begitu rangkaian menerima catu daya. Xtal dengan frekuensi maksimum 24 MHz dan 2 kapasitor 30 pico-Farad dipakai untuk melengkapi rangkaian oscilator pembentuk clock yang menentukan kecepatan kerja mikrokontroler.
      Memori merupakan bagian yang sangat penting bagi mikrokontroler, diperlukan 2 macam memori yang sifatnya berbeda.
      Read Only Memory (ROM) yang isinya tidak berubah meskipun IC kehilangan catu daya, dipakai untuk menyimpan program, begitu di-reset mikrokontroler akan langsung bekerja dengan program dalam ROM tersebut. Sesuai dengan keperluannya, dalam susunan MCS51 memori penyimpan program ini dinamakan sebagai MEMORI PROGRAM.
      Random Access Memory (RAM) isinya akan sirna begitu IC kehilangan catu daya, dipakai untuk menyimpan data pada saat program bekerja. Di samping untuk data, RAM dipakai pula untuk Stack. RAM yang dipakai untuk menyimpan data ini disebut pula sebagai MEMORI DATA.
      Ada berbagai jenis ROM. Untuk mikrokontroler dengan program yang sudah baku dan diproduksi secara massal, program diisikan ke dalam ROM pada saat IC mikrokontroler dicetak di pabrik IC. Untuk keperluan yang jumlahnya tidak banyak biasanya tidak dipakai ROM, tapi dipakai ROM yang bisa di-isi-ulang atau Programable-Eraseable ROM (disingkat menjadi PEROM atau PROM). Dulu banyak dipakai UV-EPROM (Ultra Violet Eraseable Programable ROM) yang kemudian dinilai mahal harganya dan ditinggalkan setelah ada Flash PEROM yang harganya jauh lebih murah.
      Jenis memori yang dipakai untuk Memori Program AT89Cx051 adalah Flash PEROM, program untuk mengendalikan mikrokontroler diisikan ke memori itu lewat bantuan alat yang dinamakan sebagai AT89Cx051 Flash PEROM Programmer.
Memori Data yang disediakan dalam chip AT89Cx051 sebesar 128 byte, meskipun hanya kecil saja tapi untuk banyak keperluan memori kapasitas itusudah mencukupi.
      Sarana Input/Output yang disediakan cukup banyak dan bervariasi. AT89Cx051 mempunyai 17 jalur Input/Output paralel. Jalur Input/Output paralel ini dikenal sebagai Port 1 (P1.0..P1.7) dan Port 3 (P3.0..P3.5 dan P3.7).
      AT89Cx051 dilengkapi UART (Universal Asynchronous Receiver/Transmiter) yang biasa dipakai untuk komunikasi data secara seri. Jalur untuk komunikasi data seri (RXD dan TXD) diletakan berhimpitan dengan P1.0 dan P1.1 di kaki nomor 2 dan 3, sehingga kalau sarana UART ini dipakai maka P1.0 dan P1.1 tidak lagi bisa dipakai untuk jalur input/output paralel.
    Timer 0 dan Timer 1 masing-masing adalah untaian pencacah biner 16 bit (16 bit binary counter) di dalam chip yang dipakai sebagai sarana input/output yang bekerja menurut fungsi waktu. Clock penggerak untaian pencacah ini bisa berasal dari oscilator kristal atau clock yang diumpan dari luar lewat T0 dan T1. T0 dan T1 berhimpitan dengan P3.4 dan P3.5, sehingga P3.4 dan P3.5 tidak bisa dipakai untuk jalur input/output paralel kalau T0 dan T1 dipakai.
       AT89Cx051 mempunyai 5 sumber pembangkit interupsi, 2 diantaranya adalah sinyal interupsi yang diumpankan ke kaki INT0 dan INT1, kedua kaki ini berhimpitan dengan P3.2 dan P3.3 sehingga tidak bisa dipakai sebagai jalur input/output paralel kalau INT0 dan INT1 dipakai untuk menerima sinyal interupsi.
        3 sumber interupsi yang lain berasal dan sarana komunikasi data seri dan dari sistem Timer 0 dan Timer 1.
        Port 1, Port 2, UART, Timer 0, Timer 1 dan sarana lainnya merupakan register yang secara fisik merupakan RAM khusus, yang ditempatkan di Special Function Register (SFR).


Dasar kerja program

      Program untuk mengendalikan kerja dari mikrokontroler disimpan di dalam memori program. Program pengendali tersebut merupakan kumpulan dari instruksi kerja mikrokontroler, 1 instruksi MCS51 merupakan kode yang panjangnya bisa satu sampai empat byte.
       Sepanjang mikrokontroler bekerja, instruksi tersebut byte demi byte diambil ke CPU dan selanjutnya dipakai untuk mengatur kerja mikrokontroler. Proses pengambilan instruksi dari memori program dikatakan sebagai ‘fetch cycles’ dan saat-saat CPU melaksanakan instruksi disebuat sebagai ‘execute cycles’.
       Semua mikrokontroler maupun mikroprosesor dilengkapi sebuah register yang berfungsi khsus untuk mengatur ‘fetch cycles’, register tersebut dinamakan sebagai Program Counter. Nilai Program Counter secara otomatis bertambah satu setiap kali selesai mengambil 1 byte isi memori program, dengan demikian isi memori program bisa berurutan diumpankan ke CPU.
        Saat MCS51 di-reset, isi Program Counter di-reset menjadi 0000. Artinya sesaat setelah reset isi dari memori program nomor 0 dan seterusnya akan diambil ke CPU dan diperlakukan sebagai instruksi yang akan mengatur kerja mikrokontroler. Dengan demikian, awal dari program pengendali MCS51 harus ditempatkan di memori nomor 0, setelah reset MCS51 menjalankan program mulai dari memori-program nomor 0000, dengan melakukan proses ‘fetch cycles’ dan ‘execute cycles’ terus menerus tanpa henti.
        Jika sarana interupsi diaktipkan, dan tegangan di kaki INT0 (kaki nomor 6) merubah dari ‘1’ menjadi ‘0’, maka proses menjalankan program di atas akan dihentikan sebentar, mikrokontroler melayani dulu permintaan interupsi, selesai melayani permintaan interupsi CPU akan melanjutkan mengerjakan program utama lagi.
         Untuk melaksanakan hal tersebut, pertama-tama CPU menyimpan nilai Program Counter ke Stack (Stack merupakan satu bagian kecil dari data memori – RAM), kemudian mengganti isi Program Counter dengan 0003. Artinya MCS51 akan melaksanakan program yang ditempatkan di memori program mulai byte ke 3 untuk melayani interupsi yang diterima dari kaki INT0. Adalah tugas programer untuk mengatur agar program yang dipakai untuk melayani interupsi lewat INT0 diletakkan disitu.
        Selesai melayani interupsi, nilai Program Counter yang tadi disimpan ke dalam Stack akan dikembalikan ke Program Counter, dengan demikian CPU bisa melanjutkan pekerjaan di program Utama.
      Selain INT0, AT89Cx051 bisa menerima interupsi dari INT1, dari UART dan dari Timer. Agar permintaan interupsi itu bisa dilayani dengan program yang berlainan, maka masing-masing sumber interupsi itu mempunyai nomor awal program untuk layanan interupsi yang berlainan. Nomor-nomor awal tersebut digambarkan dalam Gambar 2.

 Gambar 2
Peta Memori Program

Downloader mikrokontroler AT89C2051

AT89C2051 Flash PEROM Programmer ini sangat sederhana, hanya memakai sebuah IC 74HC574 ditambah dengan sistem catu daya dan dihubungkan ke komputer PC lewat Parallel Port, dikendalikan lewat program yang ditulis dengan Pascal.

Program untuk AT89C2051 disimpan di dalam ROM yang terdapat dalam chip IC tersebut, ROM yang dipakai AT89C2051 termasuk jenis Flash PEROM (Programmable Eraseable Read Only Memory). Diperlukan cara dan rangkaian khusus untuk mengisi Flash PEROM tersebut, berikut ini akan dibahas cara pengisian Flash PEROM AT89C2051 dan pembuatan alat pengisi Flash PEROM AT89C2051.
Selain diisi, Flash PEROM tersebut bisa pula dibaca isinya, dihapus bahkan bisa diproteksi sehingga isinya tidak bisa dibaca lagi untuk mencegah pembajakan program. Selain itu semua microcontroller produksi Atmel masing-masing punya kode produksi sendiri, sehingga program Pascal di komputer bisa dengan mudah mengenali chip microcontroller jenis apa yang dipasangkan pada alat ini.
Tabel 1 memperlihatkan kombinasi sinyal yang harus diberikan pada kaki-kaki P3.7..P3.3, tegangan VPP yang harus diberikan ke kaki RESET dan sinyal PROG pada kaki P3.2 untuk berbagai keperluan dengan Flash PEROM di dalam chip AT89C2051.
 Tabel 1 Mode Pemrograman Flash PEROM AT89Cx051

Pengisian data ke PEROM

Gambar 1 merupakan susunan rangkaian untuk mengisi Flash PEROM AT89C2051, dalam susunan ini Port 1 (P1.0..P1.7) dipakai sebagai saluran penerima data yang akan diisikan ke PEROM, P3.7..P3.3 dipakai untuk memilih mode kerja, kaki RESET dipakai untuk catu daya tambahan (VPP) sebesar 12 Volt. 

 Gambar 1
Mengisi Flash PEROM AT89Cx051

AT89C2051 dilengkapi ‘address counter’ di dalam chip, yang berfungsi sebagai ganti address bus pada saat pengisian atau pembacaan Flash PEROM. Kedudukan ‘address counter’ ini akan reset menjadi 000(hex) saat tegangan VPP pada kaki RESET berubah dari 0 Volt menjadi 5, dan nilai ‘address counter’ ini naik satu setiap kali ada pulsa positip NEXT diumpankan pada kaki XTAL1.
Proses pengisian Flash PEROM, dilakukan dengan urutan sebagai berikut :
1.   AT89C2051 diberi catu daya 5 Volt lewat kaki Vcc, kaki RESET dan XTAL1 diberi tegangan 0.
2.   Menjelang proses pengisian akan dimulai, tegangan VPP dinaikkan menjadi 5 Volt agar ‘address counter’ reset menjadi 000(hex), dan sinyal PROG pada kaki P3.2 dijadikan H.
3.  AT89C2051 disiapkan kerja pada mode pengisian dengan memberi sinyal HHHL pada kaki P3.7..P3.3.
4.   Setelah urutan persiapan ini selesai, VPP dinaikkan menjadi 12 Volt sebagai catu daya yang diperlukan untuk pengisian PEROM.
5.   Selanjutnya data yang akan diisikan disiapkan di Port 1 (P1.0..P1.7)
6.   Pulsa negatip PROG pada P3.2 dipakai sebagai perintah agar data pada Port 1 diisikan ke dalam PEROM, proses pengisian ini memerlukan waktu relatip lama lebih kurang selama 1,2 mili-detik, selama proses pengisian ini kaki P3.1 menjadi ‘0’ menandakan AT89C2051 sedang sibuk (BUSY). Saat kaki P3.1 menjadi ‘1’ kembali berarti selesai sudah proses pengisian data 1 byte ke dalam PEROM, dan AT89C2051 siap menerima data lagi.
7.  Setelah proses pengisian 1 byte ini, dikirim sinyal NEXT yang berupa pulsa positip ke kaki XTAL1, dengan maksud menaikkan nilai ‘address counter’, agar pengisian data berikutnya diisikan ke lokasi PEROM berikutnya.
8.  Urutan 5 sampai 7 di atas diulang untuk mengisikan data 1 byte demi 1 byte, sampai semua PEROM dalam AT89C2051 sebanyak 2048 byte selesai diisikan.

Rancangan Rangkaian

Gambar 3 merupakan skema rangkaian AT89C2051 Flash PEROM Programmer yang dibuat, rangkaian ini dikendalikan oleh Komputer PC lewat Parallel Port.
Dari Gambar 1 dan 2 bisa diperhitungkan banyaknya jalur yang diperlukan untuk mengendalikan chip AT89C2051, antara lain diperlukan 8 jalur data yang dua arah, diperlukan 4 jalur pengatur mode, jalur PROG, jalur NEXT dan 2 jalur pengatur VPP, dan 1 jalur BUSY untuk memantau apakah AT89C2051 sudah siap menerima data.
Parallel Port  komputer PC mempunyai 8 jalur data yang dua arah, 4 jalur kontrol (sebagai output dari PC) dan 5 jalur status (sebagai input ke PC), dengan demikian memakai Parallel Port untuk mengendalikan chip AT89C2051, masih kekurangan jalur output.
Untuk mengatasi kekurangan ini pada rangkaian dipakai IC 74HC574, IC ini menampung 4 jalur pengatur mode dan 2 jalur pengatur tegangan VPP. Data pengatur ini disiapkan di jalur data Parallel Port D0..D7, kemudian dikirim sinyal LATCH yang dibangkitkan di kaki nomor 17 konektor DB25 (dikendalikan dengan bit 3 dari Control Register Parallel Port), sehingga  data di D0..D7 tersimpan output 74HC574.
Sinyal PROG dibangkitkan dikaki nomor 14 konektor DB25 (dikendalikan dengan bit 1 dari Control Register Parallel Port), dan sinyal NEXT dibangkitkan dikaki nomor 1 (dikendalikan dengan bit 0 dari Control Register Parallel Port). Sinyal BUSY yang dibangkitkan AT89C2051, dipantau lewat kaki nomor 11 konektor DB25  (bit 7 dari Status Register Parallel Port)
Pengatur tegangan VPP terdiri dari sinyal VPP_5VOLT dan sinyal VPP_OFF.
·        Jika sinyal VPP_5VOLT=1 tegangan output LM317 menjadi 5 Volt, sebaliknya jika sinyal VPP_5VOLT=0 tegangan output LM317 menjadi 12 Volt.
·        Jika sinyal VPP_OFF=1 transistor Q1 menjadi off, VPP menjadi 0 Volt lewat tahanan R7, sebaliknya jika sinyal VPP_OFF=1 transistor Q1 menjadi on dan menyalurkan tegangan dari LM317, sehingga tegangan VPP menjadi 5 Volt atau 12 Volt, sesuai dengan kondisi sinyal VPP_5VOLT.
Nilai tahanan R1 dan R3 termasuk ‘aneh’, dipilih nilai ini untuk menyesuaikan agar tegangan output LM317 tepat 5 Volt atau 12 Volt, tahanan ini dibentuk dengan menghubungkan seri 2 tahanan, R1 dibentuk dengan tahanan  250 + 4,7 = 254.7 Ohm dan R3 dibentuk dengan tahanan 1000 + 120 = 1120 Ohm.
 Klik pada gambar untuk ukuran sebenarnya
Gambar 3
Skema Rangkaian AT89Cx051
Kabel yang dipakai untuk menghubungkan alat ini ke Parallel Port  komputer PC bisa dibeli jadi, di pasaran kabel ini dikenal dengan nama ‘Kabel LPT’, dikedua ujung kabel ini terdapat konektor DB25 (male), masing-masing kaki pada konektor ini dihubungkan secara langsung, yakni kaki 1 konektor pertama dihubungkan dengan kaki 1 konektor lainnya dan seterusnya.

Program Pascal pengatur Parallel Port

Berikut ini dibahas potongan-potongan program pembentuk sinyal-sinyal di atas, program-program ini merupakan program dasar yang mengendalikan Parallel Port  secara langsung.
Perlu diperhatikan sinyal-sinyal pada Parallel Port  bersifat logika negatip, kalau bit pada Control Register bernilai ‘1’ maka tegangan kaki bersangkutan pada konektor DB25 adalah 0 Volt, sebaliknya jika bit pada Control Register bernilai ‘0’ maka tegangan pada kaki konektor DB25 adalah 5 Volt.

Potongan Program 1 Mengatur arah data
01: PROCEDURE SetupOutput;
02: BEGIN
03:      { Control Register
04:        00001001
05:          | | ||_ NEXT      : normally LOW  positive pulse
06:          | | |__ PROG*     : normally HIGH negative pulse
07:          | |____ Latch     : normally LOW  positive pulse
08:          |______ Direction : 0 as ouput Port
09:      }
10:      ControlByte   := 9;                         {00001001}
11:      Port[Control] := ControlByte;
12: END;
13:  
14: PROCEDURE SetupInput;
15: BEGIN
16:      { Control Register
17:        00101001
18:          | | ||_ NEXT      : normally LOW  positive pulse
19:          | | |__ PROG*     : normally HIGH negative pulse
20:          | |____ Latch     : normally LOW  positive pulse
21:          |______ Direction : 1 as input port
22:      }
23:      ControlByte   := $29;                       {00101001}
24:      Port[Control] := ControlByte;
25: END;

PROCEDURE SetupInput dan PROCEDURE SetupOutput dipakai untuk menentukan nilai awal :
·        sinyal NEXT (kaki nomor 1 konektor DB25 terhubung ke bit 0 dari Control Register Parallel Port)
·        sinyal PROG (kaki nomor 14 konektor DB25 terhubung ke bit 1 dari Control Register Parallel Port)
·        sinyal LATCH (kaki nomor 17 konektor DB25 terhubung ke bit 3 dari Control Register Parallel Port)

tapi mengingat  sinyal-sinyal pada Parallel Port  bersifat logika negatip, maka :
·        sinyal NEXT nilai awalnya ‘0’, bit 0 Control Register malah diberi nilai ‘1’ (baris 5 dan 18)
·        sinyal PROG nilai awalnya ‘1’, bit 1 Control Register malah diberi nilai ‘0’ (baris 6 dan 19)
·        sinyal LATCH nilai awalnya ‘0’, bit 3 Control Register malah diberi nilai ‘1’ (baris 7 dan 20)

 Hal yang lebih penting dari kedua procedure di Potongan Program 1 ini adalah mengatur arah 8 jalur data dwi-arah Parallel Port, pada saat mengisi data ke Flash PEROM 8 jalur data ini akan menjadi output untuk menyalurkan data dari PC ke AT892051, dan pada saat membaca data dari Flash PEROM 8 jalur data ini berfungsi sebagai input untuk menyalurkan data dari AT89C2051 ke PC.
Pengaturan ini dilakukan lewat bit 5 Control Register, jika bit 5 Control Register bernilai 0 (baris 8) jalur data dwi-arah menjadi output dari Parallel Port, sebaliknya jika bit 5 Control Register bernilai 1 (baris 21) jalur data dwi-arah akan menjadi input ke Parallel Port.
Kemampuan untuk mengubah jalur data Parallel Port  menjadi input, hanya dimiliki oleh Enhance Parallel Port  (EPP). EPP umumnya dibuat menjadi satu dengan mother board PC, sedangkan Parallel Port  dalam Super I/O Card tidak termasuk EPP. Agar kemampuan ini bisa digunakan, Parallel Port  ini harus ditentukan sebagai Enhance Parallel Port  (EPP) lewat setup BIOS komputer.
Komputer yang tidak dilengkapi dengan EPP tetap bisa dipakai untuk mengisi PEROM, tapi tidak bisa membaca isi PEROM, sehingga program yang diisikan tidak bisa di-verifikasi apakah sudah masuk dengan benar.
Program yang dibuat dilengkapi dengan PROCEDURE MemeriksaPrinterPort yang berfungsi menentukan apakah Parallel Port  yang dipakai termasuk EPP.

Potongan Program 2 Pembangkitan pulsa dasar
01: PROCEDURE NEXT;
02: BEGIN
03:    Port[Control]:=ControlByte and $FE; {bit 0 Control Regiter}
04:    Port[Control]:=ControlByte;
05: END;
06:  
07: PROCEDURE PROG;
08: BEGIN
09:    Port[Control]:=ControlByte or $02; {bit 1 Control Regiter}
10:    Port[Control]:=ControlByte;
11: END;
12:  
13: PROCEDURE EraseStrobe;
14: BEGIN
15:    Port[Control]:=ControlByte or $02;  {bit 1 Control Regiter}
16:    Delay(30);
17:    Port[Control] := ControlByte;
18: END;

PROCEDURE Next membangkitkan pulsa positip di kaki nomor 1 konektor DB25, kaki nomor 1 ini dikendalikan lewat bit 0 di Control Register Parallel Port, bit 0 Control Register ini diberi nilai awal =1 oleh PROCEDURE SetupInput dan PROCEDURE SetupOutput, dibaris 3 bit 0 di-‘nol’-kan dan dibaris 4dikembalikan ke nilai awalnya, dengan cara ini kaki 1 konektor DB25 bertegangan 5 Volt sebentar dan kemudian menjadinya 0 Volt kembali.
PROCEDURE PROG membangkitkan pulsa negatip dikaki nomor 14 konektor DB25, kaki nomor 14 ini dikendalikan lewat bit 1 di Control Register Parallel Port, bit 1 Control Register ini diberi nilai awal =0 oleh PROCEDURE SetupInput dan PROCEDURE SetupOutput, dibaris 9 bit 1 di-‘satu’-kan dan dibaris 10 dikembalikan ke nilai awalnya, dengan cara ini kaki 14 konektor DB25 bertegangan 0 Volt sebentar dan kemudian menjadinya 5 Volt kembali. 
PROCEDURE EraseStrobe sama dengan PROCEDURE PROG, hanya saja pulsa negatip yang dibangkitkan jauh lebih lebar, sekitar 30 mili-detik yang ditentukan di baris 16. Pulsa ini dipakai untuk menghapus isi Flash PEROM, lebar pulsa yang diperlukan paling tidak selebar 10 mili-detik.

Potongan Program 3 Memantau kesiapan AT89C2051
01: FUNCTION Ready:BOOLEAN;
02: BEGIN   
03:      Ready := (Port[Status] and $80) = 0;
04: END;

Potongan Program 3 dipakai untuk memeriksa apakah AT89C2051 siap menerima data lagi.
Di atas dikatakan:
Saat kaki P3.1 menjadi ‘1’ kembali berarti selesai sudah proses pengisian data 1 byte ke dalam PEROM, dan AT89C2051 siap menerima data lagi.

Dalam rangkaian Gambar 3 kaki P3.1 terhubung ke kaki 11 konektor DB25, dalam Parallel Port  kaki 11 itu terhubung ke bit 7 Status Register. Tapi hubungan tersebut dalam kondisi berlawanan, artinya jika tegangan pada kaki 11 konektor DB25 = 0 Volt maka bit 7 Status Register bernilai ‘1’, sebaliknya jika tegangan pada kaki 11 konektor DB25 = 5 Volt maka bit 7 Status Register bernilai ‘0’.
Dengan demikian dalam FUNCTION Ready untuk memeriksa apakah AT89C2051 sudah siap menerima data, yang diperiksa adalah apakah bit 7 dari Status Register Parallel Port  bernilai ‘0’, jika bit 7 bernilai ‘0’ maka Ready bernilai true, sebaliknya jika bit 7 bernilai ‘1’ maka Ready bernilai false.

Potongan Program 4 Pengaturan Tegangan VPP
01: PROCEDURE TeganganVPP(V:BYTE);
02: BEGIN
03:      { Pemakaian 74HC574
04:        x1x1MMMM
05:        ||||||||_ Atmel Programming Mode bits
06:        |||||||__ Atmel Programming Mode bits
07:        ||||||___ Atmel Programming Mode bits
08:        |||||____ Atmel Programming Mode bits
09:        ||||_____ always 1
10:        |||______ VPP_5VOLT : true-VPP=5 V, false-VPP=12 V
11:        ||_______ Reset External Address Counter
12:        |________ VPP_OFF   : true-VPP=0 V, false-VPP=5 or 12 V
13:      }
14:      case V of
15:           0 : V:=$B0;           {10110000}
16:           5 : if ModeSelect=$0B
17:                  THEN V:=$70    {01110000}
18:                  ELSE V:=$30;   {00110000}
19:          12 : V:=$10;           {00010000}
20:          ELSE EXIT;
21:      END;
22:      SetupOutput;
23:      Port[Data]    := V + ModeSelect;
24:      Port[Control] := ControlByte and $F7; { bit 3 }
25:      Port[Control] := ControlByte;
26:      SetupInput;
27: END;
28:  
29: PROCEDURE ResetAddressCounter(Mode:BYTE);
30: BEGIN
31:      ModeSelect := $0B; { any illegal Mode }
32:      TeganganVPP(0);
33:      Delay(100);
34:      ModeSelect := Mode;
35:      TeganganVPP(5);
36:      Delay(100);
37: END;
38:  
39: PROCEDURE MatikanTegangan;
40: BEGIN
41:      ModeSelect := $0B; { any illegal Mode }
42:      TeganganVPP(0);
43: END;

PROCEDURE TeganganVPP untuk menentukan tegangan VPP yang diumpankan ke kaki RESET AT89C2051, sekali gus mengatur mode kerja AT89C2051.
Sinyal kontrol untuk keperluan di atas disimpan dalam IC 74HC574, data yang akan disimpan disiapkan di Port Data (baris 23), setelah itu bit 3 Control Register di-nol-kan (baris 24) dan dikembalikan ke nilai asalnya (baris 25), hali ini mengakibatkan terjadinya pulsa positip pada kaki nomor 17 konektor DB25, sebagai perintah bagi IC 74HC574 untuk mereka data dari Parallel Port.
Kombinasi data yang disimpan tergantung pada bit-bit pengatur mode kerja AT89C2051 seperti terlihat pada Tabel 1, dan sesuai dengan pengatur tegangan VPP terdiri dari sinyal VPP_5VOLT dan sinyal VPP_OFF yang sudah dibahas di atas.
PROCEDURE ResetAddressCounter untuk menyiapkan tegangan kerja AT89C2051 sekaligus me-reset ‘address counter’ dalam chip AT89C2051, mula-mula tegangan VPP dibuat menjadi 0 Volt dan setelah itu dijadikan 5 Volt, waktu tunda selama 100 mili-detik di baris 33 dimaksud menunggu sebentar agar catu daya stabil baru menaikkan tegangan itu menjadi 5 Volt (baris 35). Untuk kestabilan tegangan, mula-mula mode kerja AT89C2051 diberi kombinasi yang tidak dikenal di Tabel 1 (baris 31), baru kemudian diberikan kombinasi yang sesunguhnya (baris 34).
PROCEDURE MatikanTegangan untuk mematikan tegangan VPP dengan mode kerja yang tidak dikenal di Tabel 1 (baris 41).

Program Pascal pengatur AT89C2051

Program dasar pengatur Parallel Port  di atas, dipakai untuk membangun program pengatur AT89C2051 sebagai berikut:

Potongan Program 5 Pengisian PEROM
01: ResetAddressCounter($0E);
02: TeganganVPP(12);
03: SetupOutput;
04: Delay(100);
05: for I := 0 to PEROMsize do
06:      BEGIN
07:           Port[Data] := Buffer[I];
08:           PROG;
09:           REPEAT UNTIL Ready;
10:           NEXT;
11:      END;
12: MatikanTegangan;

Potongan Program  5 sepenuhnya mengikuti tata cara pengisian PEROM yang sudah dibahas, baris 1 mempersiapkan tegangan-tegangan yang diperlukan sambil menentukan mode kerja : Pengisian PEROM (=$0E, lihat Tabel 1). Setelah itu tegangan VPP dinaikkan jadi 12 Volt (baris 2) dan Parallel Port  dijadikan output (baris 3). Sebelum proses pengisian PEROM dimulai, ditunggu sebentar selama 100 mili-detik (baris 4), diharapkan setelah itu tegangan VPP stabil 12 Volt.
Pengisian 1 byte data ke PEROM dilaksanakan di baris7 sampai dengan 10,
·        data yang diisikan diletakkan di jalur data pada baris 7
·        kemudian baris 8 membangkitkan pulsa PROG agar data tadi disimpan di PEROM, AT89C2051 memerlukan waktu sekitar 1.2 mili-detik untuk menyimpan data ke PEROM,
·        baris 9 menunggu sampai AT89C2051 siap menerima data lagi
·        setelah itu dikirimkan pulsa positip NEXT untuk menaikkan nilai ‘address counter’
Proses di atas diulang sampai semua PEROM selesai diisi, proses pengulangan ini dibentuk dengan baris 5, 6 dan 11. Selesai mengisi PEROM, tegangan VPP dimatikan di baris 12.

Potongan Program 6 Membaca isi PEROM
01: ResetAddressCounter($0C);
02: for I := 0 to PEROMSize do
03:      BEGIN
04:           Buffer[I] := Port[Data];
05:           NEXT;
06:      END;
07: MatikanTegangan;

Membaca isi PEROM caranya jauh lebih sederhana dari pada mengisi PEROM, mula-mula baris 1 mempersiapkan tegangan-tegangan yang diperlukan sambil menentukan mode kerja : Pengisian PEROM (=$0C, lihat Tabel 1). Selesai mengerjakan perintah baris 1, isi PEROM sudah siap diambil (baris 4), untuk membaca isi PEROM dikirim pulsa NEXT pada baris 5, pulsa NEXT ini akan mengakibatkan ‘address counter’ nilainya bertambah 1.
Proses di atas diulang sampai semua PEROM selesai dibaca, proses pengulangan ini dibentuk dengan baris 2, 3 dan 6. Selesai membaca isi PEROM, tegangan VPP dimatikan di baris 7.

Penutup

Program yang dibuat mencakup fasilitas untuk mengenali apakah chip AT89C2051 sudah terpasang ditempatnya, juga dilengkapi fasilitas untuk menghapus program yang sudah tersimpan dalam PEROM, membaca isi PEROM, memeriksa apakah PEROM masih kosong, dan tentu saja fasiltas utama untuk pengisian data ke PEROM, program ini disajikan selengkapnya dalam situs.
Flash PEROM Programmer ini merupakan alat kunci dalam bermain AT89C2051, tanpa adanya alat ini tidak mungkin dibuat alat berbasiskan AT89C2051.

Software programmer At89C2051 yang siap pakai dapat anda download disini
Gambar PCB yang telah jadi dan siap pakai anda bisa download disini

Pemrograman MCS51/AVR dengan Bahasa Basic

Mungkin hal ini sudah tidak asing bagi kalangan pecinta mikrokontroler, tetapi dalam hal ini penulis mencoba menulis reviewnya sekedar untuk berbagi tutorial maupun softwarenya bagi yang membutuhkan. Nama aplikasinya ialah BASCOM 8051 untuk MCS51 dan BASCOM AVR untuk AVR.

Jadi jka teman-teman memiliki biasa menggunakan visual basic pasti akan mudah memprogram mikrokontroler keluarga MCS51 maupun AVR dengan software ini, karena statment nya tidak jauh berbeda dengan visual basic dan lebih menyenangkan lagi karena software ini dilengkapi simulasi output dan debug program yang mudah dipahami.

Ketika penulis mencoba menggunakan terasa begitu mudah dipahami meski baru beberapa saat. tidak sabar berikut screenhotnya :

sesi paling penting :
Download Bascom 8051 full version dapat download disini
Download Bascom AVR full version dapat download disini

Untuk tutorial dan artikel penggunaan bascom 8051/avr anda dapat mendownload pada kolom ebook



Pemrograman MCS51/AVR dengan Bahasa C

Bahasa Assembler merupakan bahasa pemrograman tingkat paling rendah, hanya mengenal instruksi-instruksi paling dasar mikrokontroler, ditambah dengan beberapa perintah untuk mengatur memori secara sederhana. Bahasa pemrograman ‘satu tingkat’ di atas Asembler adalah bahasa C yang sangat fleksible, dipakai untuk membangun Windows, tapi bisa juga dipakai untuk rancang bangun peralatan dengan mikrokontroler.

C asalnya dirancang sebagai bahasa pemrograman untuk membangun sistem  operasi UNIX pada komputer DEC PDP-11, sekitar awal tahun 1970-an. Bahasa ini berkembang secara pesat, pada tahun 1983, American National Standards Institute (ANSI) membentuk komite kerja dengan tugas khusus membakukan bahasa C sebagai bahasa pemrograman yang tidak tergantung pada jenis komputer. Hasil kerja komite tersebut merupakan pedoman baku untuk bahasa C, dan C compiler yang dibangun atas dasar pedoman tersebut disebut sebagai ANSI-C.
Semua C compiler yang ada kini kebanyakan adalah ANSI-C, tapi masing-masing mempunyai variasinya tersendiri, dilengkapi dengan sarana-sarana untuk memudahkan pemakaian C pada komputer tertentu. Dalam hal ini dikenal Turbo C, Borland C++, Visual C dan lain sebagainya, semuanya merupakan C Compiler yang banyak dipakai pada IBM-PC, tentu saja hasil akhir dari semua C Compiler tadi adalah kode mesin untuk prosesor IBM-PC (8086, 80286, 80386, 80486 dan Pentium).
Tapi bahasa C untuk keperluan rancang bangun peralatan yang memakai mikrokontroler tentu saja tidak memerlukan sarana-sarana tambahan secanggih C Compiler yang dipakai dalam IBM-PC, dan hasil akhirnya harus berupa kode mesin untuk masing-masing mikrokontroler/mikroprosesor. Artinya C Compiler untuk mikrokontroler MCS51 harus menghasilkan kode mesin MCS51, C Compiler untuk MC68HC11 harus menghasilkan kode mesin MC68HC11 pula.
Dengan pengertian di atas. C Compiler untuk IBM-PC tidak bisa dipakai untuk mikrokontroler, dan masing-masing jenis mikrokontroler mempunyai C Compiler tersendiri.

C Compiler untuk MCS51

Sejak akhir tahun 1980-an, telah banyak dibuat C Cross-Compiler yang bekerja pada IBM-PC untuk MCS51, artinya C Compiler tersebut bekerja di IBM-PC tapi kode mesin yang dihasilkan bukan untuk IBM-PC melainkan untuk MCS51.
C Compiler untuk MCS51 yang cukup dikenal antara lain adalah Micro-C buatan Dunfield Development Systems, Franklin C buatan Franklin Software Inc dan C51 buatan Keil Software, harga perangkat lunak tersebut tidak murah. Yang menarik meskipun harganya mahal, Keil membagikan C51 produknya yang bisa diminta lewat situs web http://www.keil.com, C51 gratis tersebut dibatasi hanya bisa menghasilkan kode mesin MCS51 paling banyak 2 KiloByte. Tapi untuk keperluan projek kecil-kecil yang memakai AT89C2051 batasan memori tersebut tidak merupakan masalah, karena memori-program AT89C2051 memang hanya sebesar 2 KiloByte.
Selain produk komersil tersebut di atas, ada pula C Compiler gratis, yang dikenal sebagai SDCC – Small Device C Compiler.

Small Device C Compiler - SDCC

SDCC, buatan Sandeep Dutta (sandeep@users.sourceforge.net), sejak semula memang dibuat sebagai software gratis (freeware), kemudian project mulia ini digabungkan dengan projek GNU, yakni projek ramai-ramai insan Internet yang melahirkan Linux. Dengan demikian, kini program SDCC bisa diambil pada situs http://sdcc.sourceforge.net.

Dalam rancangannya, SDCC dipersiapkan untuk berbagai macam mikroprosesor / mikrokontroler, hal ini sesuai dengan sifat bahasa C yang mudah diadaptasikan ke berbagai macam prosesor. Sampai saat ini, SDCC sudah bisa dipakai untuk mikroprosesor Z80, mikrokontroler MCS51, dalam waktu dekat akan segera bisa dipakai untuk mikrokontroler AVR buatan Atmel, dan mikrokontroler PIC buatan MicroChip, dan beberapa prosesor lainnya akan segera menyusul.
Hal ini membuat SDCC menjadi sangat menarik. Setelah terbiasa memakai SDCC untuk projek-projek dengan MCS51, kelak satu saat bermaksud memakai mikrokontroler AVR karena memerlukan mikrokontroler yang kemampuannya lebih, maka tidak banyak hambatan untuk beralih prosesor, bahkan program-program yang sudah dikembangkan untuk MCS51 dengan SDCC, dengan sedikit perubahan bisa dipakai di sistem yang memakai AVR.

SDCC dapat anda download disini
Manual booknya anda bisa download disini

Dasar Pemrograman MCS51 (Bagian 3)

Dasar Pemrograman MCS51 (AT89C51, AT89S51, AT89C2051) atau keluarga mikrokontroler MCS51 Bagian Ketiga.
  
Operasi Bit dengan MCS51
Pada umumnya mikrokontroler mengolah data 8 bit sekali gus, misalnya mengisi akumulator dengan data 8 bit sekali gus, isi akumulator yang 8 bit dijumlahkan dengan isi memori yang 8 bit dan lain sebagainya. MCS51 dilengkapi kemampuan mengolah data per bit, untuk keperluan ini bit Carry dalam PSW diperlakukan sebagai ‘akumulator bit’, dan dilengkapi dengan beberapa instruksi khusus untuk operasi Boolean.
 

Objek operasi Bit

          Seperti sudah dibahas dibagian depan, memori-data nomor $20 sampai $2F bisa dipakai menampung informasi dalam level bit. Setiap byte memori di daerah ini bisa menampung 8 bit informasi yang masing-masing dinomori tersendiri, misalkan bit 0 dari memori-data nomor $20 bisa disebut sebagai bit nomor 0, bit 1 memori-data nomor $20 disebut sebagai bit nomor 1… seterusnya bit 0 dari memori-data nomor $21 disebut sebagai bit nomor 8, bit 7 memori-data nomor $21 disebut sebagai bit nomor 15 dan seterusnyanya.
          Dengan demikian memori-data nomor $20 sampai dengan nomor $2F sebanyak 16 byte memori bisa dipakai untuk menyimpan 128 bit (16 x 8 bit) data Boolean yang dinomori dengan bit nomor $00 sampai $7F.
           Di samping itu, operasi bit bisa pula belaku di memori-data nomor $80 sampai dengan $FF yang biasa disebut sebagai Special Function Register (SFR). Hanya SFR dengan nomor memori-data yang diakhiri dengan angka heksa-desimal 0 atau 8 yang bisa dipakai untuk operasi bit, bit pada memori-data daerah ini sebanyak 128 bit, mendapat nomor dari $80 sampai dengan $FF.
Secara keseluruhan operasi bit bisa diberlakukan pada 256 lokasi bit seperti terlihat dalam Gambar 6.


Gambar 6
Denah memori-bit

Operasi bit yang bisa ditangani oleh MCS51 antara lain mencakup : pemberian nilai pada data biner 1 bit, perpindahan data 1 bit, operasi logika 1 bit meliputi operasi AND, OR dan NOT, pengujian nilai data biner 1 bit

Pemberian nilai data biner

Untuk keperluan ini disediakan 2 instruksi, yakni SETB (Set Bit) dipakai memberi nilai ‘1’ pada data biner 1 bit, dan CLR (Clear Bit) dipakai memberi nilai ‘0’ pada data biner 1 bit.
Contoh pemakaian instruksi ini sebagai berikut :

            SETB ACC.0
      SETB $E0
      CLR  P1.1
      CLR  $90

Instruksi SETB ACC.0 di atas membuat bit 0 dari akumulator (ACC.0) bernilai ‘1’,  tapi mengingat nomor bit dari bit 0 akumulator adalah $E0 (lihat Gambar 6), maka hasil kerja kedua instruksi SETB di atas adalah sama.
Demikian pula dengan kedua instruksi CLR berikutnya, instruksi-instruksi ini akan mengakibatkan P1.1 bernilai ‘0’. Di samping itu perlu pula diingat, P1.1 terhubung ke kaki  IC MCS51, jadi hasil kerja operasi SETB maupun CLR pada P0, P1, P2 dan P3 bisa langsung terukur dengan volt meter, atau operasi-operasi ini bisa langsung dipakai men-on/off-kan rangkaian di luar IC MCS51.

Perpindahan data biner

Dalam operasi bit, bit Carry di dalam Program Status Word (PSW, nomor $D0) diperlakukan sebagai akumulator.
256 data dalam level bit dalam MCS51, bisa dipindahkan dari satu posisi ke posisi yang lain, permindahan ini dilakukan dengan bantuan bit Carry yang mempunyai sifat sebagai ‘akumulator bit’.
Contoh permindahan data level bit ini bisa dilakukan sebagai berikut :
           
      MOV C,P1.1
      MOV P1.0,C

2 instruksi di atas akan meng-copy-kan tegangan pada kaki Port 1 bit 1 ke kaki Port 1 bit 0, dengan demikian tegangan pada kedua kaki IC MCS51 itu akan sama. Seluruh 256 bit data yang dibahas di atas, bisa dipindah-pindahkan dengan instruksi ini.

Operasi logika

Operasi logika pada umumnya mencakup empat hal, yaitu operasi AND, operasi OR, operasi EX-OR dan operasi NOT. MCS51 hanya bisa melaksanakan tiga jenis operasi logika yang ada, yakni intruksi ANL (AND Logical) untuk operasi AND instruksi ORL (OR Logical) untuk operasi OR, CPL (Complement bit) untuk operasi NOT.
Bit Carry pada PSW diperlakukan sebagai ‘akumulator bit’, dengan demikian operasi AND dan operasi OR dilakukan antara bit yang tersimpan pada bit Carry dengan salah satu dari 256 bit data yang dibahas di atas. Contoh dari instruksi-instruksi ini adalah :

            ANL C,P1.1
      ANL C,/P1.2
           
Instruksi ANL C,P1.1 meng-AND-kan nilai pada bit Carry dengan nilai Port 1 bit 1 (P1.1), dan hasil operasi tersebut ditampung pada bit Carry. Instruksi ANL C,/P1.1 persis sama dengan instruksi sebelumnya, hanya saja sebelum di-AND-kan, nilai P1.1 dibalik (complemented) lebih dulu, jika nilai P1.1=‘0’ maka yang di-AND-kan dengan bit Carry adalah ‘1’, demikian pula sebaliknya. Hal serupa berlaku pada instruksi ORL.
Instruksi CPL dipakai untuk membalik (complement) nilai semua 256 bit data yang dibahas di atas. Misalnya :

CPL C
CPL P1.0

CPL C akan membalik nilai biner dalam bit Carry (jangan lupa bit Carry merupakan salah satu bit yang ada dalam 256 bit yang dibahas di atas, yakni bit nomor $E7 atau PSW.7).

Pengujian nilai Boolean

Pengujian Nilai Boolean dilakukan dengan instruksi JUMP bersyarat, ada 5 instruksi yang dipakai untuk keperluan ini, yakni instruksi JB (JUMP if bit set), JNB (JUMP if bit Not Set), JC (JUMP  if Carry Bit set), JNC (JUMP if Carry Bit Not Set) dan JBC (JUMP if  Bit Set and Clear Bit).
Dalam instruksi JB dan JNB, salah satu dari 256 bit yang ada akan diperiksa, jika keadaannya (false atau true) memenuhi syarat, maka MCS51 akan menjalankan instruksi yang tersimpan di memori-program yang dimaksud. Alamat memori-program dinyatakan dengan bilangan relatip terhadap nilai Program Counter saat itu, dan cukup dinyatakan dengan angka 1 byte. Dengan demikian instruksi ini terdisi dari 3 byte, byte pertama adalah kode operasinya ($29 untuk JB dan $30 untuk JNB), byte kedua untuk menyatakan nomor bit yang harus diuji, dan byte ketiga adalah bilangan relatip untuk instruksi tujuan.
Contoh pemakaian instruksi JB dan JNB sebagai berikut :

            JB  P1.1,$
      JNB P1.1,$

Instruksi-instruksi di atas memantau kedaan kaki IC MCS51 Port 1 bit 1. Instruksi pertama memantau P1.1, jika P1.1 bernilai ‘1’ maka MCS51 akan mengulang instruksi ini, (tanda $ mempunyai arti jika syarat terpenuhi kerjakan lagi instruksi bersangkutan). Instruksi berikutnya melakukan hal sebaliknya, yakni selama P1.1 bernilai ‘0’ maka MCS51 akan tertahan pada instruksi ini.
Bit Carry merupakan bit yang banyak sekali dipakai untuk keperluan operasi bit, untuk menghemat pemakaian memori-program disediakan 2 instruksi yang khusus untuk memeriksa keadaan bit Carry, yakni JC dan JNC. Karena bit akan diperiksa sudah pasti, yakni bit Carry, maka instruksi ini cukup dibentuk dengan 2 byte saja, dengan demikian bisa lebih menghemat memori program.

            JC Periksa
      JB PSW.7,Periksa

Hasil kerja kedua instruksi di atas sama, yakni MCS51 akan JUMP ke Periksa jika ternyata bit Carry bernilai ‘1’ (ingat bit Carry sama dengan PSW bit 7). Meskipun sama tapi instruksi JC Periksa lebih pendek dari instruksi JB PSW.7,Periksa, instruksi pertama dibentuk dengan 2 byte dan instruksi yang kedua 3 byte.
Instruksi JBC sama dengan instruksi JB, hanya saja jika ternyata bit yang diperiksa memang benar bernilai ‘1’, selain MCS51 akan JUMP ke instruksi lain yang dikehendaki MCS51 akan me-nol-kan bit yang baru saja diperiksa.

Pemakaian Instruksi operasi bit

Dengan ingtruksi-instruksi operasi bit yang ada, MCS51 bisa dipakai untuk mengimplementasi fungsi Boolean secara langsung, sebagai contoh persamaan Boolean berikut diimplementasikan dengan instruksi-instruksi MCS51.

Q = ( U· ( V + W )) + ( X·/Y ) + /Z
(Catatan : /Y artinya not Y dan /Z artinya not Z).

Misalkan U V W X Y dan Z masing-masing adalah besaran Boolean yang dimasukkan ke kaki Port 1 bit 0 sampai dengan 5, sedangkan Q merupakan besaran Boolean yang ditampilkan di Port 3 bit 0, seperti terlihat dalam Gambar 7 berikut.
 
Gambar 7
Rangkaian Q = ( U·( V + W )) + ( X·/Y ) + /Z

Dalam Potongan Program baris 1 sampai dengan 7, P1.0 P1.1 dan lainnya dinyatakan sebagai data bit dengan nama U, V dan selanjutnya, penamaan ini menggunakan perintah khusus untuk assembeler (Assembler Directive) BIT, hanya nama-nama yang dibentuk dengan assembler-directive BIT yang bisa dipakai untuk operasi bit.