Categories
Mikrokontroler

Up-Down Counter menggunakan uC AT89

Sebenarnya membuat aplikasi pencacah naik-turun (up-down counter) menggunakan AT89 adalah hal yang aneh dalam dunia elektronika digital. Lho kok? La ya… lha wong tinggal pake rangkaian dengan IC TTL (seri 74LS) saja sudah bisa, kok ini pake programming mikrokontroler segala… Lha kalo untuk belajar pemrograman mikrokontroler gimana? O ya silahkan saja… itu jadi gak aneh lagi… he he he…

Oke gak apa-apa, yang penting kali ini kita belajar bagaimana membuat pencacah naik turun menggunakan mikrokontroler seri AT89C atau AT89S. Perhatikan rangkaiannya terlebih dahulu…

Mmmm gak ada yang aneh khan? Biasa-biasa saja, tombol pushbutton digunakan untuk memberi picuan atau detak (clock) untuk melakukan pencacahan naik (P3.2 atau ~INT0) atau pencacahan turun (P3.3 atau ~INT1). Dengan demikian kita juga sekaligus belajar memanfaatkan fasilitas interupsi di AT89.

Baik, program kita awali dengan menentukan alamat seperti biasa di lokasi 0h, dilanjutkan dengan lompatan ke label “utama” (ljmp utama):

	org 	0h
	ljmp	utama

Kemudian dilanjutkan dengan mendefinisikan vektor atau lokasi interupsi INT0 dan INT1. Untuk interupsi-0 (INT0) kita isikan lompatan ke label “cacah_naik”. Lho kok gak pake ORG? ya karena instruksi sebelumnya (ljmp utama) berukuran 3 byte (menempati lokasi 0, 1, dan 2), sedangkan vektor interupsi INT0 harus dituliskan mulai lokasi 3 dan itu pas dengan instruksi pertama, jadi gak perlu pake ORG. Sedangkan untuk INT1 tetap harus menggunakan ORG 13h (instruksi ljmp cacah_turun):

        ljmp	cacah_naik
        org	13h
        ljmp	cacah_turun

Instruksi-instruksi berikutnya adalah melakukan inisialisasi data angka yang akan ditampilkan di 7-segmen (pada lokasi yang ditandai dengan label “numerik“), sedangkan lokasi program utama mulai alamat 30h:

        org	30h
 utama:
        mov	dptr, #numerik

Kemudian persiapan akumulator A, data pertama juga ditempatkan ke A, tampilkan ke 7-segmen yang terhubung dengan P0, dan jangan lupa ada sebuah register, R0, yang digunakan untuk menyimpan indeks data (mengapa? Karena untuk cacah turun tidak ada perintah DEC atau penurunan pada DPTR, dalam hal ini data menggunakan register DPTR):

        clr	a
        movc	a, @a+dptr
        mov	p0, a
        mov	r0, #0

Nah, sekarang inisialisasi interupsi, eksternal-0 (INT0), eksternal-1 (INT1), aktivasi interupsi global (EA), aktifkan interupsi aktif low pada IT0 dan IT1:

        setb	ex0
        setb	ex1
        setb	ea
        setb	it0
        setb	it1

Dan seperti biasa, lompat ditempat:

        sjmp	$

Baiklah, sekarang apa yang terjadi jika terjadi penekanan tombol pada INT0? Ya betul! Terjadilah interupsi eksternal-0, label apa yang dijalankan? Ya tepat! Label “cacah_naik” yang dijalankan. Pertama nilai R0 dinaikkan (untuk indeks data berikutnya), kemudian bandingkan dengan nilai #10 (apakah R0 = 10, artinya data sudah semuanya), jika belum maka lompat ke label “tampil”, namun jika R0=10, maka R0 dibuat sama dengan 9, selesai interupsi:

cacah_naik:
        inc	r0
        cjne	r0, #10, tampil
        mov	r0, #9
        reti

Begitu juga saat interupsi eksternal-1 (INT1) yang terjadi, maka mikrokontroler akan mengerjakan label “cacah_turun”. Pertama nilai R0 dikurangi satu, kemudian dibandingkan datanya apakah sama dengan 255, lho kok? Setelah R0=0 kemudian ada instruksi untuk mengurangi satu, maka akan kembali ke nilai terbesar yaitu 255, hal ini diistilahkan dengan warping. Jika sama, maka nilai R0 dipertahankan agar sama dengan 0. Kalo belum sama ya data ditampilkan saja:

cacah_turun:
        dec	r0
        cjne	r0, #255, tampil
        mov	r0, #0
        reti

Untuk masalah tampilan ke 7-segmen adalah masalah gampang! Simpan lokasi data yang sudah siap ke akumulator A, kemudian lakukan penyalinan data ke A menggunakan MOVC dan tampilkan ke 7-segmen yang terhubungkan melalui port-0, selesai:

tampil:
        mov	a, r0
        movc	a, @a+dptr
        mov	p0, a
        reti

Program selengkapnya sebagai berikut:
——————————————————————————-

	org 	0h
	ljmp	utama
	ljmp	cacah_naik
	org	13h
	ljmp	cacah_turun
	org	30h
utama:
	mov	dptr, #numerik
	clr	a
	movc	a, @a+dptr
	mov	p0, a
	mov	r0, #0
;
	;mov	ie, #85h	; <- bisa juga aktivasi INT pake yang singkat begini
	setb	ex0
	setb	ex1
	setb	ea
	setb	it0
	setb	it1
	sjmp	$
;
cacah_naik:
	inc	r0
	cjne	r0, #10, tampil
	mov	r0, #9
	reti
;
cacah_turun:
	dec	r0
	cjne	r0, #255, tampil
	mov	r0, #0
	reti
;
tampil:
	mov	a, r0
	movc	a, @a+dptr
	mov	p0, a
	reti
;
numerik:
	DB	0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,80h,90h
	end

——————————————————————————-

Semoga bermanfaat!