Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: Tagli - 24 Mayıs 2012, 20:37:41

Başlık: XC8 _delay Sorunu
Gönderen: Tagli - 24 Mayıs 2012, 20:37:41
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.
Başlık: Ynt: XC8 _delay Sorunu
Gönderen: muuzoo - 24 Mayıs 2012, 20:58:38
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?
Başlık: Ynt: XC8 _delay Sorunu
Gönderen: Tagli - 24 Mayıs 2012, 21:04:29
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ı.
Başlık: Ynt: XC8 _delay Sorunu
Gönderen: Tagli - 24 Mayıs 2012, 21:35:09
Ç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?