ARM TiMER CONTROL YARDIM

Başlatan taytis, 31 Mart 2011, 00:06:59

taytis

                     Arkadaşlar selam , aşağıdaki kodu derlediğimde periyot değeri kullanılmayacak diye warning alıyorum ,gerçektede while döngüsünde kullanamıyorum ,hata veriyor. İstediğim P0.2 clock girişini okumak istiyorum. periyot değeri 1 veya 0 değerine göre programı dallandırmak istiyorum.Yardımlarınız için teşekkür ederim.

(c#.net oludğu gibi public static int periyot ; olmam mı ? :)  ;))

'void T0isr(void) __irq;'  __irq' ne anlama geliyor. Tekrar teşekkürler.









#include <lpc21xx.h>


  void T0isr(void) __irq;
int main (void)

{
VPBDIV=0x00000002;
PINSEL0=0x00000020;     /* binary: 00000000_00000000_00000000_00100000 */
IODIR0=0x000007F8;     /* binary: 00000000_00000000_00000111_11111000 */
T0PR=0x00007530;
T0TCR=0x00000002;
T0CCR=0x00000005;
T0TCR=0x00000001;
IOSET0=0x00000000;
IOCLR0=0x00000000;
VICVectAddr4=(unsigned)T0isr;
VICVectCntl4=0x00000024;
VICIntEnable=0x00000010;
////////////////////////////
   while(1){
     }    }

void T0isr(void)   __irq
{
static int periyot;
periyot=T0CR0;
T0IR|=0x00000001;
VICVectAddr=0x00000000;


}

NaMcHo

Henüz Arm ler ile kesme uygulaması yapmadım ama sanırsam
void T0isr(void)   __irq Timer0 kesme fonksiyonu.

Ayrıca http://www.hitex.com/index.php?id=download-insiders-guides burada süper kaynaklar var.

taytis

Yönlendirme için teşekkürler , periyot değerini nasıl çekerim

taytis

Link için tekrar sağol ,nxp sitesine göre daha güzel dökümanlar daha anlaşılır.

Nedenler

ARM çekirdeğinde interruptlar iki türlüdür. Bunlar Fast Interrupt Request (__fiq) General Purpose Interrupt Request (__irq) şeklindedir. Adından da anlaşılabileceği gibi birisi hızlı kesmedir herhangi bir kesme fiq olarak belirlenebilir. Bu durumda kalan diğer kesmeler irq olacaktır. Bir bakıma öncelik ataması da denilebilir. Yukarıda ise "void T0isr(void)   __irq" satırında giriş ve dönüş değeri void olan yani olmayan timer 0 fonksiyonu irq olarak tanımlanıyor.

taytis

Teşekkür ederim nedenler , peki bu uygulama p0.2 clock sinyali veripte okumak istiyorum , if (periyot==1) dediğimde hata alıyorum , NEDEN ?

NaMcHo

#6
periyot değişkenini tanımlamamışsınız.

Düzeltme : Pardon değişkeni tanımladınığınızı.

taytis

void T0isr(void)   __irq
{
static int periyot;
periyot=T0CR0;

T0IR|=0x00000001;
VICVectAddr=0x00000000;


}

Nedenler

Neden periyodu 1 veya 0 olarak düşünüyorsun ki ?
P0.2 pinindeki haraketler timera milisaniye cinsinden yansıyacak. Her yükselen kenarda kontrol yapılacağı için eğer 1 ms okunduysa sen clock sinyalin iki yükselen kenarı arasındaki zamanın 1 ms olduğunu anlayacaksın. Bu yüzden periyot değişkeninde muhtemelen T0CR0 registerının değeri olan 32 bitlik bir değer okuyacaksın. Yaptığın ayarlamalara göre de (1ms olarak ayarlanmış) Okuduğun değer kadar ms geçmiş olacak. Yani timer her 1 ms de bir saydığından sen periyot değişkeninde 100 okuduğunda iki yükselen kenar arası 100 msdir diyeceksin.