Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

XC8 _delay Sorunu

Başlatan Tagli, 24 Mayıs 2012, 20:37:41

Tagli

XC8 derleyicisi denemelerine elbette ki LED yakıp söndürme ile başlayayım dedim ve "dakika 1 gol 1" durumu oldu. _delay makrosu beklediğim gibi çalışmıyor. Süre olması gerektiğinden az çıkıyor.

Kullandığım model PIC18F452, kristal 16 MHz (başka kristaller de denedim, değişen birşey yok)

Kod:
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <delays.h>

#pragma config OSCS = OFF
#pragma config OSC = HS
#pragma config BOR = OFF
#pragma config PWRT = ON
#pragma config WDT = OFF
#pragma config CCP2MUX = OFF
#pragma config LVP = OFF
#pragma config STVR = OFF

void setup(void);

int main(int argc, char** argv) {

    setup();
    
    while(1){
        LATCbits.LATC5 = 1;
        _delay(40000UL);
        LATCbits.LATC5 = 0;
        _delay(40000UL);
    }

    return (EXIT_SUCCESS);
}

void setup(void){
    TRISA = 0b11101111;
    TRISB = 0b11110011;
    TRISC = 0b11011000;
    TRISD = 0b00000000;
    TRISE = 0b00000111;

    PORTA = 0;
    PORTB = 0;
    PORTC = 0;
    PORTD = 0;

}


Her komut 250 ns'de işlenmeli 16 MHz kristal ile. Bu durumda _delay(40000UL) 10 ms sürmeli. Osiloskoptan bakıyorum, bende yaklaşık 7.5 ms sürüyor.

Bunun sebebi ne olabilir? Derleyici makrosunda mı hata var?

MPLAB X 1.10 kullanıyorum. Windows 7 ve Xubuntu'da denedim, fark yok.
Gökçe Tağlıoğlu

muuzoo

Yanlış hatırlamıyorsam XTAL_FREQUENCY gibi bir tanımala ile kristal frekansımızı bildiriyorduk. Yoksa ön tanımlı değerler de çalışıyordu.  Bir delay.h dosyasını inceler misiniz?
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

Tagli

O tanımlama __delay_ms kullanımı için geçerli. Ben bununla ilgili bir sorun olabileceğini düşündüğüm için doğrudan ham bekleme makrosunu kullandım. Ham _delay makrosu cycle cinsinden bekleme yapıyor. Bu sebeple XTAL_FREQUENCY tanımından bağımsız. Ama onu kullanınca da sonuç aynı. Zaten __delay_ms, XTAL_FREQUENCY değerine göre uygun şekilde dahili olarak _delay kullanıyor.

Bu arada C18'de kullanılan Delay1KTCYx(40) makrosunu da denedim. Galiba bu da aslında aynı şeyi çağırıyor çünkü sonuç aynı. Osiloskop hatalı olabilir diye (pek olası değil ya) frekans ölçebilen multimetre ile ölçtüm, sonuç aynı.
Gökçe Tağlıoğlu

Tagli

Çok ilginç...

XC8'den emin olamadığım için C18 ile de denemeler yapıyordum. C18'de zamanlama sorunu yok, ama PLL bir türlü etkinleşmiyor config'den ayarlasam da...

2 adet 18F452, 1 tane de 18F458 ile deneme yaptım. Sonuç aynı.

Sonra 18F4520 ile denedim, iki derleyici ile de sonuç mükemmel. Hem XC8 ile tam 10 ms bekleme oldu, hem de C18'de PLL'yi açmayı başardım.

Nerede hata yapıyor olabilirim?
Gökçe Tağlıoğlu