* Kayıt Ol

* Oturum Aç

* Forum Kılavuzu

  
Sistem saati: 08 Eyl 2010, 09:44

Powarm.com » Forum anasayfası » Yazılım » KEIL, IAR,

Tüm zamanlar UTC + 2 saat [ DST ]


Timer Interrupt



Yeni konu gönder Konuya cevap yaz  1 sayfadan 1. sayfa
 [ 5 ileti ] 
  Yazıcı görüntüsü Önceki konu | Sonraki konu 
Yazar Mesaj
BrSmnc
 İleti başlığı: Timer Interrupt
İletiTarih: 30 Oca 2010, 04:17 
Üye

Kayıt: 30 Oca 2010, 03:58
İleti: 2
Merhaba arkadaşlar,
Arm işlemcileri programlamaya yeni başladım.Şuan proteus similasyon desteği veriyor diye lpc210X serisi işlemcileri programlamaktayım.Kullandığım derleyici keil uvision 4.02 evaluation version.Şuan timer lar ile ugraşıyorum ve bir sorunum var.Yazdığım kodda timer0 hedef sayıya ulaştığında kesme oluşturmasını istiyorum.Kesme fonksiyonundada P0.0 ın set edilip baglı olan ledin yanmasını istiyorum.Programı keil ile adım adım debug ederken timer 0 hedef sayıya ulaştıgında kesme oluşuyor fakat program kesme fonksiyonuna dallanmıyor main içindeki while döngüsünde saymaya devam ediyor.3 gündür data sheet okuyorum.Tüm saklayıcılar doğru.Yahoo lpc2000 grubuna üye oldum orayada sordum global kesmeleri startup kodundan aktif etmen gerekli dediler.Tek satırlık bi assembyl koduda koymuşlar fakat derleyicileri farklı oldugu için startup kodlarıda farklı ben keilde beceremedim.Yardımcı olabilecek olan varmı acaba?

main kodları aşağıda. startup ise strandart keilin projeye eklediği dosya
Kod:
#include <LPC21xx.H>

void T0isr(void)   __irq;

int main(void)
{
   int counter=0;
   
   VPBDIV      = 0x00000002;         // Configure the  VPB divi
                          
   T0PR               = 0x0000001;         //Load prescaler
   T0TCR       = 0x00000002;         //Reset counter and prescaler
   T0MCR       = 0x00000003;         //On match reset the counter and generate an interrupt
   T0MR0      = 14400;         //Set the cycle time
   T0TCR       = 0x00000001;         //enable timer
   
   VICVectAddr3 = (unsigned)T0isr;      //Set the timer ISR vector address
   VICVectCntl3 = 0x00000024;         //Set channel
   VICIntEnable |= 0x00000010;         //Enable the interrupt
   
   IODIR0=1;
   IOCLR0=1;
   
   while(1)
      counter++;
}

void T0isr (void)   __irq
{
   IOSET0=1;
   T0IR       |= 0x00000001;         //Clear match 0 interrupt
   VICVectAddr = 0x00000000;         //Dummy write to signal end of interrupt
}


 Profile bak  
 
Ziya
 İleti başlığı: Re: Timer Interrupt
İletiTarih: 30 Oca 2010, 14:28 
Müdavim
Kullanıcı avatarı

Kayıt: 23 Nis 2008, 17:20
İleti: 204
Konum: Ankara
Proteusa güvenme. Keilin simulatörüne de. Hele timer kullanıyorsan hiç güvenme (yapıyorsa ne ala). Ben de yakın zamanda ISIS e güvenip debug yapıyordum. Maalesef gerçek devrede çalışıyor, simulatörde çalışmıyor (kesmesiz timer örneğiydi benimki de).


 Profile bak  
 
BrSmnc
 İleti başlığı: Re: Timer Interrupt
İletiTarih: 31 Oca 2010, 00:14 
Üye

Kayıt: 30 Oca 2010, 03:58
İleti: 2
Yazdığın için teşekkür ederim.Arm işlemcilere geçmeye 1 hafta kadar önce karar verdim elimde hiç bir donanım olmadıgı içinde basit kodlar yazıp proteus ta simüle ediyorum. Led,buton,capture,uart gibi örnekleri yazıp simüle ettim.En son timer ile kesme örneği yapmaya çalıştım proteus ta çalışmadı.Keil de debug ederken saklayıcıların içeriğini kontrol ede ede adım adım debug yaptım tüm saklayıcılar kuruluyor.Kesmede doğru zamanda oluşuor fakat akış bir türlü isr ye girmiyor.Dediğim gibi lpc2000 forumlarında global kesmeleri startup.s dosyasından işlemciyi supervisor moduna sokup aktif etmen gerek demişler.Bi kaç kod göstermişler fakat derleyici farklı olduğu için assembly lerde farklı.4 5 gündür bu sorunla ugraşıyorum ama hala kesmeleri aktif hale getiremedim.Sadace timer değil ext kesmerleride çalışmıyor.


 Profile bak  
 
