PCLATH ve PCL alıştırma?

Başlatan ido2323, 23 Ekim 2014, 20:36:46

ido2323

Cümleten Selamün Aleyküm, Büyüklerim, abilerim basit bir sorum vardı? Teşekkürler.

2 tane call kullanıp tablodan sıra ile veri çekmeye çalışıyorum.

movlw .2
movfw asd

movlw .8
movfw edc


movlw b'00000111'
movfw LATD

call TABLO ;1. calllllllllll
movfw LATD

call TABLO ;2. calllllllllll
movfw LATB

eed
goto eed

TABLO

movf   asd,w
	   movwf   PCLATH  ;PCLATH değeri d'2' oldu
	wuu
	   movf   edc,w
	   addwf   PCL, f  ;PCL değeri d'10' oldu

RETLW b'11111111' ; 1. call--- bu noktadan sonra ne oluyor w değeri alınıp LATD'ye mi yazılıyor? 
RETLW b'11000011' ; 2. call --- bu noktadan sonra ne oluyor w değeri alınıp LATB'ye mi yazılıyor? 
RETLW b'11111011' ;
RETLW b'11011011' ;
RETLW b'11001011' ;

end

Tagli

Kodu sen mi yazdın? Mantığını çözemedim ama bana hatalı gibi gözüktü. Sanki kod bir iş yapmıyor gibi.

Bu konuya bir bak, zamanında baya ayrıntılı olarak açıklamıştım.
Gökçe Tağlıoğlu

ido2323

#2
Tagli hocam sen idolsun benim için, detaylı inceledim onu sadece merak ettiğim için soruyorum asıl amacım bunu çalıştırmak;

En son kısma gidiniz.

;************************************************************
;	PIC18F4550 ?LE YAPILMI? ÖRNEK B?R STEP MOTOR KONTROLÜ
;
;	BA?LIK:	STEP MOTOR KONTROLÜ
;	YAPIM TAR?H?:  21.10.2014 14:16
;	YAPAN: ?DO2323
;	FREKANS: 20MHz(HS)

;************************************************************
; BU PROGRAM A PORTUNUN 4. VE 3. P?N?NE BA?LANMI? BUTONLAR ?LE STEP MOTOR KONTROLÜ YAPILACAKTIR.
;
; DEVREDE ULN2003A STEP SÜRÜCÜ KULLANILMI?TIR.
; D PORTUNUN(0,1,2,3) B?TLER? SÜRÜCÜ YE BA?LANMI?TIR.
; STEP MOTOR AÇISI 7.5 DERECED?R.
; RA4'E BASINCA STEP MOTOR 30 DERECE SA?A, RA3'E BASINCA SOLA HAREKET ETMEKTED?R.
;

list p=18f4550
#include	<P18F4550.INC>
CONFIG	FOSC = HS
;************************************************************
; DE???KENLER

Count	equ	0x000
sayac1  equ 0x002
sayac2  equ 0x004
sayac3  equ 0x006
kolon_ind   ;equ   20h;
	tablo_ind   ;equ   21h;
	LCD_CS      ;equ   25h;
	LCD_PAGE   ;equ   26h;
	LCD_ADR      ;equ   27h;
	LCD_DATA   ;equ   28h;
	COUNTER1   ;equ     29h;
	COUNTER2   ;equ   2Ah;
	COUNTER3   ;equ   2Bh;
	TEMP      ;equ   2Ch;
	satir      ;equ   0x22
;************************************************************

org	00000h	; Reset noktas?

goto	Start
;************************************************************
;program kodu burada çal???yor.
	org	00020h	; Program?n ba?lang?ç adresi

