Hi-Tech picc Delay fonksiyonu 20Mhz de çalıştırmak.

Başlatan igolcubasi, 06 Mayıs 2009, 09:15:27

igolcubasi

Hi-Tech picc de delay fonksiyonunu 20 Mhz de çalıştıramadım.Mplab altında derliyorum.Program derleniyor ama üretilen gecikme rutinleri farklı üretiliyor.

ORC

Alıntı yapılan: "igolcubasi"Hi-Tech picc de delay fonksiyonunu 20 Mhz de çalıştıramadım.Mplab altında derliyorum.Program derleniyor ama üretilen gecikme rutinleri farklı üretiliyor.

delay fonksiyonunun içeriğini modifiye ettiniz mi peki 20 mhz e gore yani..

igolcubasi

Derleyicinin samples klasöründe bulunan hazır delay fonsiyonunu kullandım.20 mhz göre nasıl modifiye edebilirim bilemiyorum.

ORC

Alıntı yapılan: "igolcubasi"Derleyicinin samples klasöründe bulunan hazır delay fonsiyonunu kullandım.20 mhz göre nasıl modifiye edebilirim bilemiyorum.

evet bendde ondan bahsediyorum o fonksiyonu modifiye etmek

Alıntı Yap/*
*   Delay functions
*   See delay.h for details
*
*   Make sure this code is compiled with full optimization!!!
*/

#include   "delay.h"

void
DelayMs(unsigned char cnt)
{
#if   XTAL_FREQ <= 2MHZ
   do {
      DelayUs(996);
   } while(--cnt);
#endif

#if    XTAL_FREQ > 2MHZ   
   unsigned char   i;
   do {
      i = 4;
      do {
         DelayUs(250);
      } while(--i);
   } while(--cnt);
#endif
}

delay.h de asagıda

Alıntı Yap#ifndef   XTAL_FREQ
#define   XTAL_FREQ   4MHZ      /* Crystal frequency in MHz */
#endif

#define   MHZ   *1000L         /* number of kHz in a MHz */
#define   KHZ   *1         /* number of kHz in a kHz */

#if   XTAL_FREQ >= 12MHZ

#define   DelayUs(x)   { unsigned char _dcnt; \
           _dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
           while(--_dcnt != 0) \
              continue; }
#else

#define   DelayUs(x)   { unsigned char _dcnt; \
           _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
           while(--_dcnt != 0) \
              continue; }
#endif

extern void DelayMs(unsigned char);

bu dosyalardaki 4 mhz tanımlamalrını 20 mhz yaparsınn ama tabi orda bi 12 mhz sartı var acaba bu kosul u gozardı edersen bu kısmı yazmaszan hata verirmi bilmiyorum.. su an pc de mplab ve hitecler kurulu değil deneyemedim

Alıntı Yap#if XTAL_FREQ >= 12MHZ

#define DelayUs(x) { unsigned char _dcnt; \
_dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
while(--_dcnt != 0) \
continue; }
#else

#define DelayUs(x) { unsigned char _dcnt; \
_dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
while(--_dcnt != 0) \
continue; }
#endif

yani bu kısmı yazmazsan da olur gb me geliyor..cunku burda bi kontrol yapılmıs sanırım..

Birde delay.c de 2 mhz sartı var sen onu 10 mhz yap bakalım herhalde kabaca boyle modifiye edilir :roll:

tabi ana programında kristalinin 20 mhz olugunu da belirtirsen olur sanıırım sen bi dene olmzsa ben bikac gune format atacam herseyi kurarım o zaman simulasyonda da deneyerek gormus oluruz..

kolay gelsin

arslan74

Merhaba,

#ifndef XTAL_FREQ 
#define XTAL_FREQ 4MHZ /* Crystal frequency in MHz */


Kısmında 4 yazan yere 20 yap başka bir şey yapmana gerek yok.

Yani şöyle:

#ifndef XTAL_FREQ 
#define XTAL_FREQ 20MHZ /* Crystal frequency in MHz */


Ama bu hazır kodlar istediğin değerlerde %100 gecikme sağlamiyor. İstediğiniz değeri elde etmek için kendiniz de cok basid buna benzer kodlar yazabilirsiniz.

Selamlar

igolcubasi

Arslan hocam delay.h içindeki kodu değiştirdim.
#ifndef   XTAL_FREQ
#define   XTAL_FREQ   20MHZ      

