xc de 18f serisi

Başlatan ahmetbudak, 12 Ocak 2014, 23:34:14

ahmetbudak

arkadaşlar hayırlı kandiller  xc8 de 18f252 mcu için aşağıdaki kodları yazdığımda;

main.c:24: error: inline delay argument too large
main.c:26: error: inline delay argument too large

hatalarını veriyor sanırım xtal frekansı tanımlamasında hata yapıyorum 18 serisi picleremi özgü tam emin değilim yardımlarınız için şimdiden teşekkürler 24 ve 26. satırlar delay ifadeleri

kod:
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

#pragma config WDT = OFF
#pragma  config OSC=XT

#define _XTAL_FREQ 4000000
/*
 * 
 */
void main() {
   TRISB=0x00;                          //  PORTB ÇIKIŞ YAPILDI
   PORTB=0x00;
   while(1){
       PORTB=0xff;
      __delay_ms(250);
       PORTB=0X00;
      __delay_ms(250);
            }



    
}

Tagli

Emin değilim ama bir ihtimal o komutlar makro olabilir. Benim aklımda 20 küsurdan büyük değer alamadıkları kalmış ama bu sınır kristal frekansına göre değişiyor olabilir.

Sorunun etrafından dolanmak için ben kendi fonksiyonumu yazdım:
void delayMs(unsigned int ms){
	while (ms > 0){
		__delay_ms(1);
		ms--;
	}
}

Elbette bu durumda döngü için gereken süre de ekleneceğinden zamanlama hassas olmayacak. Ancak zaten hassas zamanlamalar için timer kullanmak gerekir. Bu çözüm yaklaşık olarak tatmin edici bir sonuç veriyor.
Gökçe Tağlıoğlu

Gökhan BEKEN

Sınırlama var, muhtemelen ücretsiz versiyon kullanıyorsunuz. XTAL frekansı ile __delay_ms içine yazacağınız sayının bir ilişkisi var.
4 mhz kullandığımda 1000 yazdığımda hata vermişti bende 10 adet __delay_ms(100); yazmıştım.
Bunu aşmanın bir yolu olabilir ancak o kadar gerekli birşey de değil. Normalde delay ile o kadar bekleme yapmak, çok ta iyi birşey değil.
Özel mesaj okumuyorum, lütfen göndermeyin.

ahmetbudak

Alıntı yapılan: meftun - 13 Ocak 2014, 08:17:20
Sınırlama var, muhtemelen ücretsiz versiyon kullanıyorsunuz. XTAL frekansı ile __delay_ms içine yazacağınız sayının bir ilişkisi var.
4 mhz kullandığımda 1000 yazdığımda hata vermişti bende 10 adet __delay_ms(100); yazmıştım.
Bunu aşmanın bir yolu olabilir ancak o kadar gerekli birşey de değil. Normalde delay ile o kadar bekleme yapmak, çok ta iyi birşey değil.
kullandığım versiyon limitli ancak 16f serisinde 250ms problem çıkarmamıştı

serhat1990

Merhabalar , uzun zaman önce başıma geldiğinde bakmıştım şuan hatırımda değil kaydetmiştim bir yere fakat bulamadım notlar arasında . Tanımlanan
" #define _XTAL_FREQ x " değeri ile bu fonksiyona yazılabilecek maksimum değerler değişkenlik gösteriyor . Tam hatırlamadığımdan pek açıklayıcı olmadı ama akşam evdeki notlarımıda bir kontrol edeyim.  @Tagli Hocamın bahsettiği gibi tanımlanan frekans değeri ile ilişkili olarak yazılabilen değerler değişkenlik gösteriyor.

İyi çalışmalar dilerim.

subram

söylendiği gibi bu kadar uzun süre kullanmak mantıklı değil. Ama soruna bakarsa garip bir olay var. 16Fserisinde 500ms "kullandım" hiç bir sorun olmadı; http://ramazansubasi.net/xc8-ilk-uygulama/

Verdiğin kodları aynen alıp  derledim aynı hata bende de vardı. Süreyi küçülttüm 197ms'de hata vermedi. Biraz araştırınca şöyle şeyler gördüm. delay için kısıtlama vamış! maximum süre 256*256*3 saykıl oluyormuş.  4Mhz için bir saykılımız 1us olduğuna göre buradan 256*256*3=196608us eder yani 196,608ms.

