Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: pax - 09 Ocak 2013, 14:57:19

Başlık: _delay_us(),_delay_ms() sorunu
Gönderen: pax - 09 Ocak 2013, 14:57:19
mplab x ide v1.60 XC8 c compiler  kullanıyorum  programım basit . bir ledi 1 sn yakıp söndürmeye çalışıyorum. ancak " _delay_us()"ve "_delay_ms() "  komut satırlarını derlerken hata olarak gösteriyor. onların yerine  "_delay()" veya" _delay3()" ü kabul ediyor ancak ledin yanma süresini 1 sn olarak tam ayarlıyamıyorum ? bu konuda yardımcı olur musunuz.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: memo333 - 09 Ocak 2013, 15:02:00
belirttiğiniz kodlar hi-tech c nin kendi delay kodları ile çelişiyor.

onların kullanımını bir inceleyin...
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: serhat1990 - 09 Ocak 2013, 15:06:06
Merhabalar ,

Programınızda #define _XTAL_FREQ 4000000 --> Gibi frekans tanımlaması yaptınızmı ?

__delay_us(x); komutlarıyla sürede sıkıntı yaşanmıyor ... Ben böyle kullanıyorum. Program eklerseniz inceleyebilirim .
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: pax - 09 Ocak 2013, 15:22:19
#include <xc.h>
#define _XTAL_FREQ  20000000;
void init(void)
{
// port directions: 1=input, 0=output
TRISB = 0b00000000;
}


void main(void)
{
init();
while (1){
RB0 = 1;

__delay_ms(1000);
RB0=0;

__delay_ms(1000);
}
}


24. ve 27. satırlar __delay_ms(1000)
led.c:22: warning: variable "RB0" is deprecated (declared at C:\Program Files (x86)\Microchip\xc8\v1.12\include\pic18f4550.h:10296)
led.c:24: error: expression syntax
led.c:24: error: too few function arguments
led.c:24: error: ")" expected
led.c:24: error: expression syntax
led.c:24: error: expression syntax
led.c:25: warning: variable "RB0" is deprecated (declared at C:\Program Files (x86)\Microchip\xc8\v1.12\include\pic18f4550.h:10296)
led.c:27: error: expression syntax
led.c:27: error: too few function arguments
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: serhat1990 - 09 Ocak 2013, 15:53:23
#define _XTAL_FREQ  20000000; kısmındaki ";" ' ü kaldır .

Ayrıca __delay_ms(x); fonksiyonunda tam olarak hatırlamıyorum ama x değişkenine 1000 yazamazsın diye hatırlıyorum ... Ben ms komutunu kullanmıyorum . O kadar gecikmeleri timer ile yapmanızı öneririm ...

İyi çalışmalar.

Derleme amaçlı aşağıdaki kodu dene çalışacaktır ...

Alıntı yapılan: pax - 09 Ocak 2013, 15:22:19
#include <xc.h>
#define _XTAL_FREQ  20000000
void init(void)
{
// port directions: 1=input, 0=output
TRISB = 0b00000000;
}


void main(void)
{
init();
while (1){
RB0 = 1;

__delay_ms(25);
RB0=0;

__delay_ms(25);
}
}


