Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: pax - 07 Kasım 2014, 21:56:39

Başlık: 18f452 40 mhz yardım
Gönderen: pax - 07 Kasım 2014, 21:56:39
pic 18f452 10Mhz kristal bağlayıp 40 Mhz de çalıştırmak istiyorum.

örnek olarak 1sn aralıkla yanıp sönen led programı
#include <xc.h>
#include <stdint.h>
#pragma config OSCS = OFF, OSC = HS
#pragma config PWRT = ON, BOR=0FF
#pragma config WDT = OFF

#define _XTAL_FREQ 10000000
#define led LATBbits.LATB0

void bekle(unsigned int x)
{
   unsigned int i;

   for(i = 0; i < x; i++)
   {
      __delay_ms(1);
   }
}
main()
{
    PORTB = 0X00;
    LATB  = 0X00;
    TRISB = 0X00;

    for(;;)
    {
       led=1;
        bekle(1000);
        led=0;
        bekle(1000);
    }
}


programda
" #pragma config OSCS = OFF, OSC = HS " satırında OSC=HS seçersem bir sorun olmadan çalışıyor .
data sheet e göre   

(http://s29.postimg.cc/v5sq0cx1f/osc.jpg) (http://postimg.cc/image/v5sq0cx1f/)

10 Mhz kristal ile PLL aktif olduğunda OSC = HS modunda 40 Mhz elde edebiliyorum. aklımı karıştıran nokta  18f452 nin konfigürasyon ayarlarında

(http://s14.postimg.cc/l8fofsshp/config.jpg) (http://postimg.cc/image/l8fofsshp/)

HSPLL kısmında (4xFOSC) yazıyor olması. 10Mhz i 40 Mhz e çıkartmak için HSPLL'yi seçmem gerekmiyor mu ? seçtiğim zaman program düzgün çalışmıyor. HSPLL ne amaçla kullanılıyor. 

Başlık: Ynt: 18f452 40 mhz yardım
Gönderen: Tagli - 07 Kasım 2014, 22:33:35
Doğru seçenek HSPLL, ama _XTAL_FREQ tanımlaması yanlış. Aslında ismi yanıltıcı biraz. PLL etkin iken oraya 40000000 yazman gerekiyor.
Başlık: Ynt: 18f452 40 mhz yardım
Gönderen: pax - 07 Kasım 2014, 22:42:38
Alıntı yapılan: Tagli - 07 Kasım 2014, 22:33:35
Doğru seçenek HSPLL, ama _XTAL_FREQ tanımlaması yanlış. Aslında ismi yanıltıcı biraz. PLL etkin iken oraya 40000000 yazman gerekiyor.

#define _XTAL_FREQ 40000000 yazıcam ama kristal olarak 10000000 mu kullanıcam
Başlık: Ynt: 18f452 40 mhz yardım
Gönderen: Tagli - 07 Kasım 2014, 22:50:29
Evet. 10 MHz kristal ile PLL etkin iken (HSPLL seçeneği ile) #define _XTAL_FREQ 40000000 yazman gerekiyor. Derleyici o kadar zeki değil, sistem clock'unun ne olduğuna göre kendini ayarlıyor ama bunun ne şekilde oluştuğunu umursamıyor. Yani derleyici config bitlerine falan bakmıyor. Sonuçta PLL çıkışında 40 MHz olacağı için sistem clock'u da 40000000 olacak. Derleyicinin bilmesi gereken de bu.

Not: Konuyla ilgili değil ama, XC16'da tanımlama yapılırken, ana clock frekansı değil, komut işleme frekansına göre değer yazılıyor.
Başlık: Ynt: 18f452 40 mhz yardım
Gönderen: pax - 07 Kasım 2014, 23:05:46
 tam doğru olanı anlamak için

18f452 yi 40 Mhz de çalıştırmak için :

    10 mhz kristal bağlayıp

1-   #pragma config OSCS = OFF, OSC = HS 
      #define _XTAL_FREQ 10000000       

2-  #pragma config OSCS = OFF, OSC = HSPLL 
      #define _XTAL_FREQ 40000000     

    her iki seçeneği de kullansam 40 Mhz elde edebilirim  değil mi?
Başlık: Ynt: 18f452 40 mhz yardım
Gönderen: Tagli - 08 Kasım 2014, 01:59:05
Hayır, sadece 2. seçenek ile 40 MHz elde edersin. İlk seçenek normal PLL'siz 10 MHz çalışır.

Yanlış anlaşılmayı engellemek için yazıyorum: _XTAL_FREQ  ile PIC'in çalışma hızının bir ilgisi yok. Çalışma hızını taktığın kristal ve PLL'nin devrede olup olmaması belirler. _XTAL_FREQ  ifadesi sadece, gecikme kodlarında kullanılmak üzere, PIC'in çalışma hızını derleyiciye bildirir. Bu bildirimi yanlış yaparsan PIC yine olması gerektiği hızda çalışır ama bekleme kodların doğru süre beklemez.
Başlık: Ynt: 18f452 40 mhz yardım
Gönderen: pax - 08 Kasım 2014, 02:05:14
Alıntı yapılan: Tagli - 08 Kasım 2014, 01:59:05
Hayır, sadece 2. seçenek ile 40 MHz elde edersin. İlk seçenek normal PLL'siz 10 MHz çalışır.

Yanlış anlaşılmayı engellemek için yazıyorum: _XTAL_FREQ  ile PIC'in çalışma hızının bir ilgisi yok. Çalışma hızını taktığın kristal ve PLL'nin devrede olup olmaması belirler. _XTAL_FREQ  ifadesi sadece, gecikme kodlarında kullanılmak üzere, PIC'in çalışma hızını derleyiciye bildirir. Bu bildirimi yanlış yaparsan PIC yine olması gerektiği hızda çalışır ama bekleme kodların doğru süre beklemez.

tamamdır. teşekkürler .