Start



	;********** SOL EKRANI SEÇMEYE YARAYAN MAKRO*********
	CSA MACRO
	BSF   CS1
	BCF   CS2
	ENDM
	;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
	;***********SA? EKRANI SEÇMEYE YARAYAN MAKRO**********
	CSB   MACRO
	BCF   CS1
	BSF   CS2
	ENDM
	;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
	#define RST   PORTC,0      ;
	#define   E   PORTC,1      ;
	#define   DI   PORTC,2      ;
	#define   CS1   PORTC,5      ;
	#define   CS2   PORTC,6      ;
	#define RDWR   PORTC,7      ;
	;============================================================
	          
	      clrf    PCLATH            ; pc sayac?n?n ;yüksek bitini s?f?rla
	 
	;port tan?mlamalar? yap?l?yor.
	   ;banksel TRISC;
	      clrf   TRISC
	      clrf   TRISD
	      clrf   TRISE

	      movlw   b'11111111'
	      movwf   LATB
	      movlw   b'00111111'
	      movwf   LATA
	      movlw   b'10001001'
	      movwf   ADCON1
	;banksel PORTC;      bcf   STATUS, RP0
	;**********kurulum bitti******************
	      movlw   b'01000000'
	      movwf   ADCON0
	;*********glcd kurulumu*******************
	      CSA      ;1. entegre aktif
	      bcf   DI      ; komut yazma moduna ;geç
	      call   LCD_ON      ; glcd ;aç      bcf   RDWR      ; glcd yazma modunda
	      bcf   RST      ; glcd haf?zas?n? ;s?f?rla
	      call   Pause      ;bekle
	      bsf   RST      ;   glcd ;s?f?rlama i?lemini etkinle?tir.
	      call   Pause      ;bekle
	      bcf   DI      ; komut yazma moduna ;geç
	;************************************************************; grefik lcdler 128 sutun ve 64 sat?r noktadan olu?ur
	;sat?rlar? taraken bir seferde 8 it gönderilir yani grafik ;lcdler 64/8 =8 sat?rdan olu?ur
	;buda demek oluyoruki her bir sat?rda 128 bitlik veri ;göndercek kod düzenlemek gerkir bunu yaparkende
	; her 64 bitte bir çipseti de?i?tirmek gerekli a?a??daki kod ;bu i?i yapar.
	scan   ;
CSA; 1. entegre AKT?F
	      call   LCD_ON   ;
	      movlw   b'10111000'   ;   184 komutu 0 ;sütüna giden komut
	      movwf   LCD_PAGE   ;
	      call   LCDPage      ; kordinat? glcdye ;i?le
	      movlw   b'01000000'   ;   64 KOMUTU 0 ;SATIR BA?I
	      movwf   LCD_ADR      ;
      movf   LCD_ADR, w   ;
	      call   Adress      ;
 CSB; 2. entegre AKT?F
	      call   LCD_ON   ;   call   LCD_ON      ; glcd aç
	      movlw   b'10111000'   ;   184 komutu 0 ;sütüna giden komut
      movwf   LCD_PAGE   ;
	      call   LCDPage      ; kordinat? glcdye ;i?le
	      movlw   b'01000000'   ;   64 KOMUTU 0 ;SATIR BA?I
	      movwf   LCD_ADR
	      movf   LCD_ADR, w   ;
	      call   Adress      ;
	   MOVLW   .8   ;grafik lcd 8 sat?rdan olu?ur
	   MOVWF   satir
	   movlw   .2
	   movwf   tablo_ind
	bir_artir
	;
	      call   SendDataTOGLCD   ;glcd veri gönder
	      incf   LCD_PAGE,f   ;
	CSA;
	      movf   LCD_PAGE,w
	      call   LCDPage
	      movf   LCD_ADR,w   ;
	      call   Adress
	CSB;
	      movf   LCD_PAGE,w
	      call   LCDPage
	      movf   LCD_ADR,w   ;
	      call   Adress
	      decfsz   satir
	GOTO   bir_artir
	son
	;   sleep
	   goto son
	LCDPage
	      bsf   E
	      ;nop
	      movf   LCD_PAGE, w
	      movwf   PORTD
	      ;nop
	      bcf   E
	      return
	LCD_ON;glcd nin aktif olan entegresini komut/veri yazmak ;için kullan?ma açar
	      bsf   E
	      ;nop
	      movlw   b'00111111'   ; 63 komutu (lcd aç)
	      movwf   PORTD
	      ;nop
	      bcf   E
	      return
	Adress;
	      bsf   E
	      ;nop
	      movwf   PORTD
	      ;nop
	      bcf   E
	      return
	ByteToLCD
	      bsf   DI
	      ;nop
	      bsf   E
	      ;nop
	      movwf   PORTD
	      ;nop
	      bcf   E
	      ;nop
	      bcf   DI
	;
	      return
	Pause
;--------------------------------------------
	      ;movlw   .25
	     ; movwf   COUNTER1
movlw h'ff'
   MOVWF sayac1

DONGU11
   movlw h'ff'
   MOVWF sayac2