24. ve 27. satırlar __delay_ms(1000)
led.c:22: warning: variable "RB0" is deprecated (declared at C:\Program Files (x86)\Microchip\xc8\v1.12\include\pic18f4550.h:10296)
led.c:24: error: expression syntax
led.c:24: error: too few function arguments
led.c:24: error: ")" expected
led.c:24: error: expression syntax
led.c:24: error: expression syntax
led.c:25: warning: variable "RB0" is deprecated (declared at C:\Program Files (x86)\Microchip\xc8\v1.12\include\pic18f4550.h:10296)
led.c:27: error: expression syntax
led.c:27: error: too few function arguments
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: pax - 09 Ocak 2013, 16:07:36
teşekkür ederim yardımınz için. derleyebildim.  Ancak neden timer kullanmadan 1 sn'lik bir gecikme oluşturamıyoruz onu anlayamadım.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: skara1214 - 09 Ocak 2013, 16:16:51
Duyduğum kadarı ile hitech c nin delay kütüphanesi biraz sıkınıtılıymıs ccs c kullanıyorum ben gayet iyi çalışıyor.Timerda direk clock paslerini saydığınız için  kristalin hata oranı kadar hata yaparsınız oda fazla değildir.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: pax - 09 Ocak 2013, 16:19:53
evet hitech e yeni başladım önceden uzunca bir süre ccs c kullanmıştım son zamanlarda mikroC kullanıyordum . onlarda delay() fonksiyonları oldukça güzel çalışıyor. hitech i daha çözemedim daha karmaşık geldi .
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: serhat1990 - 09 Ocak 2013, 16:32:39
Merhabalar , @pax Hocam sen XC8 ' de program yazıyorsun ilk önce bunu kavrayalım . Hi-tech C'den pek farkı yok ama XC8 ' de yazıyorsun . Neden 1000mS ' lik gecikme yapılmıyor . Kütüphanenin tanımıyla alakalıdır . Uzun gecikmelerde süre kayıpları gittikçe büyür. Örneğin şöyle anlatayım . Bir delay kütüphanesi hazırlarken genelde 1uS ' lik bir gecikme oluşutururlar . Sonra bunu senin __delay_us(x); fonksiyonunda x yerine yazdığın değişken kadar çağırırlar . Bu sayede gecikme yaparsın . __delay_ms(x) , değişkeninde ise __delay_us(x); değişkenini çağırırlar kademe kademe gider . Sen 1 makina saykılını kullanarak mS ' lere doğru çıktıkça kayıplar artacaktır . Buda sıkıntılar yaratabilir . Kritik zamanla uğraşanlar için . O yüzden benim tavsiyem uS' lerin üstündeki gecikmeleri eğer bir blinky vs gibi uygulama değil ise timer ile yapmak ...

@skara1214 Hocam , hi-tech c'nin delay kütüphaneleri sıkıntılımı derseniz bence haklısınız .


@pax Hocam ,

Yapamazmıyım dersen yaparsın oda şöyle olur en basitinden ;

void my_ms(unsigned int x)
{
unsigned int a=0;

for(a=0;a<x;a++)
{
__delay_ms(1);
}

}


