LPC2104 ve Proteus Problemi

Başlatan fatihinanc, 08 Eylül 2010, 16:02:09

fatihinanc

hocam ben de bilmiyordum ama keilden aratınca delayfun.c adlı dosyayı buldum.

kod
/* Signum Systems Demo - delay function                    (Ver 1.00) */

int delaycnt = 5;    /* small value (for better ETM trace demo)       */

int delaytemp = 0;   /* temporary - to add processing to load CPU     */

int delay1(int v)    /* this function will will assure more CPU load  */
{
  delaytemp = v;
  return v;
}

int delay(int cnt)   /*************** delay function ******************/
{
  int i, j;	  /* loop counters                                    */
  int k;          /* dummy local variable (just to kill loop time)    */

  k = 0;	
  for (i = 0; i < cnt; i++) {
    for (j = 0; j < delaycnt; j++) {
      k = k + delay1(j);     /* some processing to kill more time     */
    }
  }

  return k;
}


bir de basit olarak komut sayılından hesaplanıp ona göre for döngüsü kullanılır.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

teknikelektronikci

Alıntı yapılan: fatihinanc - 08 Eylül 2010, 23:41:59
hocam ben de bilmiyordum ama keilden aratınca delayfun.c adlı dosyayı buldum.

kod
/* Signum Systems Demo - delay function                    (Ver 1.00) */

int delaycnt = 5;    /* small value (for better ETM trace demo)       */

int delaytemp = 0;   /* temporary - to add processing to load CPU     */

int delay1(int v)    /* this function will will assure more CPU load  */
{
  delaytemp = v;
  return v;
}

int delay(int cnt)   /*************** delay function ******************/
{
  int i, j;	  /* loop counters                                    */
  int k;          /* dummy local variable (just to kill loop time)    */

  k = 0;	
  for (i = 0; i < cnt; i++) {
    for (j = 0; j < delaycnt; j++) {
      k = k + delay1(j);     /* some processing to kill more time     */
    }
  }

  return k;
}


bir de basit olarak komut sayılından hesaplanıp ona göre for döngüsü kullanılır.


hocam zamaninda gecikme icin for döngüsü ile cok ugastim yok makina saykili bul araya nop lar koy heleki asm ile yazinca djnz v.s sirf gecikme hesaplayabilmek icin excell tablolari olsun özel progralar olsun buldum ama cok ugrastirici ve biktirici yani ben almayayim böyle hazir komutlar olsun canimi yesin ki hazir komut derken gene var olan c programinda degiskeni degistiriyoruz sanirsam :)
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

fatihinanc

evet öyle ama en sağlıklı olanı da asm dir hocam bence.
şöyle birşeyler buldum nette biraz araştırıp.
http://www.keil.com/forum/2938/
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

CLR

Alıntı yapılan: teknikelektronikci - 08 Eylül 2010, 23:44:19
Alıntı yapılan: fatihinanc - 08 Eylül 2010, 23:41:59
hocam ben de bilmiyordum ama keilden aratınca delayfun.c adlı dosyayı buldum.

kod
/* Signum Systems Demo - delay function                    (Ver 1.00) */

int delaycnt = 5;    /* small value (for better ETM trace demo)       */

int delaytemp = 0;   /* temporary - to add processing to load CPU     */

int delay1(int v)    /* this function will will assure more CPU load  */
{
  delaytemp = v;
  return v;
}

int delay(int cnt)   /*************** delay function ******************/
{
  int i, j;	  /* loop counters                                    */
  int k;          /* dummy local variable (just to kill loop time)    */

  k = 0;	
  for (i = 0; i < cnt; i++) {
    for (j = 0; j < delaycnt; j++) {
      k = k + delay1(j);     /* some processing to kill more time     */
    }
  }

  return k;
}


bir de basit olarak komut sayılından hesaplanıp ona göre for döngüsü kullanılır.


hocam zamaninda gecikme icin for döngüsü ile cok ugastim yok makina saykili bul araya nop lar koy heleki asm ile yazinca djnz v.s sirf gecikme hesaplayabilmek icin excell tablolari olsun özel progralar olsun buldum ama cok ugrastirici ve biktirici yani ben almayayim böyle hazir komutlar olsun canimi yesin ki hazir komut derken gene var olan c programinda degiskeni degistiriyoruz sanirsam :)


Merhaba,

Keilin içinde debug/simulatör kısmı var, burada yazdığın delay'in nekadar zaman harcadığını real time olarak bulabilirsin. Detaylar için help kısmını oku ve biraz kurcala anlayacaksın.
Asm ile falan uğraşmayın boşuna çünkü 60mhz'de çalıştırıyorsunuz işlemciyi bir kaç fazla veya eksik komutun delay'de önemi yok.

Zaten tam ve net zaman istiyorsanız timer ve interrupt kullanmanız gerekir. Manuel delay ile tam zaman elde edemezsiniz, tam zamanı elde etsenizde yazılımınızı daha geliştirdiğinizde interruptlar devreye girecektir ki o zaman nerdeyse hiç manuel delay kullanmıyacağınızı göreceksiniz.
Manuel delay işlemciyi boşuna döndürmekten başka bişeye yaramaz.
   