DONGU12
   DECFSZ sayac2,F ;sayac2'nin de?erini 1 azalt s?f?r olursa "DECFSZ sayac1,F" komutuna atla
   GOTO DONGU12
   DECFSZ sayac1,F ;sayac1'nin de?erini 1 azalt s?f?r olursa "DECFSZ sayac1,F" döngüden ç?k
   GOTO DONGU11
RETURN
;------------------------------------------
	P2
	      movlw   .255
	      movwf   COUNTER2
	P3
	      decfsz   COUNTER2, f
	      goto   P3
	      decfsz   COUNTER1, f
	      goto   P2
	       return
	SendDataTOGLCD;karekter bilgisini lcd ye gönderiri
	CSA;    1. entegre aktif
	      movlw   .64
	      movwf   COUNTER1
	SC1   ;1. entegre yazd?r
	      call   TabSim
	      call   ByteToLCD
	      incfsz   kolon_ind, f
	      goto   $+2
	      incf   tablo_ind,f
	      decfsz   COUNTER1, f
	      goto   SC1
	CSB;   2. entegre aktif
	      movlw   .64
	      movwf   COUNTER1
	SC2   ;2. entegreyi yazd?r
	      call   TabSim
	      call   ByteToLCD
	      incfsz   kolon_ind, f
	      goto   $+2
	      incf   tablo_ind,f
	      decfsz   COUNTER1, f
	      goto   SC2
	      return
	;************************************************************; glcd gösterilecek resmin verileri bu alanda tablodan al?n?r
	;************************************************************;
	   org 0x01Fc
	TabSim   ;tablo bilgilerini gir 2 parçadan olu?acak ayarla
	   movf   tablo_ind,w
	   movwf   PCLATH
	tabloya_git
	   movf   kolon_ind,w
	   addwf   PCL, f
RETLW b'11111111' ;
RETLW b'11000011' ;
RETLW b'11111011' ;
RETLW b'11011011' ;
RETLW b'11001011' ;
	
	   END

Tagli

#3
Tabloya giderken genelde argümanın W içinde olur. W değerini PCL üzerine eklersin ve atlama yaparsın. İşi basitleştirmek için tabloyu program belleğinin başında bir yere yerleştir, PCLATH ile uğraşman gerekmez o zaman (bir süre için tabi).

Senin kodda PCL üzerine sabit bir değer eklendiği için zaten hep aynı değer ile dönersin. Ayrıca PCLATH üzerine yapılan müdahale de yanlış orada bence. PCL üzerinde değişiklik yapmadan önce, tablonun bulunduğu yer göz önünde bulundurularak PCLATH üzerinde gerekirse oynama yapılır. Bazı durumlarda da tabloya atlamadan ayrıca PCLATH ayarlaması yapmak gerekir. O başlıkta anlatmıştım ayrıntıları. Son olarak, dönüşte aradığın değer W içinde olur. movfw yerine movwf kullanman gerekir ki dönüşte W'de olan değeri istediğin LAT register'ına atabilesin.

Bu arada, hafızam beni yanıltmıyorsa zaten movfw diye bir komut yok. movf komutunu ikinci argümanı W olarak şekilde çağıran bir makro olduğunu tahmin ediyorum. Belki Microchip'in .inc dosyalarında tanımlanmış olabilir.

Düzeltme: Son kodu ben bu mesajı yazarken eklemişsin. Yukarıda yazdıklarım ilk verdiğin kod ile ilgili idi.
Gökçe Tağlıoğlu

ido2323

Teşekkür ederim Sayın Tagli hocam, MPLAB kullanıyorum ikisinide denedim çalışıyor

movfw asd ve ya movf asd,w

Tagli

PCLATH'a sabit sayı yüklemek tehlikeli. Sen sanırım table_ind değişkeni üzerinden h'21' yüklemişsin ama bence o değer b'10' olmalı. Anladığım kadarıyla tablonun başı h'200' adresine denk geliyor. Bu durumda adresin büyük byte'ı b'10' olur.

PCLATH'ı değiştirirken pageselw kullanmak daha güvenli. Hatta ben olsam, tablonun başını h'200' adresine denk getirmeye çalışmam, tablonun kafa kısmını oraya denk getirip pageselw ifadesini tablo adı ile çağırırdım. Böylece hata yapma ihtimalini azaltırsın.
Gökçe Tağlıoğlu