Gibi bir fonksiyon yazarsın ... bu sayede ms gecikmeleri 16 bitlik ( 65535'e kadar ) yapabilirsin ...

Bunu programına tanımla , yapmak istediğin gecikmeyi , my_ms(x); değişkeninde x kısmına yaz.

İyi çalışmalar dilerim . Umarım yardımcı olabilmişimdir ...

Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: pax - 09 Ocak 2013, 20:39:58
serhat 1990 arkadaşım yardımların için çok teşekkür ederim. evet ben xc8 öğrenmeye yeni başladım aslında niyetim hi tech idi ancak xc8'den başladım . programı denedim oluyor . anladığım kadarıyla daha öğrenecek bir sürü şey var. ccs ve mikroc kullanıyordum onlar biraz tembelliğe alıştırmış beni xc8 alışmak zaman alacak tekrar yardımların için teşekür ederim .
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: serhat1990 - 10 Ocak 2013, 02:06:17
Alıntı yapılan: pax - 09 Ocak 2013, 20:39:58
serhat 1990 arkadaşım yardımların için çok teşekkür ederim. evet ben xc8 öğrenmeye yeni başladım aslında niyetim hi tech idi ancak xc8'den başladım . programı denedim oluyor . anladığım kadarıyla daha öğrenecek bir sürü şey var. ccs ve mikroc kullanıyordum onlar biraz tembelliğe alıştırmış beni xc8 alışmak zaman alacak tekrar yardımların için teşekür ederim .

Ne demek Hocam , XC8 ile devam etmenizi öneririm . Aynı zamanda ccs c ve mikroc ile arada şu fark var. Datasheet kullanmaya itiyor kullanıcıyı bu ilk zamanlar zor gelsede sonradan zevk vermeye başlıyor . İyi çalışmalar dilerim . Sorularınıza bilgim yettiğince yardımcı olmaya çalışırım ...
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: subram - 19 Şubat 2013, 07:02:55
bende de __delay_ms ve __delay_us satırlarında uyarı gösteriyor ama derlemeyi sorunsuz yapıyor.  aynı şekilde _delay() satırında hata vermeden derliyor. çok garip bir durum var ortada.

Aynı şekilde __CONFIG() satırının da uyarı gösteriyor ama bu satır da sorunszu derleniyor.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: serhat1990 - 19 Şubat 2013, 09:09:36
Alıntı yapılan: subram - 19 Şubat 2013, 07:02:55
bende de __delay_ms ve __delay_us satırlarında uyarı gösteriyor ama derlemeyi sorunsuz yapıyor.  aynı şekilde _delay() satırında hata vermeden derliyor. çok garip bir durum var ortada.

Aynı şekilde __CONFIG() satırının da uyarı gösteriyor ama bu satır da sorunszu derleniyor.

Bu şekilde çalışır uyarının ne olduğunu tam olarak görmedim ama bu tanımlamalar xc dosyası içerisinde pic.h'da tanımlı ...

__delay_us(x) , __delay_ms(x) , _delay(x) bunlar tanımlı header dosyalarında .
Aynı şekilde __CONFIG(x)  'de header dosyalarında tanımlı ...

pic.h dosyası XC8 Compiler

#ifndef   _PIC_H_
#define   _PIC_H_

#ifndef _HTC_H_
#include <htc.h>
#endif

#ifdef _HAS_OSCVAL_
extern unsigned char __osccal_val(void);
#endif

#include <pic_chip_select.h>

/* MPLAB REAL-ICE related macros & includes (currently enhanced PICs only) */
#if defined(__DISABLE_REALICE_IT) || !defined(__MPLAB_REALICE__) || !defined(_PIC14E)
   #define __TRACE(id)         /* TRACE disabled */
   #define __LOG(id,value)     /* LOG disabled */
#else
   #if defined(__MPLAB_REALICE__)
      #include <trace16.h>
   #endif
#endif

#define   CLRWDT()   asm("clrwdt")
#define   SLEEP()      asm("sleep")
// function version of nop
#pragma intrinsic(_nop)
extern void _nop(void);
#define NOP()      _nop()

#ifdef _PIC14E
#define RESET()      asm("reset");
#endif

#define   ASMOPT_ON()      asm("opt asmopt_on")
#define   ASMOPT_OFF()   asm("opt asmopt_off")

//
// Legacy Programming Macro Functions
//
#define   __CONFIG(x) \
         __config(___mkstr(__CONFIG), ___mkstr(pic), ___mkstr(x))
// Programs the lower 4 bits per ID location
#define __IDLOC(w) \
         __config(___mkstr(__IDLOC), ___mkstr(pic), ___mkstr(w))
// Variant of IDLOC for those devices that permit programming of the lower 7 bits per ID location
#define __IDLOC7(a,b,c,d) \
         __config(___mkstr(__IDLOC7), ___mkstr(pic), a, b, c, d)
#define   __PROG_CONFIG(a, x)   \
         __config(___mkstr(__PROG_CONFIG), ___mkstr(pic), a, x)


#if !defined(_PIC14E) && !defined(_EEADRL)
#define _EEADRL EEADR
#else
#define _EEADRL EEADRL
#endif
#if   EEPROM_SIZE > 0
#define __EEPROM_DATA(a, b, c, d, e, f, g, h) \
          asm("\tpsect eeprom_data,class=EEDATA,delta=2,space=2"); \
          asm("\tdb\t" ___mkstr(a) "," ___mkstr(b) "," ___mkstr(c) "," ___mkstr(d) "," \
                  ___mkstr(e) "," ___mkstr(f) "," ___mkstr(g) "," ___mkstr(h))
#endif

/***********************************************************************
**** FLASH memory read/write/erase macros and function definitions ****
***********************************************************************
* Notes:
*   __FLASHTYPE == 0 defined in devices that can only read flash memory - cannot write eg. 16F777
*   __FLASHTYPE == 1 defined in traditional devices that can write 1 word at a time eg. 16F877
*   __FLASHTYPE == 2 defined in devices that can only write in 4 word blocks eg. 16F877A
*   __FLASHTYPE == 3 defined in devices requiring 32-word block erasure before writing eg. 16F87
*   __FLASHTYPE == undefined if device can neither read nor write program memory
*/
// macro FLASH_READ returns a word stored at a flash address
#if defined(__FLASHTYPE)
extern unsigned int flash_read(unsigned short addr);
#if   EEPROM_SIZE > 0
#define FLASH_READ(addr) \
   (_EEADRL=(addr)&0xff,   \
   EEADRH=(addr)>>8,   \
   WREN=0,         \
   EECON1 |= 0x80,      \
   RD=1,         \
   NOP(),         \
   NOP(),         \
   (EEDATH << 8) | EEDATA)
#else   // FLASH_READ without EEPROM
#define FLASH_READ(addr) \
   (_EEADRL=(addr)&0xff,   \
   EEADRH=(addr)>>8,   \
   RD=1,         \
   NOP(),         \
   NOP(),         \
   (EEDATH << 8) | EEDATA)
#endif
#endif   // end FLASH_READ

// macro FLASH_WRITE used when writing only one word of data
#if   __FLASHTYPE==2 || __FLASHTYPE==3
/*
* This is not available in this version. Contact HI-TECH support for more information.
#define FLASH_WRITE(addr,data)   \
   do{   \
   unsigned short x=data;   \
   flash_copy((const unsigned short *)&x,1,addr);   \
   }while(0)

extern void flash_copy(const unsigned short * source_addr,unsigned char length,unsigned short dest_addr);
*/
#elif   __FLASHTYPE==1
#define FLASH_WRITE(addr, value) \
   _EEADRL=((addr)&0xff);   \
   EEADRH=((addr)>>8);   \
   EEDATH=((value)>>8);   \
   EEDATA=((value)&0xff);   \
   EECON1 |= 0x80;      \
   WREN=1;         \
   EECON2 = 0x55;      \
   EECON2 = 0xaa;      \
   WR=1;         \
   NOP();      \
   NOP();      \
   WREN=0
//extern void flash_copy(const unsigned short * source_addr,unsigned char length,unsigned short dest_addr);
#endif   // end FLASH_WRITE

// macro FLASH_ERASE used to clear a 32-Byte sector of flash
#if   __FLASHTYPE==3
#define FLASH_ERASE(addr) \
          while(WR)continue; \
   _EEADRL=((addr)&0xFF); \
   EEADRH=((addr>>8)&0xFF); \
   EECON1=0x94; \
   CARRY=0;if(GIE)CARRY=1;GIE=0;\
   EECON2=0x55;EECON2=0xAA;WR=1; \
   NOP(); \
   if(CARRY)GIE=1

   // library function version
extern void flash_erase(unsigned short addr);
#endif   // end FLASH_ERASE

#include <eeprom_routines.h>

#ifdef __PICCPRO__
/****************************************************************/
/* Built-in delay routine               */
/****************************************************************/
#pragma intrinsic(_delay)
extern void _delay(unsigned long);
// NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif

/****************************************************************/
/****** Global interrupt enable/disable macro definitions *******/
/****************************************************************/
#if defined(_PIC14) || defined(_PIC14E)
   
#ifndef   ei
#define   ei()   (GIE = 1)   // interrupt enable bit
#endif 

#if defined(_14000) ||  defined(_16C61) || defined(_16C62) ||\
   defined(_16C63) || defined(_16C63A) || defined(_16C64) ||\
   defined(_16C65) || defined(_16C65B) || defined(_16C71) ||\
   defined(_16C73) || defined(_16C73B) || defined(_16C74) ||\
   defined(_16C74B) || defined(_16C84) || defined(_16C745) ||\
   defined(_16C765) || defined(_16LC74B)
   #ifndef   di
      #define di()   { do { GIE = 0; } while ( GIE == 1 ); }   // disable interrupt bit
   #endif 
#else
   #ifndef   di
      #define   di()   (GIE = 0)   // interrupt enable bit
   #endif 
#endif

#endif

#ifdef __RESETBITS_ADDR
/* If '--runtime=+resetbits' is specified, these reflect the state
   of TO and PD, respectively, which are trashed by startup code. */
unsigned char __resetbits @ __RESETBITS_ADDR;
bit __powerdown   @ ((unsigned)&__resetbits*8)+3;
bit __timeout   @ ((unsigned)&__resetbits*8)+4;
#endif
#endif   /* _PIC_H */


İyi çalışmalar.

Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: subram - 19 Şubat 2013, 13:13:11
uyarıdan kastım bahsettiğim satırların yayında "!" işareti oluşuyor ve satırın altını kırmızı çizgi oluyor. Yani normal şartlarda bir terslik varmış gibi görünüyor;

(http://c1302.hizliresim.com/16/m/k8kvm.png)
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: serhat1990 - 19 Şubat 2013, 15:38:34
Hocam MplabX ile ilgili birşey olabilirmi bende bu şekilde kullanıyorum Mplab ' da bir sıkıntı olmuyor . MplabX hiç kullanmadım .
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: subram - 19 Şubat 2013, 16:53:03
çok garip bir durum? Mplab X kullanan başka var mı? durum herkeste aynı mı?
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: serhat1990 - 19 Şubat 2013, 17:29:52
Hocam akşam müsait olursam kurup deneyecem size geri dönüş yaparım . XC 'de bazen garip sorunlar ortaya çıkabiliyor . Yaklaşık 3 ay önce bir konu açmıştım XC'de ortaya çıkan bir kaç sorun ile ilgili .

Yazdığım bir program herşeyinden eminim ama hatalı sonuç veriyor timer değerleri tam olarak tutmuyordu . XC8 Lite Mode kullanıyordum . Kaldırdım XC8 Eval Mode kurdum programda bir virgül değiştirmeden derledim doğru sonuçları aldım Lite mode ile Eval Mode arasında gördüğüm anlam veremediğim bu sorun birçok probleme neden olabilir . Kod sınırlaması yap , mcu sınırlaması , optimizasyon özelliğini kısıtla ama aynı kodu derlenipde birinin düzgün çalışıp birinin düzgün çalışmaması çok büyük sıkıntılar yaratabilir .

Bu nedenle bu tip bir sorunda olabilir ama tam yorum yapamıyorum incelemek gerek .
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: vco - 03 Nisan 2013, 17:24:57
Merhaba,

Bu delay fonksiyonlarını dahili osilatör ile kullanmak mümkün mü?
http://www.microchipc.com/sourcecode/ (http://www.microchipc.com/sourcecode/)

bu linkte de bir delay rutini yazılmış.

Örneğin #define PICCLK=8000000

olarak tanımlayıp osscon=0x70 ile yapabilir miyiz ?
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: sigmoid - 01 Mayıs 2014, 23:03:04
Alıntı yapılan: subram - 19 Şubat 2013, 13:13:11
uyarıdan kastım bahsettiğim satırların yayında "!" işareti oluşuyor ve satırın altını kırmızı çizgi oluyor. Yani normal şartlarda bir terslik varmış gibi görünüyor;

(http://c1302.hizliresim.com/16/m/k8kvm.png)

Bende XC8 de __delay_ms kullandığımda altında kırmızı işaret çıkıyor ve sorunsuz derliyor. İster istemez altta çıkan kırmızı çizgi beni rahatsız ediyor. Bunu nasıl engelleyebilirim. MPLAX 2.05 kullanıyorum.

teşekkür ederim.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: subram - 01 Mayıs 2014, 23:24:50
#define _XTAL_FREQ 4000000
yukarıdaki satırdan sonra olmak koşulu ile koduna alttaki satırları ekle

#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: sigmoid - 01 Mayıs 2014, 23:54:10
Bu define macrosunun mantığını anlayamadım. Zaten __delay xc8 içinde tanımlı değil mi?
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: baran123 - 02 Mayıs 2014, 01:09:38
Aynı hata bende de vardı şu fonksiyonla işi çözdüm


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

   for(i = 0; i < x; i++)
   {
      __delay_ms(1);
   }
}
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: mehmet - 02 Mayıs 2014, 12:42:03
/*******************************************************************************
*    XC8 de:                                                                  *
*    12F675 ile delay fonksiyonu denemesi;                                    *
*    uzun beklemeler hasas olmamakla birlikte                                 *
*    kullanmaya elverişli haldedir.                                           *
*                                        mehmet                               *
******************************************************************************/

#include <xc.h>

//------------------------------------------------------------------------------
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = ON          // Code Protection bit (Program Memory code protection is enabled)
#pragma config CPD = ON         // Data Code Protection bit (Data memory code protection is enabled)

//------------------------------------------------------------------------------
#define _XTAL_FREQ 4000000
#define my_delay_us(x) _delay((unsigned long)((x) * (_XTAL_FREQ/4000000.0)))
#define my_delay_ms(x) _delay((unsigned long)((x) * (_XTAL_FREQ/4000.0)))

//------------------------------------------------------------------------------
#define LED GPIObits.GP0
#define LED_TRIS TRISIObits.TRISIO0

//------------------------------------------------------------------------------
void saniye_bekle (unsigned int saniye) //en az 1 saniye
{
    do
    {
        my_delay_ms(1000);
    }while(saniye--);
}

//------------------------------------------------------------------------------
void mcu_init (void)
{
    LED = 0;
    LED_TRIS = 0;
}

//------------------------------------------------------------------------------
void main (void)
{
    mcu_init();

    while(1)
    {
        LED = 1;
        //my_delay_ms(500);
        saniye_bekle(1);
        LED = 0;
        //my_delay_ms(500);
        saniye_bekle(1);
    }
}
//==============================================================================
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: serdararikan - 02 Mayıs 2014, 23:18:27
__delay_ms()

komutu ile maksimum 20 milisaniyelik gecikme yapabilirsiniz.eğer kristal frekansınız 4MHz den büyükse tavsiyem 1 saniyelik gecikme için

for(unsigned char i=0;i<100;i++) __delay_ms(10);

formatını kullanınız
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: Eren Eraslan - 02 Mayıs 2014, 23:22:45
XC de çokca kez dillendiriliyor delay sorunları. Microchip neden kalıcı bir çözüm sağlamıyor acaba ?
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: sigmoid - 02 Mayıs 2014, 23:58:13
xc 1.31 kullanıyorum. __delay_ms ile uzun beklemeler yaptım sorun çıkmadı. istediğim süreleri tam olarak vermesi çok hoşuma gitti. birtek delay_ms altında yazan kırmızı çizgi beni sinir ediyor.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: Saruman - 03 Mayıs 2014, 00:15:21
İşlemciye özgürlük ! İşlemciler hiç bir zaman durmamalı beklememeli :)

Sizi multitasking'e davet ediyorum, buradan başlayabilirsiniz :

http://www.microchipc.com/Hi-Tech_C_multitask/ (http://www.microchipc.com/Hi-Tech_C_multitask/)
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: serhat1990 - 03 Mayıs 2014, 11:27:15
Kaan Hocama katılıyorum :)
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: acemi2010 - 28 Haziran 2014, 00:32:09
Alıntı yapılan: sigmoid - 02 Mayıs 2014, 23:58:13
xc 1.31 kullanıyorum. __delay_ms ile uzun beklemeler yaptım sorun çıkmadı. istediğim süreleri tam olarak vermesi çok hoşuma gitti. birtek delay_ms altında yazan kırmızı çizgi beni sinir ediyor.