mezire
 İleti başlığı: Re: Timer Interrupt
İletiTarih: 02 Şub 2010, 01:45 
Üye

Kayıt: 04 Haz 2008, 20:22
İleti: 4
Keil`de yeni bir proje oluştururken startup kodunu eklemek isteyip istemediğini sorar.
Startup kodunu projeye eklersen, sistem ilk kez çalıştığında bu kod her şeyi ayarlar.
Yeni proje oluşturarak işe yeniden başlamanı tavsiye ederim.
Tabii startup.s dosyasını eklemeyi unutma.


 Profile bak  
 
uzun
 İleti başlığı: Re: Timer Interrupt
İletiTarih: 02 Mar 2010, 17:42 
Üye

Kayıt: 01 Mar 2010, 10:53
İleti: 1
arkadaslar bu örnek programda degısıklıkler yaptım ve tım2 için çalıstırdım ancak tım2clock =8mhz bu hiç degişmiyor ne yaptıysam degıstıremeedım...yardımcı olabılırsenız cok sevınırım bu timerlarda hangı osilatoru nasıl kullanıyoruz bu secımı nasıl yapıyoruz eger yardım edersenıs cok sevınırım...kafayı yemek üzereyim:)





Kod:
                 /*----------------------------------------------------------------------------
* Name:    Timer.c
* Purpose: Timer example. Prints a sting to UART2
* Notes:
*----------------------------------------------------------------------------*/
#include <stdio.h>
#include <stm32f10x_cl.h>


volatile unsigned long TimeTick;            /* counts 10ms timeTicks          */
unsigned char  clock_1s;                /* Flag activated each second         */


/******************************************************************************/
/*               Initialises the TIM3 for 1ms @ 72MHz                       */
/******************************************************************************/
void TIM2_Init (void) {

  RCC->APB1ENR |= (1<<0);                      /* enable clock for TIM3       */

  TIM2->PSC = 1;                              /* set prescaler               */
  TIM2->ARR = (0X2328);     /* set auto-reload             */
  TIM2->CR1 = 0;                               /* reset command register 1    */
  TIM2->CR2 = 0;                               /* reset command register 2    */
  TIM2->DIER = (1<<0);                         /* Update interrupt enabled    */
  TIM2->CR1 |= (1<<0);                         /* Enable Timer                */

  NVIC_EnableIRQ(TIM2_IRQn);                   /* enable TIM3 interrupt       */

}
void TIM2_IRQHandler (void) {

  if (TIM2->SR & (1<<0)) {                     /* UIF interrupt ?             */
         TimeTick++;
    if (TimeTick >= 999) {            /* Set Clock1s to 1 every 1 second    */
      TimeTick    = 0;
      clock_1s = 1;
  }
    TIM2->SR &= ~(1<<0);                       /* clear UIF flag              */
  }

}


/* Import external functions from Serial.c file                               */
//extern void init_serial (void);

/*----------------------------------------------------------------------------
  MAIN function
*----------------------------------------------------------------------------*/
int main (void) {                       /* Main Program                       */
  unsigned int leds =1;

  TIM2_Init();
 



  while (1) {                           /* Loop forever                       */
    if (clock_1s) {
      clock_1s = 0;
     if(leds>0x8000) leds=1;
         GPIOB-> ODR=(leds);
          leds<<=1;
     
    }
  }
}


 Profile bak  
 
Önceki iletileri göster:  Sıralama  
Yeni konu gönder Konuya cevap yaz  1 sayfadan 1. sayfa
 [ 5 ileti ] 

Powarm.com » Forum anasayfası » Yazılım » KEIL, IAR,

Tüm zamanlar UTC + 2 saat [ DST ]


 Kimler çevrimiçi

Bu forumu görüntüleyenler: Kayıtlı kullanıcı yok ve 1 misafir


Bu forumda yeni konular açamazsınız
Bu forumda konulara cevap yazamazsınız
Bu forumda kendi iletilerinizi değiştiremezsiniz
Bu forumda kendi iletilerinizi silemezsiniz

Git:  
 

Valid CSS!

Valid XHTML 1.0 Transitional
Powered by phpBB Group
phpBB3 Türkçe: phpBB Türkiye