18F452 PLL enable modunda çalıştıramadım....

Başlatan crypto, 25 Temmuz 2008, 14:14:32

crypto

PBP da 4 MHz osilatör değeriyle derlediğim programda LCD uygulamasında sorun yok.
Ancak PLL aktif edip hızı arttırdığımda, buna karşılık;

DEFINE LCD_COMMANDUS 8000
DEFINE LCD_DATAUS 200


değerlerini de 4 katına çıkardığım halde lcd ye istediklerimi yazdıramıyorum.

Sanıyorum PBP osc değerini ne yazarsanız yazın, MPASM ye derlettiği için osc değeri sürekli 4 MHz olarak seçiliyor.
Bu konuda çözüm önerisi olan arkadaşlardan bilgi rica ediyorum.

aslan_korhan

PLL frekans katlamayı 10MHz kristal ile kullanabilirsin..
Bu durumda 10MHz x 4 = 40MHz eder.
Yani değerleri birde 10 ile çarpmayı dene.

4MHZ'e kadar XT OSC
10 - 20MHz arası HS OSC
40MHz için HS with PLL OSC ( 10MHz Kristal ).
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

crypto

Aslında 4 MHz ye göre de X4 yaptığımda zamanlamalar tutuyor, problem sadece LCD ye istediğimi yazamıyorum. Gönderdiğim karakterler dışında, abuk-subuk karakterler çıkıyor.

Önerinizi de dikkate alayım ama normalde kullanılan
DEFINE LCD_DATAUS 50

tanımlamasında 10 ile çarpma şansım yok çünkü değer byte olarak yazılmak zorunda yani o değer 255 ten daha büyük atanmıyor.

aslan_korhan

Bende bir ara 40MHz de sorun yaşamıştım PBP'de.
20MHz Kristal HS osilatör seçeneği ile kullanırsan bir problem çıkmaz...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

crypto

20 MHz HS seçeneğini denemiştim. PIC normalde çalışıyor. Ancak 4X20 karakter LCD ye istediğimi yazdıramıyorum, sorun sadece bu.
Bu sorunun lcd ye giden data ve komut zamanlamalarının tutmayışından (kısa süreli olmasından) kaynaklandığını düşünüyorum. Ama bir türlü problemi çözemedim.

crypto

LCD problemini çözdüm.
Başlangıçta LCD yi açmak için
pause 1000
LCDOUT $FE,1
pause 500

kodlarını yazdıktan sonra istediklerimi yazdırabildim.
PLL i kullanmadım. 20 MHz kristal ve osc config = HS olarak ayarladım.

Bu kez de PAUSE değerlerini ayarlamam gerekiyordu. Çünkü ;
PAUSE 5000

Yazdığımda süre 5 saniye işlemesi gerekirken 1 saniye işliyordu.
Ben de "PBP" klasöründeki "pbppic18.lib" dosyasında bir satırda düzenleme yaptım. Yaptığım düzenlemeyle PAUSE değerleri istediğim gibi çalıştı. Yapmış olduğum düzenleme aşağıdaki gibi.
;****************************************************************
;* PAUSEUS    : Pause n microseconds at 4MHz                    *
;*                                                              *
;* Input      : R0 + 1, W = microseconds                        *
;* Output     : None                                            *
;*                                                              *
;* Notes      : minimum 19us                                    *
;****************************************************************

      if (OSC == 4)
  LIST
PAUSEUS clrf	R0 + 1		; 1
PAUSEUSL addlw	-23		; 1 Subtract overhead
             movwf   R0                        ; 1
	movlw	-4		; ********-1 değeri -4 olarak değiştirildi***********
	bnc	pauseush	             ; 1 / 2
	nop			; 1
pauseusloop CLRWDT?NOP		; 1
	addwf	R0, F		; 1
	bc	pauseusloop	; 1 / 2
	nop			; 1
pauseush addwf	R0, F		; 1
	decf	R0 + 1, F	; 1
	bc	pauseusloop	; 1 / 2
	btfsc	R0, 0		; 1 / 2
	bra	$ + 2		; 2 / 0
	btfss	R0, 1		; 1 / 2
	bra	pauseusdone	; 2 / 0
	bra	$ + 2		; 0 / 2
	nop			; 0 / 1
pauseusdone return		; 2 + 3 (call + setup)
  NOLIST


Kodlar içerisinde "SERIN2" ve "SEROUT2" de kullanıyorum. Baud değerleri tutmuyordu. O sorunu da bir test rutini ve yazdığım pc programıyla hallettim.
Test rutininde gerekli baud değerini her veri gönderiminden sonra 1 arttırarak pc ye gönderdim. PC programında da aldığım verinin doğru geldiği ilk baud değeri ve yine doğru geldiği son baud değerini buldum. Bu iki baud değerinin ortalamasını alıp baud değeri olarak kodlarda kullandım. Şimdilik sorunları bu şekilde aştım. Yardımlarınız için teşekkür ederim.

crypto

PC program dosyasını koymayı unutmuşum.  BURADAN indirebilirsiniz.

BU da pic örnek kodları:
baud_test1:
   w0 = 16572
baud_test:
    SEROUT2 pctx,w0,["  BAUD = ",#w0,"  "]
    LCDOUT $FE,1,#w0
    w0 = w0 + 1
    if w0 = 19697 then baud_test1
    goto baud_test