FEHMİ_ASM

  Evet, bu movfw birkaç gündür dolaşıyor forumda. Hiç kullanmadım, kullananı da görmedim. 16f serisinde bildiğim kadarı ile böyle bir komut yok, ancak 18f lerin asm komutları biraz daha genişletilmiş, belki onlar için olabilir. Mplab kurulu değil şu an bilgisayarımda deneyemiyorum da. Acaba compiler'ın falan yeni sürümlerinin bi özelliği/komut eklentisi mi ?

Bilen kullanan varsa (özellikle komut saykılı hakkında) bilgi versin lütfen.

ido2323

#7
Ekledim otomatik olarak h20 den sonra doldurmaya devam etti h200 boş şu an
pageselw $ ;PCLATH

ama hala çalıştıramadım şu grafik lcd yi anlamıyorum çalışması lazım, gecikmeler ekliyorum hala deniyorum.

movfw; 18f4550 kullanıyorum mpasm v 5.58 simüle ederken sıkıntı yaşatmadı.

bunun yerine;
org 0x01Fc
    TabSim   ;tablo bilgilerini gir 2 parçadan olu?acak ayarla
       movf   tablo_ind,w
       movwf   PCLATH
    tabloya_git
       movf   kolon_ind,w
       addwf   PCL, f
RETLW b'11111111' ;
RETLW b'11000011' ;
RETLW b'11111011' ;
RETLW b'11011011' ;
RETLW b'11001011' ;
    
       END


bu

;org 0x01Fc
pageselw $ ;PCLATH
	TabSim   ;tablo bilgilerini gir 2 parçadan olu?acak ayarla
	   movf   tablo_ind,w
	   movwf   PCLATH
	tabloya_git
	   movf   kolon_ind,w
	   addwf   PCL, f
RETLW b'11111111' ;
RETLW b'11000011' ;
RETLW b'11111011' ;
RETLW b'11011011' ;
RETLW b'11001011' ;
RETLW b'11111111' ;
RETLW b'11000011' ;
RETLW b'11111011' ;
RETLW b'11011011' ;
RETLW b'11001011' ;
RETLW b'11111111' ;
RETLW b'11111111' ;
RETLW b'11000011' ;
RETLW b'11111011' ;
RETLW b'11011011' ;
RETLW b'11001011' ;
RETLW b'11111111' ;
	

	   END

Tagli

PIC18 kullandığın gözümden kaçmış. PIC18'lerde retlw tablosu kullanmak verimsiz bir yaklaşım. Onun yerine tblrd komutlarını kullanman daha uygun olur. PCLATH, PCL ile uğraşmana gerek de kalmaz. Doğrudan adresi verir, alırsın veriyi.
Gökçe Tağlıoğlu

ido2323

Evet ufkumu kapatan yeni bir şey buldum, 21 bitlik bir çeşit tablo işaret kayıtçısı "TABLAT" evet bunu bulmuşken bunla yeniden GLCD düzenlemek gerekecek herkese teşekkür ederim, hocam sana ayrıca teşekkür ediyorum.

RaMu

#10
Alıntı yapılan: FEHMİ_ASM - 23 Ekim 2014, 21:30:09
  Evet, bu movfw birkaç gündür dolaşıyor forumda. Hiç kullanmadım, kullananı da görmedim. 16f serisinde bildiğim kadarı ile böyle bir komut yok, ancak 18f lerin asm komutları biraz daha genişletilmiş, belki onlar için olabilir. Mplab kurulu değil şu an bilgisayarımda deneyemiyorum da. Acaba compiler'ın falan yeni sürümlerinin bi özelliği/komut eklentisi mi ?

Bilen kullanan varsa (özellikle komut saykılı hakkında) bilgi versin lütfen.


MOVFW  file_register      ;file register içeriğini W ye aktar
MOVF     file_register,W  ;file register içeriğini W ye aktar

ikiside aynı şey,
16f serisindede kullanabilirsin
yazım farkı var sadece
ikiside 1 komut çevrimi sürer.

ek;
MOVFW diye bir komut aslında yoktur,
pseudo instruction  denen bir komut,
kullanım kolaylığı olsun diye var,
kulanımıda tavsiye edilmiyor.
MPASM nin sürümüne bağlı olarak
kullanırken hatada verebilir,
hatadan kurtulmanın yoluda var ama
kullanmamak en iyisi
zaten birşey kaybetmiş olmuyoruz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html