_delay_us(),_delay_ms() sorunu

Başlatan pax, 09 Ocak 2013, 14:57:19

pax

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.

memo333

belirttiğiniz kodlar hi-tech c nin kendi delay kodları ile çelişiyor.

onların kullanımını bir inceleyin...
Gömülü Linux Notları --> http://linuxedu.xyz/

serhat1990

#2
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 .

pax

#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

serhat1990

#4
#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

pax

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.

skara1214

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.
Herkes ölür ama herkes gerçekten yaşamaz

pax

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 .

serhat1990

#8
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 ...


pax

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 .

serhat1990

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 ...

subram

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.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

serhat1990

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.


subram

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://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

serhat1990

Hocam MplabX ile ilgili birşey olabilirmi bende bu şekilde kullanıyorum Mplab ' da bir sıkıntı olmuyor . MplabX hiç kullanmadım .