Pll, lpc1769 da keil sorunu?

Başlatan buzkırıcı, 25 Kasım 2011, 17:53:13

buzkırıcı

void aktif_pll(void)
	{
	
	   PLL0CFG = 0x13;
	   PLL0CON = 0x01;
	   PLL0FEED = 0xAA;
	   PLL0FEED = 0x55;
	   
	 while(!(PLL0STAT % 0x00000400))
	 ;
	 
	 PLL0CON=0x03;
	 PLL0FEED=0xAA;
	 PLL0FEED = 0x55;  

	}

burada direk keil PLL0 bağlantılarının hiçbirini tanımıyor. Nasıl çözüceğimi bulamadım..

main.c(8): error:  #20: identifier "PLL0CFG" is undefined
main.c(9): error:  #20: identifier "PLL0CON" is undefined
main.c(10): error:  #20: identifier "PLL0FEED" is undefined
İmza Atmayı bilmem Parnak Bassam olur mu?

yamak

komutların başına LPC_SC-> ekleyerek denetyin. Örnek:"  LPC_SC->PLL0CFG = 0x13; "

MC_Skywalker

pll için yazmış olduğum şu örneği inceleye bilirsin.
komut sonlarına açıklayıcı bilgiler ekledim.

#include <LPC17xx.H>

void activate_PLL(void)
{
    LPC_SC->SCS=0x20;				                 //System Control and Status R/W 0 0x400F C1A0 5. bit 1 yapılıp xtal osc (main) aktif ediliyor
										//OSCRANGE 4.bit  0 ise 1Mhz ile 2Mhz arası 1 ise 15Mhz ile 25Mhz arası    
										//OSCEN 5.bit	0 ise devredışı 1 ise xtal uçlarına bağlı kristali kullanır
										//OSCSTAT 6.bit	0 ise osilatör hazır değil 1 ise osilatör hazır (sadece okunur)
    LPC_SC->CLKSRCSEL=0x01;				//select main oscilator	CLKSRCSEL 2 bit uzunluğunda
										//00 iç RC kaynağı osilatör olarak seçilmiş
										//01 ana osilatörü PLL0 için kaynak seç							  
										//10 iç RTC (geröek zaman saati) osilatör olarak seç
										//11 bu durum kullanımaz rezerve edilmiş bir değerdir.
    LPC_SC->CCLKCFG=0x03;				//pllclk/4
    LPC_SC->PLL0CON=0x01;				//pll activeted
    LPC_SC->PLL0CFG=0x20031; 			//msel=49,nsel=2;
    LPC_SC->PLL0FEED=0xAA;				//pll i beslemek için yazılmalı datasheet te belirtiyor
    LPC_SC->PLL0FEED=0x55;				//önce 0xAA sonra 0x55 yüklenir
    while(!(LPC_SC->PLL0STAT&(1<<26)));
    LPC_SC->PLL0CON=0x07;
    LPC_SC->PLL0FEED=0xAA;				//pll i beslemek için yazılmalı datasheet te belirtiyor
    LPC_SC->PLL0FEED=0x55;				//önce 0xAA sonra 0x55 yüklenir
    LPC_SC->PCLKSEL0=0;
}

// Gecikme Fonksiyonu 
void Gecikme(long int sure)
{										 
long int i,k;							// 16 bitlik i degiskeni tanimlaniyor.
for (i = 1; i<=sure; i++) 				// girilen deger i degiskeninden büyük olana kadar for içerisinde dön
	{
		for (k = 0; k <= 12000; k++)	// burada ki değer  lpc2138 için olan programdan geliyor lpc1768 için güncellecek
		{}
	}
}
// Ana Fonksiyon
int main(void) 
{
	SystemInit ();     	 										// ilk ayarlar yapılıyor
		
	
	LPC_GPIO1->FIODIR0 = 0x00000001;	 						//giris cikis ayarlama komutu 1 cikis 0 giris
	LPC_GPIO1->FIOCLR0 = 0x00000001;							// 1. biti cikis digerleri giris
	
	activate_PLL();	

		while (1) 
			{													//sonsuz döngü
				
				LPC_GPIO1->FIOSET0 = 0x00000001; 				//1. biti 1 yap
				Gecikme(500); 									//bekleme yap (yaklasik 500 msn - 12Mhz de)
				LPC_GPIO1->FIOCLR0 = 0x00000001; 				//1. biti 0 yap
				Gecikme(500); 									//bekleme yap (yaklasik 500 msn - 12Mhz de)
	        }
}

