XC8 "__delay_ms()" fonksiyonu.

Başlatan Bayramsumbul, 23 Ocak 2014, 13:42:42

Bayramsumbul

Arkadaşlar çok basit bir program yazdım.(belli bir amacı yok).
Derleyici şöyle bir hata veriyor;
Alıntı Yap../main.c: 17: (1387) inline delay argument must be constant
../main.c: 17: (712) can't generate code for this expression
Anlayamıyorum.Neden "__delay_ms(x)" şeklinde kullanamıyorum.İllaki sabit bir sayı mı olmak zorunda?
Acaba derleyicinin güncel sürümünü indirsem sorun çözülür mü?yoksa bu hata benden mi kaynaklanıyor?
Buyurun kod;
#include <xc.h>
#pragma config BOREN = OFF, CPD = OFF, FOSC = INTOSCIO, MCLRE = OFF, WDTE = OFF, CP = OFF, LVP = OFF, PWRTE = OFF
#define _XTAL_FREQ 4000000
#define	BSF(file,bit)	(file |=(1 << bit))
#define	BCF(file,bit)	(file &=!(1 << bit))
void interrupt isr(){}
void main(void)
{
	TRISB=0x05;
	PORTB=0x00;
	while (1)
	{
		int x=0;
		x=10;
		while(PORTB&0x01)
		{
			__delay_ms(x);
		}
	}
}
Bir Elektronik Meraklısının Serüveni...

muhittin_kaplan

xc sekiz bilmiyorum ama hata
inline delay argument must be constant

dediğine göre delay ın sabit bir sayı olması gerekiyor

__delay_ms(x);

yerine

__delay_ms(10);



Bayramsumbul

Hocam peki benim mesela Uart'tan gelen sayıya göre bekleme yapmam gerekiyor.O zaman da "__delay_ms(RCREG)" şeklinde bir kullanım gerekecek,o zaman yine hata vermez mi?Yada değişken bir "x" sayısı kadar beklemem gerek.O zaman nasıl olabilir?
Bir Elektronik Meraklısının Serüveni...

muhittin_kaplan

inline delay dediği senin kullandığın komuttur, izin vermiyordur (emin değilim kullanmadığım için)

bekleme fonksiyonunu kendin yaz.

Bayramsumbul

Forum'da benzer bir konu buldum,şöyle bir tanımlama ile çözüm önermişler.Bir deniyeyim;
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
Bir Elektronik Meraklısının Serüveni...

Tagli

Gökçe Tağlıoğlu

selimkoc

mikroC 'de Vdelay(değişken-int-) kullanarak bu sağlanabiliyor. Kendiniz de for vb döngü ile yazabilirsiniz.

subram

Alıntı yapılan: Bayramsumbul - 23 Ocak 2014, 13:54:51
Forum'da benzer bir konu buldum,şöyle bir tanımlama ile çözüm önermişler.Bir deniyeyim;
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))


Bu önerin tam olarak sizin isteğidiniz şeyi yapacağını düşünmüyorum. __delay fonksiyonu bazı makinelerde uyarı gösteriyor. Uyarıyı kaldırmak için bu satırı yazmak yeterli oluyor.

Senin istediğin gibi olması için Gökçe'nin verdiği kodu kullanmalısın

Alıntı yapılan: Tagli - 13 Ocak 2014, 00:03:14
void delayMs(unsigned int ms){
	while (ms > 0){
		__delay_ms(1);
		ms--;
	}
}

http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

Bayramsumbul

@Tagli 'nin verdiği kod ile hallettim.Yardımcı olan herkese teşekkür ederim.Belki lazım olur kod;
void Delay_ms(unsigned int ms){while (ms>0) {ms--;__delay_ms(1);}}
Bir Elektronik Meraklısının Serüveni...

Tagli

Yalnız tekrar hatırlatmakta fayda var: Verdiğim kodda, döngüden kaynaklanan gecikmeler sebebiyle zaman bir miktar kayacaktır. Döngü yükünün 5 MIPS'te 2-3 us kadar olacağını sanıyorum. Bu da zamanlamanın %0.3 kadar kayabileceği anlamına gelir. Ama zaten hassas zamanlama gereken yerlerde delay kullanımı yanlış olur, timer kullanmak gerekir. Bu sebeple, söz konusu kaymanın çok sorun olacağını sanmıyorum.
Gökçe Tağlıoğlu

yılmaz

Merhaba herkese

MPLABX IDE de CCS C Compiler da kullandığım komutları ve fonksiyonları nasıl kullanabilirim.Acaba C Compiler Derleyicisini i yüklemem lazım.

selvi

  ben de ccs c derleyicisini kullaniyordum.bu aralar MPLAB X kullaniyorum.ccs c le yaptigin programi koplayip mplab x de tekrardan proje olusturarak kullanabilirsin.tabi ccs c ile yazilmis bazi komutlarda degisiklik var.onlara dikkat etmezsen derlerken sana hata verecektir.
  ornegin;ccs c de   "output high(led)"   seklinde yazdigin komut mplab x de "led=1"  demek yeterlidir.mplab x hitec c komutlarini kullanir.
Yaşam anlamlandırıldıkça kutsaldır....

burak_8758

Bu komutun kullanımını kendi yardım menüsünde gösteriyor ama 16 serisi piclere program yazarken sadece __delay() komutu çalışıyor ms ve us olanlar çalışmıyor. Bunu geçte olsa bende fark ettim. ama 18 serisi piclerde yine bu komutları doğrudan kullanabiliyoruz. Denedim.

Tagli

Hayır, 16 serisinde de çalışıyor bu komutlar. Parametrelerin yüksek değerleri için hatalar olabiliyor, bilmiyorum "çalışmıyor" derken bunu mu kastettin. Ama mesela __delay_ms(1) gibi bir ifade yazabiliyorsun rahatlıkla.
Gökçe Tağlıoğlu