18f4620 hızlı, çok hızlı çalışıyor.

Başlatan tekosis, 26 Nisan 2012, 15:08:07

tekosis

merhaba arkadaşlar. kodlarını aşağıda da verdiğim devremde sadece bir ledi 500msn aralıklarla yakıp söndürmek istedim ama olmadı. istediğimden çok çok hızlı çalışıyor program.  sadece aşağıdaki döngülerle  istediğim zamanı yani yaklaşık 500 msn'lik beklemeyi yakalayabildim. devremde 10mhz lik kristal kullandım. ve sadece c7 ye bağlı bir ledi yakıp söndürmek istiyorum. hesabıma göre yaklaşık 100000 kat hızlı çalışıyor. kodlarım aşağıda. acaba problem nedir?  Şimdiden teşekkür ediyorum.

#include <18F4620.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES H4                       //High speed osc with HW enabled 4X PLL
#FUSES NOPROTECT                //Code not protected from reading
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES NOBROWNOUT                 //Reset when brownout detected
#FUSES BORV21                   //Brownout reset at 2.1V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES XINST                    //Extended set extension and Indexed Addressing mode enabled
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES MCLR                     //Master Clear pin enabled

#use delay(clock=40000000)

   unsigned int16 i=0;

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_tris_c(0x00);
   output_c(0x00);
   
   while(1)
   {
   output_high(pin_c7);
   for(i=1000;i>=1;i--)
   {
   delay_ms(500.00);
   }
   output_low(pin_c7);
   for(i=1000;i>=1;i--)
   {
   delay_ms(50000);
   }
   }

   }

Not: dahili osilatörde de durum aynı. acaba işlemcide sorun olabilirmi?
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

ferit06

delay fonksiyonunuzu incelemeniz gerekir.

aslında gecikmelerin 4 kat fazla olması gerekiyor. 10 mHz clock kullanıp, 40 MHz delay için clock tanımlamışsınız.

mcn

PLL açık:

#FUSES H4                       //High speed osc with HW enabled 4X PLL

deki "H4" ü "HS"  olarak değiştirip denermisiniz.Detaylı incelemedim ilk olarak gözüme bu çarptı.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

tekosis

sayın mcn; H4 osilatör frekansının 4 kat arttırılacağını gösteriyor. ben 10mhz lik kristal kullanıp işlemciyi 40mhz de çalıştırmak istiyorum. ondan dolayı kullandım. ama önceki denemelerimde dediğinizi yaptım işe yaramadı ne yazıkki.

sayın  ferit06;  #use delay(clock=40000000) tanımlamasının delay fonksiyonuna işlemci frekansını tanıtmak için kullanıldığını biliyordum. ondan dolayı 10x4=40 mhz diye tanımladım ama diğer türlü de deneyeceğim. ayrıca benim de aklıma gelen ilk şey delay fonksiyonu şimdi onu inceleyeceğim.

yardımlarınız için teşekkürler.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

skara1214

yazdığınız satırda bir sıkıntı yok hocam h4 doğru kullanım ama benim aklıma takılan delay_ms(500.00) kısmı virgülden sonra böyle bir kullanım şekli varmı onu tam bilmiyorum
Herkes ölür ama herkes gerçekten yaşamaz

mcn

Pardon farketmemişim,hızlı çalışıyor deyince direk aklıma o gelmişti.

PLL kullanmada sorun yok gibi,şu şekilde bir deneyin,PLL i kapatıp delay fonksiyonunuzun doğru şekilde çalışıp çalışmadığını kontrol edin.

"delay_ms(500.00) " şeklinde bir kullanımla hiç karşılaşmadım daha önce.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

tekosis

#6
arkadaşlar problem çözüldü. sorun bendeki derleyiciden kaynaklanıyormuş önceki versiyonu olan 4.068 kullanıyordum. şimdi 4.107 kullanıyorum sıkıntısız çalışıyor. ferit06'nın da dediği gibi muhtemelen delay komutunda hata oluşmuştu ama şimdi herşey normal. kullandığım kod da aşağıda.

ilgilenen arkadaşlara teşekkür ediyorum.

Not: delay_ms(500.00); kodunu denemek için yazmıştım acaba ne olacak diye o şekilde unutmuşum :)

CCS C versiyon 4.107

#include <18F4620.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES H4                       //High speed osc with HW enabled 4X PLL
#FUSES NOPROTECT                //Code not protected from reading
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV21                   //Brownout reset at 2.1V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES MCLR                     //Master Clear pin enabled

#use delay(clock=40000000)

#define LED PIN_d4  //CHANGE PIN_XX TO YOUR LED PIN NUMBER, EX: PIN_A5

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

    //Example blinking LED program
    while(true){
      output_low(LED);
      delay_ms(1000);
      output_high(LED);
      delay_ms(1000);
    }

}
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.