buzkırıcı

başına lpc_sc-> yazınca oldu teşekkürler..
Hocam sizin örneğide inceledim. konuyu açarken bakmamıştım sonradan gördüm. Sizin örnek ile ilgili sorulrımada sizin açtığınız başlıkta yazıyorum..
Teşekkürler...
İmza Atmayı bilmem Parnak Bassam olur mu?

buzkırıcı

konu açmayayım dedim. lcd bağlamaya çalışıyorumda...

lcd_komut(0x1);

void lcd_komut(unsigned char c)
{
LCD_DATA_OUT((c>>4)&0x0F);
}
void LCD_DATA_OUT(unsigned char x)
{
	LCD_GPIO->FIOCLR |=  (1<<D4)|(1<<D5)|(1<<D6)|(1<<D7); 
	LCD_GPIO->FIOSET = ((x&0x01)<<D4)|(((x>>1)&0x01)<<D5)|(((x>>2)&0x01)<<D6)|(((x>>3)&0x01)<<D7);
}


ben burayı anlamadım kafayı kırmak üzeriyim.
İmza Atmayı bilmem Parnak Bassam olur mu?

yamak

Anlamadığınız yer tam olarak neresi.

buzkırıcı

0x1 orada 4 bit sağa kaydırdığımız zaman 0x00 olmuyor mu 0x0f ile and lediğmiz zaman 0x00 çıkmıyor mu?

LCD_GPIO->FIOSET = ((x&0x01)<<D4)|(((x>>1)&0x01)<<D5)|(((x>>2)&0x01)<<D6)|(((x>>3)&0x01)<<D7);


burada tam olarak ne yapmaya çalışıyor??
İmza Atmayı bilmem Parnak Bassam olur mu?

yamak

mesela x="1011" olsun.ilk olarak bunun x&0x01 işlemi ile 0. biti alınıyo ve 4 bit sola kaydırılıyo.sonraki işlemle 1 bit sağa kaydırılıp yine 0.biti alınıyo sonra 5 bit sola kaydırılıyo.daha sonra yine aynı şekilde 0.bit alınıp 6 bit sola kaydırılıyo sonra da son kalan bit alınıp 7 bit sola kaydırılıyo.

buzkırıcı

adc örneği yapayım lcd ye yazdırayım dedim. Keil derlerken herhangi bir problem çıkartmıyor. ama lcd de gözükmüyor. muhtemelen mantık hatası yaptım ama çözemedim. cclk=12mhz  adc_clk=12mhz. adc çalışıyor mu onuda anlamadım gpio2 deki ledlerden çıkışta alamıyorum.
Kodlar:

main.c
#include <LPC17xx.h>
#include <stdio.h>
#include "lcd.h"
#include "delay.h"
#include "adc.h"


