ARM7 Assembly – Port On/Off

arm7_ledasmkucuk2 Merhaba, Şimdiki uygulamamız ARM7 assembly diliyle port on/off (led on/off veya röle vs yapılabilir) işlemini gerçekleştireceğiz. Microcontroller’lara ilk olarak assembly diliyle başladığım ve işlemci donanımını tanımayı kolaylaştırdığı için arm işlemcilere de ilk geçtiğimde arm assembly dilini inceledim. Çok fonksiyonlu bir komut seti var ama tabii ki kullanımı oldukça zor. Ayrıca 32bit ile çalışmanın getirdiği zorluklarda var. Gerçek hayatta gerektiği yerde C içinde inline kullanmak daha mantıklı. İnternette arm assembly örnekleri gerçekten çok az bu nedenle blogumda arm7 asm’den bazı örnekler olsun istiyorum ve ayrıca arm assembly’nin nasıl olduğunu merak edenler olabilir.

İlk projemiz oldukça basit, port on/off yapacağız, derleyici olarak keil kullanacağım. Bilindiği gibi keil, C compiler’ın yanısıra assembler/simulatör ve debugger olarakta kullanılabilmektedir. Detayları için www.keil.com’dan öğrenebilirsiniz.

Kullanacağım işlemci (LPC2148) ARM7TDMI tabanlı bir işlemci olduğu için ARM7TDMI assembly komut setini kullanıyoruz. Ayrıca buna ek olarak asm için http://www.peter-cockerell.net/aalp/html/frames.html adresinden faydalanabilirsiniz.

Keil’de assembly dili:
arm7_ledasm1

;****************************************************************************
; Aykut ULUSAN , Elektronik Mühendisi , IZMIR
; Arm7 assembly
;****************************************************************************

INCLUDE	  LPC2294.inc  	 			; header ekliyelim

LED	EQU	0x02000000			; led portu P0.25

EXPORT  __main					   ; Main fonksiyonu program disinda kullanilabilir
AREA   	 LED_ONOFF,CODE,READONLY		;

__main
LDR	R0,=PINSEL0		; PINSEL0'in adresini R0 registerine at
MOV    R1,#0x0			 ; R1=0
STR	R1,[R0]		  	   ; PINSEL0=0
LDR	R0,=PINSEL1		 ; PINSEL1=0
STR	R1,[R0]
LDR	R0,=IO0DIR	          ; Led pini cikis
LDR	R1,=LED			    ; led adresini yukle
STR	R1,[R0]			    ; led adres icerigini IO0DIR'a
LOOP
LDR	R1,=LED		           ; led adresini yukle
; led
LDR	R0,=IO0SET	 	  ; port set
STR	R1,[R0]
BL	 DLY
; led
LDR	R0,=IO0CLR  		; port low
STR	R1,[R0]
BL	 DLY			    ; altprograma
B	  LOOP

DLY
MOV	R7,#0x000FF000		;
DLY_1
SUBS	R7,R7,#1		    ; R7-=1
BNE	 DLY_1
MOV	PC,LR		 	      ; link registerini geri yukle

ALIGN					; memory dizilisi 4'er byte
LTORG				       ; ARM komutlari icin PC+/-4K, Trumb komutlari icin PC+/-1K
END

Sonuç olarak ;
Proje resimleri aşağıdadır. Önce scop probları , LPC2148 Board’ta ilgili port pinine bağlanır ve sonuç scop ekranında görülmektedir.

brd_8006001scop8006001

3 Yorum

Yorum ekle

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir