0x100 ile 0x2FF arasındaki byte ların XOR unun hesabı?

ainstain

Üye
Katılım
21 Mar 2010
Mesajlar
26
Puanları
1
Yaş
35
Arkadaşlar merhaba, pic18F452 ye göre yardımlarınız bekliyorum. Belki kolay birşeydir ama ben yapamıyorum. Kodu yazan arkadaşımız olursa çok sevinirim ama anlamam için birazda açıklama isterim :)
En geç çarşamba(07.04.2010) saat 2 ye kadar lazım.

Soru:

Hafızada 0x100 ile 0x2FF arasındaki byte ların XOR
unu hesaplayıp sonucu WREG e yazan bir program lazım.
Programınızda en fazla otuz adet komut olabilir.


Teşekkür ederim.
 
ben soruyu anlamadım , tüm registerlar dolu da bunların sırayla 2li 2li xor unu mu alıcaz
 
@camby
indirek adresleme kullanacakmış
 
Dolaylı adresleme (yani indirek adresleme) pic'teki (MCU'lardaki) önemli özelliklerden biridir , INDF ve FSR yazmaçları ile yapılır.
İşlem yapılmak istenen register'ın adresi FSR registerına yüklenir , ardından INDF yazmacı ile işlem yapılır.
Çoklu işlemlerde büyük kolaylık sağlar . Mesela sen 0x100 adresinden 0x2FF adresine kadar olan 668 adet registera sırayla işlem yapacak bir koda ihtiyacın var . Dolaylı adresleme yapmadan bu işi yapmaya kalkarsak her işlem için bir kod bölümü ve her seferinde değişkenlerin adreslerini değiştirip sonuç itibariyle bunu da 668 kez alt alta yazman gerekir. Fakat INDF ve FSR kullanarak bunları tek bir döngü içinde birkaç satırla yapabiliriz.

Sana örnek olsun diye birkaç kod vericem:

1 - Buradaki program 0x20 ve 0x35 arasındaki tüm registerları clrf ile temizliyor. Bunun için FSR ye başlangıç adresi olan 0x20'yi yazıp clrf INDF ile de 0x20'deki register'a clrf işlemini yapmış oluruz. ardından FSR'yi bir arttırıp yani 0x21 yapıp bu işlemi tekrardan yaparız , ta ki 0x35 olana kadar.

Kod:
movlw		0x20		
		movwf		FSR
TEKRAR		clrf		INDF
		incf		FSR
		movlw		0x35
		subwf		FSR,0
		btfss		STATUS,2
		GOTO		TEKRAR

2- Burdaki program ise senin yapmak istediğine daha benzer , başka bir başlıkta yine bir arkadaşın ödevi için yapmıştım. Normalde ödev yaptıranlara birşeyler öğrenebilsinler diye hazır kod vermiyordum ama farklı durumlar olduğu için yazmak durumunda kalmıştım. O başlık : https://www.kontrolkalemi.com/forum/pic-programlama/31943-assembly-yardim.html

Program: Çok sayıda değerleri girilmiş registerı küçükten büyüğe doğru sıralıyor. ideal sınav son sorusu : )
Kod:
;Pic16f84a kullanığımızı varsayaraktan diziyi 0x0C adresinden başlatıyorum
;Bu program ile 16f84a ile 67 adet değişen küçükten büyüğe sıralanabilir


;=======Kullanılan Yazmaçlar======
	
		CBLOCK		0x0C		;a dizisinin eleman sayısı 67	
		a1				;dizinin ilk elemanın ismi a1 adresi:0x0C
		a2				;0x0D
		a3				;0x0E
		a4				;0x0F
		a5				;0x10
;		....
;		...
		a67				;0x4E
		TEMP				;0x4F
		ENDC

;..................
;...............
;...................

BASLA		movlw		0x0B		;dizinin ilk elemanın bir önceki adresi FSR yazmacına yüklendi
		movwf		FSR

UP		movlw		0x17		
		subwf		FSR,w
		btfsc		STATUS,Z	;dizinin son elemanı kontrol edildi mi?
		GOTO		CIKIS		;dizilim tamamlandı , ÇIKIŞ

		incf		FSR		;dizinin 2 elemanını karşılaştıran bölüm
		movf		INDF,w
		incf		FSR
		subwf		INDF,w
		btfss		STATUS,C	;sıralama doğru mu?
		GOTO		UP		;evet doğru , sıradakine bak
						
		movf		INDF,w		;doğru değil yerlerini değiştir
		movwf		TEMP
		decf		FSR
		movf		INDF,w
		incf		FSR
		movwf		INDF
		decf		FSR
		movf		TEMP,w
		movwf		INDF
		GOTO		UP		;Başa dön

CIKIS 		nop				;işlem tamam , a dizisi küçükten büyüğe dizildi
;............
;..............
;...............
 
Allah razı olsun hocam, ben bunu incelerim. ama bilgim yok anca 11 inden sonra çalışıp da anlarım, başka bizeler var.

Burda amacım Pic18f452 ye göre bir kod elde etmekti, bu şimdi tammıdır onuda bilmiorum.

Ben bunu mplab da pic18f452 yi seçipde denesem hata bulsa düzeltek olur değilmi ?

Kod:
Clean: Done.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p18F452 "ex.asm" /l"ex.lst" /e"ex.err"
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 24 : Symbol not previously defined (FSR)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 27 : Symbol not previously defined (FSR)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 28 : Symbol not previously defined (Z)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 28 : Symbol not previously defined (STATUS)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 31 : Symbol not previously defined (FSR)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 32 : Symbol not previously defined (INDF)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 33 : Symbol not previously defined (FSR)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 34 : Symbol not previously defined (INDF)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 35 : Symbol not previously defined (C)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 35 : Symbol not previously defined (STATUS)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 38 : Symbol not previously defined (INDF)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 40 : Symbol not previously defined (FSR)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 41 : Symbol not previously defined (INDF)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 42 : Symbol not previously defined (FSR)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 43 : Symbol not previously defined (INDF)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 44 : Symbol not previously defined (FSR)
Error[113]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 46 : Symbol not previously defined (INDF)
Error[129]   C:\DOCUMENTS AND SETTINGS\ \DESKTOP\EEEX\EX.ASM 53 : Expected (END)
Halting build on first failure as requested.
BUILD FAILED: Sun Apr 04 03:08:29 2010

hataların sonunda parantes içinde INDF ve FSR yazıor ne onlar :D yani neye sebep olmuşum :)

pic18f452 de denedim senin pic16... lık olanı :D
 
yok maalesef : ) kodları direk çalışabilecek şekilde yazmadım zaten . İlk program kendi programlarımın başında kullandığım , program açılışında kullanılan tüm registerların içeriğini temizleyen bir alt-program.

2. program ise zaten 16f84'e göre yazılmış program . 16f84.inc dosyasında tanımlı olan özel registerlar , tabiki başka bir picte farklı adreslerde olacağından tanımayacaktır. ki program eksik yazılı zaten sadece INDF ve FSR kullanımını göstermek için yazmıştım.

Eğer assembly kullanmıyorsan bu yöntem illaki C ile de yapılıyordur ,
Eğer assembly kullanabilirim dersen ilk önce 18f bir picle çalışman lazım ,
Eğer çalıştıysan deneme olarak 0x100'den 0x109 adresine kadar 10 tane register belirle bunlara rasgele değerler koy daha sonra yukarıda anlattığım gibi FSR ve INDF kullanarak hepsinin içeriğini CLRF ile silmeye çalış. Debug yapıp adım adım izleyerek değerlerin değiştiğini takip edersin.
Bunu yaparsan diğer istediğini de rahatlıkla yaparsın
 
wuyh dıkandım wullaha dıkandım :D

teşekkürederim. bakmam lazım gene rahatsız ederim ben :)
 

Forum istatistikleri

Konular
127,967
Mesajlar
913,970
Kullanıcılar
449,613
Son üye
Liderpano

Yeni konular

Geri
Üst