_delay_us(),_delay_ms() sorunu

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

Gökhan BEKEN

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.
Özel mesaj okumuyorum, lütfen göndermeyin.

seyityildirim

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 :)

kantirici

__delay_ms(100) olmalı, iki tane "_"  ile.

seyityildirim


kantirici

xc.h dosyasını include edip #defin #define _XTAL_FREQ 4000000UL ile de kristal frekansını tanımladın değil mi?

seyityildirim

#35
@subram ın sunduğu kodu yazınca sıkıntı kalmıyor. sorun çözüldü

kantirici

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.

seyityildirim

Peki bunun bir parametresi var mı ? kaçtan mhz den sonra bozuluyor? yoksa göz kararı kendimiz mi ayarlıyoruz @kantirici

tekosis

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ş.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

kantirici

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