void TIMER1_IRQHandler(void) //timer kesmesi
{
    uint32_t gerilim,kusurat,tam;
    char f[10]=" ";
    LPC_TIM1->IR=0xFF;;
    gerilim=adc_sonuc_al();
    tam=gerilim/1000; // mv değeri volt'a dönüştürülüyor.
    kusurat=gerilim%1000;
    kusurat=kusurat/10;
		   

    LPC_GPIO2->FIOPIN=tam; //gerilimin tam kısmı Port2 deki ledlerde gözlemkeniyor.
    sprintf(f,"%d",tam);
	//sprintf(f,"%d,%d v\n\r",tam,kusurat);
	lcd_yaz(f);
    //send_string(f); // gerilim değeri uarttan gönderiliyor.
}
void timer_init(void)
{
    LPC_TIM1->TCR=0x02;//reset timer
    LPC_TIM1->IR=0xFF;//tüm kesmeleri restle
    LPC_TIM1->MR0=250*25000;//timer1 250ms'de bir kesme oluşturacak şekilde ayarlanıyor.
    LPC_TIM1->MCR=3;//timer counter MR0 değerine eşit olduğunda kesme oluşturuluyor ve MR0 resetleniyor.
    LPC_TIM1->TCR=0x01;//start timer
    LPC_TIM1->PR=0x00;//prescalar deger.Örnegin 2 oldugun her 3 tick de bir sayar.
    NVIC_EnableIRQ(TIMER1_IRQn);// Timer1 kesmesi aktifleştiriliyor.
}

int main(void)
{	  
SystemInit();
   
    LPC_GPIO0->FIODIR = 0xFFFFFFFF;  // GPIO'ların hepsi çıkış oluyor
	 LPC_GPIO0->FIOSET = 1<<15;
	
	lcd_init();
    adc_init();
    timer_init();
    
	LPC_GPIO2->FIODIR=255;
    LPC_GPIO2->FIOCLR=255;
    while(1)
    {
    }
}


adc.c
#include <lpc17xx.h>
#include "adc.h"

void adc_init(void)
{
	LPC_PINCON->PINSEL3 &= ~(3UL<<30);
	LPC_PINCON->PINSEL3 |=(3UL<<30); //p1.30.adc pini olarak ayarlanıyo.
	LPC_PINCON->PINMODE3=1<<29;// p1.30 neither pull up nor pull down modunda.
	LPC_SC->PCONP |=1<<12;//adc birimi aktif ediliyor(Power up moduna getiriliyor).
	LPC_ADC->ADCR=1<<5|1<<8|1<<21;	//5.kanal seçiliyor,adc_clk_freq ayarlanıyor,Adc power down modundan çıkarılıyor,
 
}
uint32_t adc_hesapla(void)
{
	uint32_t sonuc;
	while(!(LPC_ADC->ADDR5&(1UL<<31)));	//Çevrim bitene kadar bekleniliyor
	sonuc=LPC_ADC->ADDR5;
	return((sonuc>>4)&0xFFF);
}
void adc_basla(void)
{
	LPC_ADC->ADCR |=(1<<24);
}
void adc_dur(void)
{
	LPC_ADC->ADCR &=~(1<<24);
}

uint32_t adc_sonuc_al(void)
{
	uint32_t hesap;
	adc_basla();
	hesap =adc_hesapla();
	adc_dur();
	hesap=((hesap*3300)/(4096));
	return(hesap);
 }


lcd.c

#include <LPC17xx.h>
#include "lcd.h"
#include "delay.h"

#define SPECIAL_CHAR	1

unsigned char special_char_1[8]={0x00,0x11,0x11,0x11,0x19,0x16,0x10,0x00};
//unsigned char special_char_2[8]={0x1F,0x11,0x15,0x11,0x17,0x11,0x1F,0x1F};
//unsigned char special_char_3[8]={0x1F,0x1B,0x1F,0x11,0x1B,0x11,0x1F,0x1F};
//unsigned char special_char_4[8]={0x1F,0x1F,0x11,0x17,0x13,0x17,0x1F,0x1F};
//unsigned char special_char_5[8]={0x1F,0x13,0x15,0x15,0x15,0x13,0x1F,0x1F};
//unsigned char special_char_6[8]={0x1F,0x13,0x15,0x15,0x15,0x13,0x1F,0x0};
//unsigned char special_char_7[8]={0x1F,0x13,0x15,0x15,0x15,0x13,0x1F,0x0};
//unsigned char special_char_8[8]={0x1F,0x13,0x15,0x15,0x15,0x13,0x1F,0x0};

void lcd_busy(void)
{
    DelayUs(200);
}