Knowledge and Experience are Power

XX_CİHAN_XX

#19
Ben kendimce delay için 2 tane fonksiyon yazdım. 12MHz dede test ettim. Birebir tutmasa da çok yakın değerlerde zamanı tutturuyorum . Ancak keilin kendi simulatorunde bakmadım. İsisin osilaskopu ile inceledim. O nedenle zamanlamalar da belki biraz daha kayıklık olabilir. Simulasyon ile test edipte sonucu yazan olursa ona göre editleme de yapabiliriz. Kodlar şu şekilde:
#include <LPC21XX.h>
#include "delay.h"

#define	PFREQ	12000000	//processor frequancy
#define	FVAL	PFREQ / 35000

//bu alt program 0 degeri girildiginde 12uS gecikme yapar.
//min. 1mS, max. 65535mS gecikme yapar.
void DelayMs (unsigned int d)
{
	unsigned long x;
	while(d--) for(x=FVAL; x!=0; x--);
}
//---------------------------------------------------------
//bu alt program 0 dan 15 e kadar girilen her deger icin,
//sabit 15uS gecikme olusturur.
//min. 15uS, max. 255uS gecikme yapar.
void DelayUs (unsigned char d)
{
	if(d>0x1F)
		d = d >> 2;
	else if(d<0x10)
		d = d >> 4;
	else
		d = d >> 3;
	while(d--);
}


//Kullanim sekli (örnek)
DelayMs(25);	//25ms gecikme yapar
DelayMs(1750);	//1750ms gecikme yapar
DelayUs(173);	//173us gecikme yapar
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

ahmet2004

Alıntı Yap
Zaten tam ve net zaman istiyorsanız timer ve interrupt kullanmanız gerekir. Manuel delay ile tam zaman elde edemezsiniz, tam zamanı elde etsenizde yazılımınızı daha geliştirdiğinizde interruptlar devreye girecektir ki o zaman nerdeyse hiç manuel delay kullanmıyacağınızı göreceksiniz.
Manuel delay işlemciyi boşuna döndürmekten başka bişeye yaramaz.

Arkadaşlar olması gereken eemkutay'ın tamda yazdıkları gibi direkt daldınız delay'a hemen for..next bence yanlış yapılıyor.

Lpc1768 in PDFsinden LPC17xx System Tick Timer kısmını çok iyi inceleyin örnekleri çokça var.İşe doğrusu ile başlayın.





teknikelektronikci

#21
hocam bu nxp nin sayfasinda bir ara  short_delayMs(2000) gibi bir örnek görmüsdüm bunun oldugu header file i bulmaya calisyorum sizin bilginiz varmi dikatinizi cektimi hic ?
edit:
linkteki örnekde var bunu bulmaya calisiyorum

http://ics.nxp.com/support/documents/microcontrollers/pdf/lpcxpresso.getting.started.pdf

edit2:

// Function to provide short delay
void short_delay (int n) __attribute__((noinline));
void short_delay(int n)
{
   volatile int d;
   for (d=0; d<n*3000; d++){}
}

Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

fatihinanc

evet startup.s dosyasında da böyle gözüküyor.

Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

X-Fi

uzun uğraşlarım sonucunda uartı çalıştırdım kodları ekledim benim gibi takılanlar için yardımcı olacaktır.




keil uVision4
arm 412

http://rapidshare.com/files/418473382/ARM_uart.rar
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

X-Fi

FxDev senin kitabın çıkmış olsa hepimize lazım olacak tanıma işlemlerini atlamış olacağız rtc ile ilgli bölümde olacakmı beni en çok o özelliği cezbediyor pekçok programda kullanacağım.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

teknikelektronikci

@x_fi

üstad serial ve lcd kütüphanlerini sizmi yazdiniz? cok güzel olmus elinize saglik
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

fatihinanc

#26
@X_Fi
@FxDev
Arkadaşlar tebrikler elinize sağlık.

Benim de bayramda pek vaktim olmadı ama Timer0 için 1ms'lik gecikme rutini yazabildim.
Kodları ekliyorum.
Üstadlar acaba bu kod nasıl daha sağlıklı getirilebilir onu da sormuş olayım bu vesileyle.
#include<LPC210x.h>

volatile long zaman=0;
void timerkesmesi(void)__irq;
void delay_ms(unsigned char);

int main(void)
{
	int i=1,j=1;
	//GPIO Ayarlari Yapiliyor...
	IODIR=255;
	//Timer0, 1 Ms Icin Hazirlaniyor...
	T0MR0=11999;
	T0MCR=3;
	T0TCR=0;
	//Timer0 Kesmesi Icin VIC Ayarlari Yapiliyor...
  	VICVectAddr0 = (unsigned)timerkesmesi;          
  	VICVectCntl0 = 36;                     
  	VICIntEnable = 16;  

	while(1)
	{
	delay_ms(50);
	IOSET=i;
	j<<=1;
	i+=j;
	if(i>255)
	{
	j=1;
	i=255;
	do
	{
	delay_ms(50);
	IOCLR=~i;
	i-=j;
	j<<=1;
	}
	while(i>-1);
		j=1;
		i=1;
	}
	}
}
void timerkesmesi(void)__irq
{	
	zaman++;	
	T0IR=1;
	VICVectAddr=0;
}
void delay_ms(unsigned char gelen)
{
 	T0TCR=1;
        zaman=0;
	while(zaman!=gelen);
	T0TCR=0;
}