16f'de niye böyle değil? ben de bilmiyorum araştırmaya devam.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

Tagli

Bu önemli bir sorun değil ama. Verdiğim kodda da görüleceği üzere sadece 6 satırlık bir fonksiyon yazarak olay çözülüyor. Hatta 3 satırda da yazılır ama göze hoş gözükmez.
void delayMs(unsigned int ms){
    while (ms-- > 0) __delay_ms(1);
}
Gökçe Tağlıoğlu

serhat1990

Alıntı yapılan: subram - 13 Ocak 2014, 15:39:56
söylendiği gibi bu kadar uzun süre kullanmak mantıklı değil. Ama soruna bakarsa garip bir olay var. 16Fserisinde 500ms "kullandım" hiç bir sorun olmadı; http://ramazansubasi.net/xc8-ilk-uygulama/

Verdiğin kodları aynen alıp  derledim aynı hata bende de vardı. Süreyi küçülttüm 197ms'de hata vermedi. Biraz araştırınca şöyle şeyler gördüm. delay için kısıtlama vamış! maximum süre 256*256*3 saykıl oluyormuş.  4Mhz için bir saykılımız 1us olduğuna göre buradan 256*256*3=196608us eder yani 196,608ms.

16f'de niye böyle değil? ben de bilmiyorum araştırmaya devam.

Hocam akşam notları karıştırayım bulabilirsem ekleyeyim önceden araştırmıştım şuan hatırlamıyorum. Tanımlanan frekans değerleri ile alakalı . Örneğin 18f4550 'yi 48 mhz'te kullanırken __delay_ms(20); fonksiyonu hata verirken tanımlamada frekans değerini 4 mhz'e çekerek __delay_ms(100); fonksiyonuda kullanabilir oluyor . XC8' in lib. arasında bulmuştum önceden fakat şimdi bulamadım. Akşam biraz kurcalayayım.
@Tagli Hocamın dediği gibi bir sorun değil , basit kodlarla aşılabilir ama nedenini açıklayalım en azından kafadaki soruları yanıtlanmış olur.

İyi çalışmalar dilerim.

subram

Dediğim gibi işte aynı kapıya çıkıyor sonuç. örnek ile anlatayım

256*256*3=196608 saykıl (bu değer nerden geliyor ona bakmak lazım)

1)
4Mhz'de bir saykıl 1us o yüzden max değerimiz 196608*1uS=~197ms oluyor

2)
20Mhz'de bir saylık 200ns o yüzden max değerimiz 196608*200nS=~39ms oluyor.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

ahmetbudak

cevaplar için teşekkürler 18f ler fuse configirasyonları da değişik gördüm kadarıyla bu konuda kaynak önerebilir misiniz?

Tagli

Kurulum klasörünün içinde oldukça kullanışlı bir doküman var: pic18_chipinfo.html olarak geçiyor.
Benim bilgisayardaki adresi şöyle: /opt/microchip/xc8/v1.20/docs/pic18_chipinfo.html (Linux'ta tabi ki :) Windows'ta opt yerine Program Files gelir sanırım.)
Gökçe Tağlıoğlu

subram

Alıntı yapılan: ahmetbudak - 13 Ocak 2014, 17:23:52
cevaplar için teşekkürler 18f ler fuse configirasyonları da değişik gördüm kadarıyla bu konuda kaynak önerebilir misiniz?
Configrasyon için microchipin kullanışlı bir aracı var. Kullanımı için alttaki yazıda 3.Başlığa bak;
http://ramazansubasi.net/mplab-x-baslamadan-pratik-bilgiler/

Bu arada bu kısıtlama ile ilgili olarak XC nin dökümanlarında bazı açıklamalar @serhat ile baktık şu şekilde açıklama var

Alıntı YapIn-line delay values The delay value specified with the in-line delay function (_delay) is limited
to 179,200 on PIC18 devices. With PIC10/12/16 devices, this value may be up to
50,659,000.

dosya;  microchip/xc8/v1.20/docs/Readme_XC8 sayfa 29
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz