Categories
Mikrokontroler

Tutorial Mikrokontroler AT89: Masukan dan Luaran (I/O)

Pada mikrokontroler Atemal keluarga AT89C (obsollete) atau AT89S, Port 0 tidak memiliki pullup internal. Pullup FET yang berada di dalam penggerak luaran P0 digunakan hanya pada saat port mengirimkan logika ‘1’ selama pengaksesan memori eksternal. Selain dari itu, pullup FET akan selalu mati. Konsekuensinya, jalur-jalur P0 yang digunakan sebagai jalur luaran merupakan saluran terbuka (open drain). Penulisan ‘1’ ke bit pengancing membuat kedua FET keluaran menjadi mati, dengan demikian kondisi kaki-kakinya menjadi mengambang (float). Dalam kondisi seperti ini, pin dapat digunakan sebagai masukan berimpedansi tinggi.

Karena Port 1, 2 dan 3 telah memiliki pullup internal yang pasti, mereka dinamakan sebagai port-port kuasi-dwi-arah (quasi-bidirectional). Saat dikonfigurasi sebagai masukan, maka ditarik tinggi dan memberikan arus (source current) saat ditarik rendah secara eksternal. Port 0, di sisi lain, merupakan Port 0 dwi-arah yang sebenarnya, karena akan mengambang jika dikonfigurasi sebagi masukan.

Fungsi reset atau saat Power ON akan menuliskan ‘1’ ke seluruh bit-bit pengancing (latch) port pada keluarga AT89. Jika kemudian ‘0’ dituliskan ke pengancing, pengancing dapat dikonfigurasi sebagai masukan jika ‘1’ dituliskan padanya.

Contoh rangkaian dan aplikasi

Rangkain minimum untuk menghidupkan 8 LED melalui Port 1 ditunjukkan pada gambar dibawah ini. Yang perlu diperhatikan adalah konfigurasi rangkaian LED itu sendiri, yaitu Common Anode (CA), artinya untuk menghidupkan LED pada Port 1 yang bersangkutan, harus dikirim logika ‘0′. Hal ini berkaitan dengan penjelasan sebelumnya, Jika ‘0’ kita tulis ke Port 0 maka luaran dari lacth (yang ) akan menghidupkan FET sehingga baik kaki Port 0 maupun resistor pullup internal akan di pulled-low (secara internal juga), sehingga LED yang terhubungkan secara CA bisa menyala.

Sedangkan jika menggunakan rangkaian Common Khatode (CK), untuk menyalakan LED butuh penulisan ‘1’, namun penulisan ‘1’ ini menyebabkan Port 0 menjadi masukan berimpedansi (karena adanya resistor pullup internal) dan hanya cocok untuk masukan bukan keluaran (arus dari pullup internal tidak kuat untuk menyalakan LED karena ordenya uA, sedangkan keluarannya bisa mencapai sekitar 3,8 mA). Hal ini berlaku juga untuk Port 2 dan Port 3. Penggunaan resistor 330 ohm sebagai pembatas arus, dengan tegangan Vcc 5 volt maka arusnya sekitar 15 mA dan ini cukup untuk menghidupkan LED (biasanya sekitar 10 mA).

Program bab3_01.asm merupakan aplikasi untuk membuat kelompok 4 (empat) LED mati-hidup secara bergantian (flip-flop):

1:	;-- BAB3_01.ASM -----------------------------------------------------------
2:	;
3:	; LAMPU FLIP-FLOP PADA PORT 1
4:	;
5:	;--------------------------------------------------------------------------
6:	        ORG   0H			; PROGRAM DITEMPATKAN PADA LOKASI 0000H
7:	;
8:	MULAI:  MOV   P1,#00001111B     ; LED P1.4 S/D P1.7 NYALA (HEKSA= #0FH)
9:	        ACALL DELAY             ; LAKUKAN PENUNDAAN SESAAT (SUB. DELAY)
10:	        MOV   P1,#11110000B     ; LED P1.0 S/D P1.3 NYALA (HEKSA= #0F0H)
11:	        ACALL DELAY             ; LAKUKAN PENUNDAAN SESAAT (SUB. DELAY)
12:	        SJMP  MULAI             ; ULANGI LAGI DARI AWAL
13:	;
14:	;-SUBRUTIN DELAY-----------------------------------------------------------
15:	;
16:	; SUBRUTIN INI HANYA SEKEDAR MELAKUKAN PENUNDAAN SESAAT DENGAN CARA
17:	; MENGULANGI PROSES (PENGURANGAN ISI REGISTER) HINGGA DICAPAI SUATU
18:	; KONDISI TERTENTU
19:	;
20:	;--------------------------------------------------------------------------
21:	DELAY:  MOV   R0,#5H            ; ISI REGISTER R0 DENGAN 5 (5X ULANG)
22:	DELAY1: MOV   R1,#0FFH          ; ISI REGISTER R1 DENGAN 255 (255X ULANG
23:	DELAY2: MOV   R2,#0             ; ISI REGISTER R2 DENGAN 0 (256X ULANG)
24:	        DJNZ  R2,$              ; R2=R2-1, JIKA R2 BELUM 0 ULANGI LAGI
25:	        DJNZ  R1,DELAY2         ; R1=R1-1, JIKA R1 BELUM 0 ULANGI DELAY2
26:	        DJNZ  R0,DELAY1         ; R0=R0-1, JIKA R0 BELUM 0 ULANGI DELAY1
27:	        RET                     ; KEMBALI KE PEMANGGIL SUBRUTIN DELAY
28:	END

Baris 8-12 merupakan program utama, sedangkan baris 1-5 dan 14-20 merupakan komentar sekaligus berisi keterangan program (diabaikan selama proses kompilasi), baris 6 digunakan agar instruksi dituliskan mulai alamat 0h. Baris 8 digunakan untuk mengirimkan data 00001111B (biner) ke Port 1 agar lampu LED4 – LED7 (berkaitan dengan P1.4-P1.7) menyala, kemudian diikuti dengan mengerjakan tundaan (baris-9) yaitu mengerjakan sub-rutin Delay, kemudian bergantian LED0-LED3 (berkaitan dengan P1.0-P1.3) dinyalakan (baris-10), kemudian (baris-11) tundaan lagi. Proses ini diulang dari awal dengan instruksi SJMP MULAI pada baris 12. Baris 21-27 merupakan program subrutin DELAY.

Informasi lebih lengkap bisa diperoleh di buku saya “Belajar Mikrokontroler At89C51/52/55: Teori dan Aplikasi, Edisi 2“, CV. Gava Media – Yogyakarta (klik)