Ek : Kod düzleltildi.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

computerboy

arkadaşlar proteusda lpc2148 yada daha üst versiyonları yokmu internetten model dosyasınıda aradım ama bulamadım bu arada hepinizin ramazan bayramı mübarek olsun.


Brsmnc

Arkadaşlar hepinizin bayramı mübarek olsun,

Fatih yazdığın kodda hata var. delay_ms fonksiyonu içerisinde "zaman=0" satırını while döngüsünün üzerine alman gerek. aksi halde zaman, fonksiyona geçtiğin 50 değerini geçerse eğer taşıp tekrar 50 ye gelene kadar beklersin.Zaman değişkeni kesme içerisinde bağımsız olarak artıyor,örneğin zaman değişkeninin 60 a geldiğinde delay_ms(50) ile fonksiyonu çağırırsan zaman değişkeni yaklaşık 4 milyar sayım yaptıktan sonra taşıp 50 ye gelir.

Ama mantık olarak yaklaşmışsın. Gerçek zamanlı sistemlerde bekleme yapılmaz, görev zamanlanır. Çoğu kişi bu işe PIC ler ile girdiğinden ve ordaki uygulamaların genelde sade oluşundan dolayı firmaların sağladığı bekleme komutları idare ediyor.Bu yöntemin avantajı kullanımının kolay olması, dezavantajı bekleme yaparken işlemcinin başka bir iş yapamamasıdır.Periyodik olarak yapılması gereken çok önemli görevler varsa biz işlemciyi eli kolu bağlı bekletirken görevler aksar ve sistemimiz çalışmaz hale gelebilir.

Bu yüzden en basitinden birtane unsigned long değişken tanımlayın, birtane timer kurup isr içerisinde sadece tick sayısını tutan değişkeninizi arttırın.Kod içerisindede yerel bir değişken tanımlayın ve içeriğine ticksayısı+beklemek istediğiniz zamanı atayın. Bunuda bir if ile kontrol ettirin. Bu sayede işlemciyi kilitlememiş olursunuz ve istediğiniz görev zamanı geldiğinde çalışır.Buna multitasking denir ve bir çok görevin bir arada çalışması sağlanır. Ayak üstü aşağıya bir kod yazıyorum. Mantığı anlayıp kendinize uyarlayabilirsiniz.Aşağıda örneğimde iki görev olduğunu varsaydım Görevlerden birtanesi 500ms de bir tekrarlanır, diğeri ise 2 saatte bir tekrarlanır.

//Bir saniyedeki ve saatteki tick sayısı
#define SANIYE 1000
#define SAAT 3600 * SANIYE

//Kesme içerisinde içeriğini arttıracağımız sistemin tick sayısını tutan değişken
unsigned long tick;

//Sisteme o anki tick sayısını veren fonksiyon.
unsigned long tick_get(); // fonksiyonda yukarıdaki tick değişkeninin değerini geri dön, yada tick değişkenini global olarak tanımlayıp değerini dönen bir makro yap.


void kesme_fonksiyonu(void) _irq
{
tick++;
//Diğer işlemleri yap
}

main()
{
unsigned long t,t2;
t=tick_get()+SANIYE/2;
t2=tick_get()+SAAT *2;

for(;; ) { //Sonsuz döngü

if(tick_get() >= t)
{
//Zamanladığın görevleri burada çalıştır
t=tick_get()+SANIYE/2;//Çıkarken bir sonraki işlem için zamanı güncelle
}

if(tick_get() >= t2)
{
//Zamanladığın görevleri burada çalıştır
t2=tick_get()+SAAT*2;//Çıkarken bir sonraki işlem için zamanı güncelle
}

//.. İşlemci buradaki kodları bekleme yapmadan çalıştırır. Yukarıdaki işlemler zamanı geldiğinde yapılır.

}//For
}//Main


Kontrol işlemini şu şekildede yapabilirsin
if(tick_get() - t >=SANIYE/2)
{
t=tick_get();
//Yapılacak diğer işlemler
}

Bu yöntem çok daha iyi çalışır, ama çok hassas bir şekilde saat, gün, hafta, yıl gibi uzun süreli görevler zamanlıcaksan RTC kullanmalısın.Böyle bi yazı sitemede yazayım bari :)

@computerboy
Zamandan tam emin değilim ama 2 seneye yakındır aynı işlemciler var.

X-Fi

Alıntı yapılan: teknikelektronikci - 11 Eylül 2010, 23:24:05
@x_fi

üstad serial ve lcd kütüphanlerini sizmi yazdiniz? cok güzel olmus elinize saglik

evet murat bana ait FxDev inde söylediği gibi nxp nin kütüpanesi baya geniş kendim için hazır hale getirdim başkalarıda kullanabilir.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)