Hocam Pic.h dosyasını bulabilir misiniz? (Bende C:\Program Files (x86)\Microchip\xc8\v1.32\include dosyasında)


#ifdef __PICCPRO__
/****************************************************************/
/* Built-in delay routine                    */
/****************************************************************/
#pragma inline(_delay)
extern void _delay(unsigned long);
// NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif


Yukardaki kısımdaki 
#ifdef __PICCPRO__  
ifadesini 
#ifdef __PICC__
yapıp save edip denermisiniz?
_XTAL_FREQ 'ı programınızda tanımlamanız gerekli(!) ve yeterli, başka bir tanımlama yapılmasına hiç gerek yok.

saygılarımla
Timuçin

EDIT :

http://www.microchip.com/forums/m673703-p2.aspx#742138 (http://www.microchip.com/forums/m673703-p2.aspx#742138)
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: tekosis - 28 Haziran 2014, 00:40:36
arkadaşlar xc ile ilgili değil ama aynı problem ccs c de de başıma gelmişti. zamanında 18f4622 kullanmak istediğimde 16f877a  ile normalde düzgün çalışan delay_ms fonksiyonu hatalı çalışmaya başladı. programı kaldırıp farklı versiyon kurduğumda düzelmişti.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: Gökhan BEKEN - 28 Haziran 2014, 03:58:09
Alıntı yapılan: ereneraslan7 - 02 Mayıs 2014, 23:22:45
XC de çokca kez dillendiriliyor delay sorunları. Microchip neden kalıcı bir çözüm sağlamıyor acaba ?