ana programın içinede
#undef XTAL_FREQ  
#define XTAL_FREQ 20MHZ
yeni osc frekansını yazdım.
Proteusta  timer kullanarak gecikmeyi test ettim.250 ms gecikmeyi 587 ms olarak ölçtüm.
Programda tmr0 kesmesi kullanıyorum.Gecikme için kullandığım delay fonsiyonu bu kesmeden etkilenirmi?
Yazdığım program pwm yardımıyla donanımsal olarak dtmf üretiyor.
Ben keypadi okuyup kesmeleri aktif edip dtmf üretiyorum.250 msn gecikmeden sonra kesmeleri kaldırıp pwm i kapatıyorum.Burda kullandığım gecikme istediğim gecikmeyi sağlamıyor.250 msn 3-5 msn hata pabilir ama çok fazla yapıyor.

arslan74

Alıntı Yap
Programda tmr0 kesmesi kullanıyorum.Gecikme için kullandığım delay fonsiyonu bu kesmeden etkilenirmi?

Evet kesinlikle etkiler. Beklediğinden fazla bir gecikme oluşturur.  

Timer kullaniyorsan gecikmelerini timer ile yap bu sorun ortadan kalksın.

AEK

#define   XTAL_FREQ   20MHZ     yaptım ancak problem devam ediyor 1250us olarak verdiğim gecikme yaklaşık 350 us oluyor

serdararikan

Alıntı yapılan: FxDev - 20 Mayıs 2010, 22:38:19
Programın başına: #define _XTAL_FREQ 20000000L
yaz.

Daha sonra: __delay_ms(30); veya __delay_us(30);

şeklinde kullan bakalım sonuç ne olacak?
Delay kütüphanelerini falan sil.

20MHz de Hitech in tanımlı delay fonksiyonunu __delay_ms(20); den daha büyük bi değer yazarsan derleyemezsin.FxDev inde dediği bigi xtal tanımlamasını yaparak 20mhz de kullanabilirsin.

AEK

__delay_us(30); fonksiyonunda en fazla 30 mu kullanılabilir mesela __delay_us(250); şelinde çalışmaz mı?

AEK


serdararikan

Alıntı yapılan: devadam - 20 Mayıs 2010, 23:06:44
__delay_us(30); fonksiyonunda en fazla 30 mu kullanılabilir mesela __delay_us(250); şelinde çalışmaz mı?

mikro saniyede sıkıntı yok.milisaniyede var. eğer 20 milisaniyeden fazla gecikme lazımsa

for (unsgined char i=0;i<100;i++) __delay_ms(10);

gibi kullanılabilir.mesela yukarıdaki satır 1 saniyelik gecikme oluşturur.

papylon

Alıntı yapılan: papylon - 16 Mayıs 2010, 03:47:28
Arkadaşlarında dediği gibi HI-TECH'in delay rutini pek de verimli değil.
Aşağıdaki Microchip'in sitesinden PIC16 ve 18 serisi için yazılmış çok daha verimli Delay kütüphaneleri var, onları kullanmanızı tavsiye ederim.
Ayrıca incelemek isterseniz faydalı birçok uygulama örnekleri de var.

http://www.microchipc.com/sourcecode/

Sepiroth

ben hazir delay kutuphanelerini kullanmamaya calisiyorum, hic bir zaman precise olmuyorlar. cunku arada for looplar increment komutlari vs vs gibi seylerde etkiliyo en nihayetinde. en temizi kendi delay komutunu kendiniz yazin. ben su sekilde bir yol izliyorum; ornegin taktigim kristal 10MHz PLL ile 40MHz'e cikariyorum, bir instruction 100ns demek.

#define Delay100ns()   (asm("nop"))
#define Delay500ns()   (asm("nop"),asm("nop"),asm("nop"),asm("nop"),asm("nop"))
#define Delay1us()    (Delay500ns(),Delay500ns())
#define Delay5us()    (Delay1us(),Delay1us(),Delay1us(),Delay1us(),Delay1us())


bu sekilde devam edebilirsin tanimlamaya. sonra istedigin her hangi bir yerde cagirirsin :)
Either you feel it, or not...

AEK

anladığım kadarıyla __delay_ms(1) ve __delay_us(1); harici kütüphane değil c nin kendi kütüphanesinde bulunan bir kod.
bunu mu kullanmak daha iyi olur yoksa arkadaşların dediği gibi mikrochipin kendi sitesindeki güncel kütüphaneler ya da kendi yazdığımız fonksiyonları kullanmak mı?