Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

18F4550 Delay Sorunu

Başlatan Mr.Java, 03 Temmuz 2013, 16:56:50

Mr.Java

Arkadaşlar merhaba.18F4550 MCU ve takılı 20Mhz kristal var.Şimdi benim OSC yapılandırmam şu şekilde.

__CONFIG(1,PLLDIV_5&CPUDIV_OSC1_PLL2&USBDIV_2&FOSC_HSPLL_HS);
__CONFIG(2,BOR_ON&PWRT_OFF&VREGEN_ON&BORV_3&WDTDIS);
__CONFIG(3,PBADDIS);
__CONFIG(4,XINSTDIS);


Bu Config 20mhz giriş , 48Mhz çıkışa göre ayarlandı.

Burada sorunum delay fonksyonunda kaynaklanıyor.İşlemci delay fonksyonunu bir türlü okumuyor.En basidinden aşağıdaki kodda işlev yapmıyor.

#include <pic18.h>
#include <htc.h>
#include "delay.h"

__CONFIG(1,PLLDIV_5&CPUDIV_OSC1_PLL2&USBDIV_2&FOSC_HSPLL_HS);
__CONFIG(2,BOR_ON&PWRT_OFF&VREGEN_ON&BORV_3&WDTDIS);
__CONFIG(3,PBADDIS);
__CONFIG(4,XINSTDIS);



void main(void)
{
    OSCCON=0x00;
    TRISD=0x00;
    PORTD=0x00;
    while(1)
    {
        
        RD0=1;
        DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
        RD0=0;

    }


}

Delay Fonksyonu ise Hi-tech samples klasöründeki delay dosyası..


Icarus

XTAL_FREQ 'i tanımladınız mı ?

Mr.Java

XTAL delay fonksyonu içerisinde tanımlanıyor zaten.

Delay.h
#ifndef   XTAL_FREQ
#define   XTAL_FREQ   20MHZ      /* Crystal frequency in MHz */
#endif

#define   MHZ   *1000L                  /* number of kHz in a MHz */
#define   KHZ   *1         /* number of kHz in a kHz */

#if   XTAL_FREQ >= 12MHZ

#define   DelayUs(x)   { unsigned char _dcnt; \
           _dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
           while(--_dcnt != 0) \
              continue; }
#else

#define   DelayUs(x)   { unsigned char _dcnt; \
           _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
           while(--_dcnt != 0) \
              continue; }
#endif

extern void DelayMs(unsigned char);


Icarus

Hayır sizin 48MHz olarak tanımlamanız lazım
ya kodunuza
#define XTALL_FREQ 48000000
veya
komut satırına
-DXTALL_FREQ 48000000

Mr.Java

#4
Hayır yine olmadı malesef.Sorun nedir hiç anlayamadım...

mesaj birleştirme:: 04 Temmuz 2013, 08:59:50

if (++a > 50000)
        {
            a = 0;
            led_on = led_off;

İşin ilginç tarafı yukarıdaki kod ile kendi delay fonksyonumu yaptığımda 20mhz olsun 48mhz olsun flash yaparken , delay fonksyonunda hiçbir tepki olmuyor.Hatta mikroC'de denedim ondada olmadı.Sorun çok acayip gerçektende..

sadogan

Alıntı yapılan: Fkarizmatik - 03 Temmuz 2013, 16:56:50
Arkadaşlar merhaba.18F4550 MCU ve takılı 20Mhz kristal var.Şimdi benim OSC yapılandırmam şu şekilde.

__CONFIG(1,PLLDIV_5&CPUDIV_OSC1_PLL2&USBDIV_2&FOSC_HSPLL_HS);
__CONFIG(2,BOR_ON&PWRT_OFF&VREGEN_ON&BORV_3&WDTDIS);
__CONFIG(3,PBADDIS);
__CONFIG(4,XINSTDIS);


Bu Config 20mhz giriş , 48Mhz çıkışa göre ayarlandı.

Burada sorunum delay fonksyonunda kaynaklanıyor.İşlemci delay fonksyonunu bir türlü okumuyor.En basidinden aşağıdaki kodda işlev yapmıyor.

#include <pic18.h>
#include <htc.h>
#include "delay.h"

__CONFIG(1,PLLDIV_5&CPUDIV_OSC1_PLL2&USBDIV_2&FOSC_HSPLL_HS);
__CONFIG(2,BOR_ON&PWRT_OFF&VREGEN_ON&BORV_3&WDTDIS);
__CONFIG(3,PBADDIS);
__CONFIG(4,XINSTDIS);



void main(void)
{
    OSCCON=0x00;
    TRISD=0x00;
    PORTD=0x00;
    while(1)
    {
        
        RD0=1; ----->
        DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
        RD0=0; ------>

    }


}

Delay Fonksyonu ise Hi-tech samples klasöründeki delay dosyası..
RD0=1 den sonra programınız 1000 ms bekliyor
RD0=0 dan sonra RD0=1 kadar olan komut süresinde pin "0" da kalıyor sonra tekrar "1" oluyor.

Mr.Java


serhat1990

@sadogan Hocamızın demek istediği şudur , pini high yapıyorsun bekliyorsun ama pini low yaptıktan sonra beklemiyorsun . Pini 0 yaptıktan sonra bekleme koymalısın beklemeden direk high yapıyorsun .

Mr.Java

Sorun derleyicide ve pickit3'te çıktı.Tekrar reinstall edip kurunca düzeldi.Teşekkürler cevaplar için...

yldzelektronik

Alıntı yapılan: Fkarizmatik - 04 Temmuz 2013, 10:37:06
Yani hocam ?

Pini 1 yapıyorsun 1sn bekliyorsun sonra pini 0 yapıyorsun while döngüsüne göre tekrar pini 1 yaptığın yere dönüyor.

20mhz kristal ile 20ns gibi bir süre ile o işlem geçerli kalıyor.Pini 0 yaptıktan sonra da delay koyman gerekli.

Yazmıştım yazarken 2 ileti gelmiş.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mr.Java

Peki diğer sorum ise pickit 3 ile MPLAB X'te debug işlemi nasıl yapılıyor ?

Tagli

Gerekli bağlantıları yaptıktan sonra MPLAB X içindeki "debug" düğmesine basmak yeterli. Kod özel olarak debug için derleniyor ve sanırım kodda bulunmasa bile config ayarlarında bulunan debug seçeneği etkinleştiriliyor. Bu esnada tabi yeni kod PIC'e de atılıyor.

Ama eğer PIC'in debug bacakları başka şeylere bağlıysa sorun çıkıyor genelde. Debug yapılacak bir sistemde bu bacakların başka hiçbir işlerinin olmaması uygun olur. Bu durum özelllikle PIC18 ailesinde sorun yaratıyor, çünkü bu bacaklar gördüğüm tüm modellerde PORTB kesmesi bacakları ile (2 tanesi) çakışıyor.
Gökçe Tağlıoğlu