lpc1768 timerı çalıştıramadım

Başlatan burakoz1989, 03 Mart 2013, 17:35:35

burakoz1989

Merhaba arkadaşlar yabancı bir siteden aldığım kodlarda bir sıkıntım var çalışmıyor acaba hata nerede
kodlar
#include "lpc17xx.h"

void TimerInit(void);

int main(void)
{
	
	LPC_SC->PCONP |= 1<<15;
	LPC_GPIO1->FIODIR |= 0xffffffff;          //GPIO1'İN tüm PİNLERİ ÇIKIŞ OLARAK AYARLANDI

	TimerInit();
	while(1)
	 {
	  LPC_GPIO1->FIOPIN |= 1 << 28; 
	 }
}

void TimerInit(void)
{
   LPC_SC->PCONP |= 1<<1;             //timer0 aktifleştirildi

   LPC_SC->PCLKSEL0 |= 1<<3;          //pll saat kaynağı CCLK/2 seçildi
   
   LPC_TIM0->MR0 |= 250*25000 ;      	  //1<<20 sayısı MR0 yazmacına yüklendi	(kesme zamanı timer sayacı ile MR0 eşitşendiğinde kesme oluşacak şekilde konfigure edildi)
   
   LPC_TIM0->MCR |=	1<<0;             //TC=MR0 OLDUĞUNDA KESME OLUŞACAK
   
   LPC_TIM0->TCR |= 1<<1;             //TİMER0 SAYICISI RESETLENİYOR

   NVIC_EnableIRQ(TIMER0_IRQn);	      //TİMER KESME FONKSİYONU AKTİFLEŞTİRİLİR

   LPC_TIM0->TCR |= 1<<0;             //TİMER SAYACI BAŞLATILIR
}


void TIMER0_IRQHandler (void)
{
        if((LPC_TIM0->IR & 0x01) == 0x01) 
        {
                LPC_TIM0->IR |= 1 << 0; // Kesme bayrağı resetleniyor
                LPC_GPIO1->FIOPIN ^= 1 << 29; // Toggle led
        }
}

mistek

Timer1 interrupt için yazmıştım çalışıyor buradan karşılatırabilirsiniz.
Şu satırı ekleyip denermisiniz.
LPC_TIM1 -> MCR |= 1 << 1;  	// Kesme olusturduktan sonra Timer Counteri sifirla


void interrupt_timer1(uint32_t timer_value)
{
		LPC_SC     -> PCONP    |= 1 << 2;   //Timer1 aktif
		LPC_SC     -> PCLKSEL0 |= 1 << 4; 	//Timer1 clock = PCLK=CCLK

		LPC_TIM1 -> PR   = 0x00;		// Timer1 Prescaler
    LPC_TIM1 -> MR0  = timer_value; // Timer1 karsilastirma hedef degeri
    LPC_TIM1 -> IR  |= 0xFF;		// Interrupt Register reset.

		LPC_TIM1 -> MCR |= 1 << 0;		// MR0=TC olunca kesme olustur.
		LPC_TIM1 -> MCR |= 1 << 1;  	// Kesme olusturduktan sonra Timer Counteri sifirla
		LPC_TIM1 -> TCR |= 1 << 1; 		// Timer Reset Zorla
    LPC_TIM1 -> TCR &= ~(1 << 1); 	// Sayiciyi sifirla durdur.
    NVIC_EnableIRQ(TIMER1_IRQn); 	// Timer kesmesini aç 	(Kesme adresini yükle)
    LPC_TIM1 -> TCR |= 1 << 0; 		// Timer baþlasýn.	
		return;
}
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

burakoz1989

#2
Hocam denedim ama mağlesef değişen bir şey yok :(


mesaj birleştirme:: 03 Mart 2013, 20:27:04

Muhammed hocam LPC_TIM0->TCR |= 1<<1; ile  LPC_TIM0 -> MCR |= 1 << 1; aynı şey değilmi

mistek

#3
Hayır değil şöyle değil.
TCR 1<<1 olduğunda timer kurulduktan sonra TC yi birkez resetler ve 0 olana kadar saymaya devam eder.
MCR 1<<1 olduğunda TC değeri ile sizin belirlediğiniz karşılaşma değerine geldiğinde interrupt vs bayrağı çekilir ve TC resetlenir. Eğer MCR nin ilgili bitini ayarlamazsanız resetlenmez. Datasheetten anladığım bu :)


boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

burakoz1989

farkı gayet iyi anladım hocam ama sorunu hala bulamadım

mistek

Led toggle satırını gecikme ile while içerisinde yaptığınızda çalışıyor mu?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

burakoz1989

ewt çalışıyor hocam denedim onu daha önce sıkıntı yok timerda bir şeyleri eksik yapıyorum galiba

buzkırıcı

main fonksiyonun üstüne
Timer interruptının fonksiyon başlığını eklede dene bi

"void TIMER0_IRQHandler (void);"
İmza Atmayı bilmem Parnak Bassam olur mu?

burakoz1989

hocam denedim değişen bir şey yok malesef :(

buzkırıcı

#9
projeyi gönderirmisin peki?
Kendi yazdığım timer örneğini vereyim, Bir bak

void timer(void)
{
	LPC_TIM1->IR=(1<<1);
	LPC_TIM1->TCR=2;
	LPC_TIM1->PR=0;
	LPC_TIM1->MR1=(CLKPWR_GetCLK(CLKPWR_CLKTYPE_CPU) / (LPC_SC->PCLKSEL));
	LPC_TIM1->MCR=(1<<3) | (1<<4);
	LPC_TIM1->TCR=1;
 	NVIC_EnableIRQ(TIMER1_IRQn);
}


Bir de İşlemciyi initialize ederken kendin registerlara değilde system_init() fonksiyonunu kullanarak.
İmza Atmayı bilmem Parnak Bassam olur mu?

burakoz1989

hocam sorunu sonunda buldum
LPC_TIM0->TCR |= 1<<1; 

kodunu çıkartıp  LPC_TIM0->MCR ye 0x03 değerini yükleyince sorunsuz çalıştı sonunda
anlamadığım şey MCR ye 0x01 değerini yükleyip TCR ye 1<< değerini yüklediğimde neden timera  reset atmıyor

haydarpasamikro

#11
Table 427. manual da.
The counters remain reset until TCR[1] is returned to zero.

Yani siz bu reset bitini 1 de tuttuğunuz sürece resetde durur. Tekrar 0 yapın ki resetten kurtulsun:)
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

burakoz1989

hocam çok sağolun ya halbuki gece kaç kere okudum yazmaçları görmemişim :D

haydarpasamikro

Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

fryrmnd

Yeni konu açmak istemedim.

void SysTick_Handler(void)
{
    STT_Value++;
}
 
void DelayMs(unsigned int t)
{
    unsigned long temp;
 
    temp = STT_Value;
    while ((STT_Value - temp) < t);
}


Şu kod parçasının biraz açıklamasını yapabilirmisiniz. Kafa basmadı maalesef. :-[ İşlemci sanki hiç delay den çıkmayacak gibi görüyorum. Temp sürekli STT_Value değerine eşit olmuyor mu?

Teşekkürler