void LCD_DATA_OUT(unsigned char x)
{
	LCD_GPIO->FIOCLR |=  (1<<D4)|(1<<D5)|(1<<D6)|(1<<D7); 
	LCD_GPIO->FIOSET = ((x&0x01)<<D4)|(((x>>1)&0x01)<<D5)|(((x>>2)&0x01)<<D6)|(((x>>3)&0x01)<<D7);
}


void lcd_komut(unsigned char c)
{
	LCD_RS(0)
	LCD_E(1)
	LCD_DATA_OUT((c>>4)&0x0F);	
    LCD_E(0)
    lcd_busy();
	
	LCD_E(1)
	LCD_DATA_OUT(c&0x0F);	
    LCD_E(0)
    lcd_busy();
}

void veri_yolla(unsigned char c)
{
	LCD_RS(1)
	LCD_E(1)
	LCD_DATA_OUT((c>>4)&0x0F);	
    LCD_E(0)
    lcd_busy();
	
	LCD_E(1)
	LCD_DATA_OUT(c&0x0F);	
    LCD_E(0)
    lcd_busy();
}

void lcd_clear(void)
{
    lcd_komut(0x1);
    DelayMs(5);
}

void lcd_yaz(const char *s)
{
	lcd_busy();
	while(*s)
		veri_yolla(*s++);
}

void lcd_gotoxy(unsigned char x,unsigned char y)
{
    if(x==1)
        lcd_komut(0x80+((y-1)%sutun));
    else
	lcd_komut(0xC0+((y-1)%sutun));
}

void special_char(void)
{
	char i;
	if(SPECIAL_CHAR>=1){for(i=0x40;i<=0x47;i++)	{lcd_komut(i);veri_yolla(special_char_1[i-0x40]);}}
	if(SPECIAL_CHAR>=2){for(i=0x48;i<=0x4F;i++)	{lcd_komut(i);veri_yolla(special_char_1[i-0x48]);}}
	if(SPECIAL_CHAR>=3){for(i=0x50;i<=0x57;i++)	{lcd_komut(i);veri_yolla(special_char_1[i-0x50]);}}
	if(SPECIAL_CHAR>=4){for(i=0x58;i<=0x5F;i++)	{lcd_komut(i);veri_yolla(special_char_1[i-0x58]);}}
	if(SPECIAL_CHAR>=5){for(i=0x60;i<=0x67;i++)	{lcd_komut(i);veri_yolla(special_char_1[i-0x60]);}}
	if(SPECIAL_CHAR>=6){for(i=0x68;i<=0x6f;i++)	{lcd_komut(i);veri_yolla(special_char_1[i-0x68]);}}
	if(SPECIAL_CHAR>=7){for(i=0x70;i<=0x77;i++)	{lcd_komut(i);veri_yolla(special_char_1[i-0x70]);}}
	if(SPECIAL_CHAR>=8){for(i=0x78;i<=0x7F;i++)	{lcd_komut(i);veri_yolla(special_char_1[i-0x78]);}}
	lcd_komut(BirinciSatir);
}

void lcd_enable(void)
{
    LCD_E(1)
	DelayUs(1);
	LCD_E(0)
}
	
void lcd_init()
{
    LCD_DATA_OUT(0);
	
    DelayMs(100);
    lcd_komut(0x03);
    DelayMs(10);
    lcd_enable();
    DelayMs(10);
    lcd_enable();
    lcd_komut(0x02);
    DelayMs(20);

    lcd_komut(0x28);
    lcd_komut(SagaYaz);
    lcd_komut(ImlecGizle);
    lcd_clear();
    special_char();
    lcd_komut(BirinciSatir);
}


adc.h
#ifndef __ADC_H
#define __ADC_H
void adc_init(void);
uint32_t adc_hesapla(void);
void adc_basla(void);
void adc_dur(void);
uint32_t adc_sonuc_al(void);
#endif


delay.h
#define FOSC   32                       // MHz
#define MUL_1  FOSC/2
#define MUL_2  ((1000*(FOSC/2))/64)

