_delay_us(),_delay_ms() sorunu

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

subram

çok garip bir durum? Mplab X kullanan başka var mı? durum herkeste aynı mı?
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

serhat1990

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 .

vco

Merhaba,

Bu delay fonksiyonlarını dahili osilatör ile kullanmak mümkün mü?
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 ?

sigmoid

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;

(Resim gizlendi görmek için tıklayın.)

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.

subram

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

sigmoid

Bu define macrosunun mantığını anlayamadım. Zaten __delay xc8 içinde tanımlı değil mi?

baran123

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);
   }
}

mehmet

/*******************************************************************************
 *    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);
    }
}
//==============================================================================
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

serdararikan

__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

Eren Eraslan

XC de çokca kez dillendiriliyor delay sorunları. Microchip neden kalıcı bir çözüm sağlamıyor acaba ?
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

sigmoid

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.

Saruman

İş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/

serhat1990


acemi2010

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

tekosis

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