Aslında sorun felan yok. En azından ben hiç yaşamadım. Free modda biraz süre kısıtlaması var sadece. Zaten sorun olsa bile, illa derleyicinin hazır delay kodlarını kullanmak şart değil, kendi fonksiyonumuzu da kullanabiliyoruz. Sürekli bu sorunun(!) gündeme gelmesi, yeni başlatanları xc8'den ürkütüyor bence.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: seyityildirim - 31 Temmuz 2015, 21:49:56
Kusura bakmayın arkadaşlar yeni konu açmak istemedim bende de şöyle bir durum var. mplabx v3.05 kullanıyorum. _delay_ms(100) komutunu yazdığımda error verirken _delay(100) yazdığımda sıkıntı olmuyor. bu yeni güncelleme midir yoksa bana özel mi :)
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: kantirici - 31 Temmuz 2015, 22:59:34
__delay_ms(100) olmalı, iki tane "_"  ile.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: seyityildirim - 01 Ağustos 2015, 04:55:48
iki tane _ koyduğum halde böyle @kantirici
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: kantirici - 01 Ağustos 2015, 09:55:15
xc.h dosyasını include edip #defin #define _XTAL_FREQ 4000000UL ile de kristal frekansını tanımladın değil mi?
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: seyityildirim - 01 Ağustos 2015, 12:44:26
@subram ın sunduğu kodu yazınca sıkıntı kalmıyor. sorun çözüldü
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: kantirici - 01 Ağustos 2015, 18:32:56
Unuttuğum bir şey, __delay_ms fonksiyonunun kristal frekansına göre alacağı değer aralığı değşiiyor. Frekans yükseldikçe tek seferde yapılacak bekleme değeri düşüyor. yani 4mhz de 250 ms sorun çıkarkmaz iken 16mhz de çıkarıyor. Ona dikkat etmek gerek.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: seyityildirim - 01 Ağustos 2015, 19:29:38
Peki bunun bir parametresi var mı ? kaçtan mhz den sonra bozuluyor? yoksa göz kararı kendimiz mi ayarlıyoruz @kantirici
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: tekosis - 01 Ağustos 2015, 20:04:42
ccs c de misal delay_ms(20); dediğimizde delay_ms komutu kendi içinde 20 defa 1ms beklemeye sahip bir alt programı çağırıyor. bundan dolayı kristal ile ilgili bir kısıtlama olmuyor.

düzeltme: kusura bakmayın konu xc8 miş.
Başlık: Ynt: _delay_us(),_delay_ms() sorunu
Gönderen: kantirici - 01 Ağustos 2015, 22:11:09
@seyityildirim
__delay_ms şu şekilde tanımlanmış ;

#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

ve MPLAB_XC8_C_Compiler_User_Guide de _delay için şu ifade var;

Alıntı YapAn error will result if the delay period requested is not a constant expression or is too
large (approximately 179,200 for PIC18 devices, and 50,659,000 instructions for other
8-bit PIC devices). For very large delays, call this function multiple times.