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.
belirttiğiniz kodlar hi-tech c nin kendi delay kodları ile çelişiyor.
onların kullanımını bir inceleyin...
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 .
#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
#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
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.
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.
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 .
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 ...
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 .
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 ...
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.
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.
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)
Hocam MplabX ile ilgili birşey olabilirmi bende bu şekilde kullanıyorum Mplab ' da bir sıkıntı olmuyor . MplabX hiç kullanmadım .
çok garip bir durum? Mplab X kullanan başka var mı? durum herkeste aynı mı?
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 .
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 ?
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.
#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)))
Bu define macrosunun mantığını anlayamadım. Zaten __delay xc8 içinde tanımlı değil mi?
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);
}
}
/*******************************************************************************
* 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);
}
}
//==============================================================================
__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
XC de çokca kez dillendiriliyor delay sorunları. Microchip neden kalıcı bir çözüm sağlamıyor acaba ?
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.
İş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/)
Kaan Hocama katılıyorum :)
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)
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.
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.
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 :)
__delay_ms(100) olmalı, iki tane "_" ile.
iki tane _ koyduğum halde böyle
@kantirici
xc.h dosyasını include edip #defin #define _XTAL_FREQ 4000000UL ile de kristal frekansını tanımladın değil mi?
@subram ın sunduğu kodu yazınca sıkıntı kalmıyor. sorun çözüldü
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.
Peki bunun bir parametresi var mı ? kaçtan mhz den sonra bozuluyor? yoksa göz kararı kendimiz mi ayarlıyoruz
@kantirici
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ş.
@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.