extern void DelayUs(int u);             // max. 4095
extern void DelayMs(unsigned int m);    // max. 255


lcd.c
#define LCD_GPIO	LPC_GPIO0
#define RS	  	9
//#define RW		2
#define E		               8
#define D4		7
#define D5		6
#define D6		5
#define D7		4

#define LCD_RS(x)			((x) ? (LCD_GPIO->FIOSET |= (1<<RS))  : (LCD_GPIO->FIOCLR = (1<<RS)) );
//#define LCD_RW(x)			((x) ? (LCD_GPIO->FIOSET |= (1<<RW))  : (LCD_GPIO->FIOCLR = (1<<RW)) );
#define LCD_E(x)    		((x) ? (LCD_GPIO->FIOSET |= (1<<E ))  : (LCD_GPIO->FIOCLR = (1<<E )) );

#define sutun		 16		// Kaç sütun oldugu bilgisi

/* LCD'de kullanilan komutlarin tanimlamasi*/
#define Sil 		 1		// Ekrani temizler
#define BasaDon 	 2		// Imleci sol üst köseye getirir
#define SolaYaz 	 4  	// Imlecin belirttigi adres azalarak gider
#define SagaYaz 	 6   	// Imlecin belirttigi adres artarak gider
#define ImlecGizle	 12		// Göstergeyi ac, kursor görünmesin
#define ImlecAltta	 14		// Yanip sönen blok kursor
#define ImlecYanSon	 15		// Yanip sönen blok kursor
#define ImlecGeri	 16		// Kursorü bir karakter geri kaydir
#define KaydirSaga	 24		// Göstergeyi bir karakter saga kaydir                   
#define KaydirSola   28		// Göstergeyi bir karakter sola kaydir   
#define EkraniKapat	 8		// Göstergeyi kapat (veriler silinmez)
#define BirinciSatir 128	// LCD'nin ilk satir baslangic adresi       
                          	// (DDRAM adres)
#define IkinciSatir  192	// Ikinci satirin baslangic adresi
#define KarakUretAdres 64	// Karakter üreteci adresini belirle  
                          	// (CGRAM adres)
#define CiftSatir4Bit  40	// 4 bit ara birim, 2 satir, 5*7 piksel

void veri_yolla(unsigned char);
void lcd_clear(void);
void lcd_yaz(const char * s);
void lcd_gotoxy(unsigned char x, unsigned char y);
void lcd_init(void);
void lcd_komut(unsigned char c);


delay.c
#include <LPC17xx.h>
#include "delay.h"

void DelayUs(int u)             // 4095us bekleme en fazla
{
	LPC_TIM0 -> IR  = 1;		// Interrupt flagi temizleniyor
	LPC_TIM0 ->	CCR = 0;		// Timer modu
	LPC_TIM0 -> PR  = 0;   		// Prescaler oranı 0
	LPC_TIM0 -> MR0 = 10*u;		// 1us için 12-1=11 yükleniyor
	LPC_TIM0 ->	MCR	= 3;		// MR0 TC ile esitlendiginde kesme olusacak ve TC degeri resetlenecek
	
	LPC_TIM0 -> TC  = 0;		// Timer calistiriliyor
	LPC_TIM0 -> TCR = 1;		// Timer calistiriliyor

	while(!(LPC_TIM0 -> IR==1));
	LPC_TIM0 -> TCR = 0;		// Timer durduruluyor
}

volatile unsigned long STT_Value;
 
void SysTick_Handler(void)
{
    STT_Value++;
}

void DelayMs(unsigned int m)
{
    unsigned long temp;

    temp = STT_Value;
    while ((STT_Value - temp) < m);
}
İmza Atmayı bilmem Parnak Bassam olur mu?

buzkırıcı

yukarıda yazmış olduğum problemde yardım edicek yok mu? çalıştıramadım birtürlü..
İmza Atmayı bilmem Parnak Bassam olur mu?