Categories
Mikrokontroler

Aplikasi Pushbutton Mikrokontroler ATMega32 dengan Assembly

Jika pada kesempatan sebelumnya saya bahas tentang animasi LED menggunakan ASsembly dan C, maka kali ini kita akan belajar tentang konsep masukan menggunakan pushbutton, dalam dunia aplikasi, masukan digital ini bisa berasal dari berbagai macam sensor.

Rangkaian yang kita gunakan mirip dengan animasi LED, hanya saja sekarang kita tambahkan 2 buah pushbutton yang dihubungkan ke PORTD.0 dan PORTD.1, perhatikan Gambar 1.

Gambar 1

Selanjutnya kita buat programnya dengan diagram alir yang ditunjukkan pada Gambar 2.

Gambar 2

Program selengkapnya sebagai berikut:

;=======================================================================
;program aplikasi pushbutton dan animasi LED
;http://agfi.staff.ugm.ac.id
;=======================================================================

.nolist
.include "m32def.inc"
.list

;-----------inisialisasi konstanta dan register---------------------------------
.equ	led=0b10000000		;variabel LED sebagai data
.def	temp=r16
.def	delay1=r17
.def	delay2=r18
.def	delay3=r19  

;--- deklarasi segmen untuk kode/program -----------
.cseg
.org	0000	;awal kode program pada alama 0x0000

; menyiapkan alamat SP - Stack Pointer ----------------
; harus dituliskan sebagai inisialisasi SP pada RCALL
	ldi temp,low(ramend)
	out spl,temp
	ldi temp,high(ramend)
	out sph,temp

;-----------inisialisasi port-----------------------------------------------
	ldi	temp,0b11111111	;inisialisasi untuk pin di
	out	ddrb,temp		;PORTB sebagai luaran semua
	clr	temp			;inisialisasi untuk pin di
	out	ddrd,temp		;PORTD sebagai masukan semua
	ser	temp			;inisialisasi untuk pin di
	out	portd,temp 		;PORTD agar aktif semua internal pull-up-nya
	ldi	temp,led		;persiapan data untuk animasi LED

kanan:
	out	portb,temp		;keluarkan melalui PORTB
	sbis	pind,0			;cek apakah pind,0 HIGH
	rjmp	kiri			;YA! lompat ke label kiri
	rcall	tunda			;TIDAK!
	ror	temp			;putar satu bit ke kanan
	rjmp	kanan			;lagi!

kiri:
	out	portb,temp		;keluarkan melalui OPRTB
	sbis	pind,1			;cek apakah pind,1 HIGH
	rjmp	kanan			;YA! lompat ke label kanan
	rcall	tunda			;TIDAK!
	rol	temp			;putar satu bit ke kiri
	rjmp	kiri			;lagi!

; =============================
;    delay loop generator
;     2000000 cycles:
; -----------------------------
; delaying 1999998 cycles:
tunda:
          ldi  R17, $12
WGLOOP0:  ldi  R18, $BC
WGLOOP1:  ldi  R19, $C4
WGLOOP2:  dec  R19
          brne WGLOOP2
          dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; -----------------------------
; delaying 2 cycles:
          nop
          nop
		  ret
; =============================
.exit				;akhir program

Penjelasan:

  • Untuk penjelasan tentang inisialisasi stack dan rutin tundaan silahkan lihat artikel lain-nya;
  • Perhatikan blok inisialisasi PORT, untuk menentukan apakah suatu PORT digunakan sebagai luaran atau masukan digunakan register DDRx, dengan x diisi A, B, C atau D menyesuaikan dengan penggunaan port yang digunakan. Dalam kasus ini digunakan DDRB dan DDRD, masing-masing untuk PORTB dan PORTD. Logika ‘1’ untuk luaran, logika ‘0’ untuk masukan.
  • Sekali lagi penulisan ke DDRx tidak bisa dilakukan langsung, artinya Anda tidak bisa memberikan instruksi, misalnya, ‘out ddrd,0b00000000’ yang mengakibatkan adanya kesalahan saat kompilasi. Gak percaya? Ya silahkan dicoba sendiri…
  • Selanjutnya label ‘KANAN‘ dan ‘KIRI‘ digunakan untuk melakukan animasi LED sesuai dengan pushbutton yang ditekan. Pada label KANAN, diawali dengan mengeluarkan data TEMP ke PORTB, kemudian diikuti dengan instruksi SBIS yang merupakan instruksi “Skip if Bit in I/O Register is Set“, artinya abaikan instruksi berikutnya jika bit yang diperiksa bernilai HIGH atau berlogika ‘1’. Karena yang diperiksa adalah PORTD.0, dan konfigurasinya adalah aktif rendah (ditekan berarti HIGH), sehingga jika tidak ditekan (dalam kondisi 1′ atau SET), maka instruksi RJMP KIRI akan diabaikan, dan program melanjutkan ke penundaan sesaat (RCALL TUNDA), melakukan rotasi bit ke kanan pada TEMP (ROR TEMP) dan mengulang lagi (RJMP KANAN).
  • Hal di atas berlaku juga untuk label KIRI, demikian seterusnya.
  • Semoga bermanfaat silahkan berdiskusi melalui tanya jawab di bagian komentar, terima kasih.
  • Ingin private dengan saya untuk Belajar Mikrokontroler AVR ATMega32 menggunakan bahasa BASIC? Silahkan cermati informasinya disini.