LPC2104 ve Proteus Problemi

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

Nedenler

Madem konusu açılmış bende buradan sorayım. Arkadaşlar LPC2106 için kendime bir 4x20 LCD lib. dosyası hazırladım. Ancak init kodlarındanmıdır nedir bilemiyorum ekrana görüntü alamıyorum. Pinlerdeki değişimleri görüyorum kodları çok kontrol ettim birşey eksik gibi ama ne bilemedim. Kodlar;

lcd_4x20.c
/*
#define LCD_RS	  						 LCD pinleri, lcd kütüphanesi programa dahil edilmeden 
#define LCD_E	  						 buradaki isimleri ile tanıtılmalı.
#define LCD_D4	  
#define LCD_D5	  
#define LCD_D6    
#deifne LCD_D7					  
               */

#define LCD_DATA  (LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7)
#define LCD_IOALL (LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7 | LCD_E | LCD_RS)
#define rs_high IOSET0 |= LCD_RS
#define rs_low  IOSET0 |= LCD_RS
#define e_high  IOSET0 |= LCD_E
#define e_low   IOSET0 |= LCD_E

void lcd_wait_us(int us)
{
	while(--us);
}

void lcd_wait_ms(unsigned int ms)
{
	ms*=1000;
	while(--ms);
}


				   						       	
void lcd_command(unsigned char value)
{  	
   IOCLR0 |= (LCD_DATA);
   rs_low;
   lcd_wait_us(1);
   e_high;
   lcd_wait_us(1);
	if((value>>4)&1)   IOSET0 |= LCD_D4;
	else			       IOCLR0 |= LCD_D4;
	if((value>>4)&2)   IOSET0 |= LCD_D5;
	else			       IOCLR0 |= LCD_D5;   //value değişkeninin değeri 4er bitlik ayrılarak bit bit gönderiliyor. 
	if((value>>4)&4)   IOSET0 |= LCD_D6;	 
	else			       IOCLR0 |= LCD_D6;
	if((value>>4)&8)   IOSET0 |= LCD_D7;
	else               IOCLR0 |= LCD_D7;
   e_low;
   lcd_wait_ms(2);
   
   e_high;
   lcd_wait_us(1);      	
	if((value&0x0F)&1) IOSET0 |= LCD_D4;
	else			       IOCLR0 |= LCD_D4;	 
	if((value&0x0F)&2) IOSET0 |= LCD_D5;
	else			       IOCLR0 |= LCD_D5;  //Düşük değerlikli 4 bit gönderiliyor.
	if((value&0x0F)&4) IOSET0 |= LCD_D6;
	else			       IOCLR0 |= LCD_D6;
	if((value&0x0F)&8) IOSET0 |= LCD_D7;
	else               IOCLR0 |= LCD_D7;
   e_low;
   lcd_wait_us(1);
   rs_low;
}

void lcd_putc(unsigned char data)
{
	IOCLR0 |= (LCD_DATA);
   rs_high;
   lcd_wait_us(1);
   e_high;
   lcd_wait_us(1);
   if((data&0x0F)&1)  IOSET0 |= LCD_D4;
	else			       IOCLR0 |= LCD_D4;
	if((data&0x0F)&2)  IOSET0 |= LCD_D5;
	else			       IOCLR0 |= LCD_D5;	  
	if((data&0x0F)&4)  IOSET0 |= LCD_D6;	 
	else			       IOCLR0 |= LCD_D6;
	if((data&0x0F)&8)  IOSET0 |= LCD_D7;
	else               IOCLR0 |= LCD_D7;
   e_low;
   lcd_wait_ms(2);
   	
	if((data&0x0F)&1)  IOSET0 |= LCD_D4;
	else			       IOCLR0 |= LCD_D4;	 
	if((data&0x0F)&2)  IOSET0 |= LCD_D5;
	else			       IOCLR0 |= LCD_D5;	  
	if((data&0x0F)&4)  IOSET0 |= LCD_D6;
	else			       IOCLR0 |= LCD_D6;
	if((data&0x0F)&8)  IOSET0 |= LCD_D7;
	else               IOCLR0 |= LCD_D7;
   e_low;
   lcd_wait_us(1);
   rs_high;
}

void lcd_print(unsigned char* str)
{
    int i;
    for (i=0;i<16 && str[i]!='\0';i++)
    	lcd_putc(str[i]);
} 


void lcd_goto_xy(unsigned char x, unsigned char y)
{
	switch(x)							      //İmleç x,y adresine konumlandırılıyor. 
	{
		case 1	: lcd_command(0x80+(y-1)); break;	 
		case 2	: lcd_command(0xC0+(y-1)); break;
		case 3	: lcd_command(0x94+(y-1)); break;
		case 4	: lcd_command(0xD4+(y-1)); break;
		default : break;
	}
}

void lcd_init(void)
{
	int i;
	IODIR0|=LCD_IOALL;
   rs_low;
	e_low;
	lcd_wait_ms(70);

	for(i=0;i<3;i++)
	{
		lcd_command(0x03);
		lcd_wait_ms(5);
	}

	lcd_command(0x02);					 //LCD 4 bit,
	lcd_command(0x28);					 //5x8 dot matris,
	lcd_command(0x08);					 //İmleç yanıp sönmesi yok,
	lcd_command(0x0C);					 //Display açık,
	lcd_command(0x06);					 //Her karakterden sonra imleç bir sağa gidecek,
	lcd_command(0x01);					 //Ekranı temizle ve imleci 1. satır 1. sütuna konumlandır.
}



Çalıştırdığım kodlar;
#include<lpc21xx.h>
#define LCD_RS	  0x00000001 
#define LCD_E	  0x00000002
#define LCD_D4	  0x00000004
#define LCD_D5	  0x00000008
#define LCD_D6   0x00000010
#define LCD_D7	  0x00000020
                  
#include "lcd_4x20.c"


int k;
int main(void)
{
   lcd_init();
   while(1)
	{
		lcd_goto_xy(1,1);
		lcd_print("deneme");
      for(k=0;k<10000;k++);
		//lcd_goto_xy(2,1);
		//lcd_print("265fdfd"); 
                                             
	}
}


Durum;


scaemteitn

ya çok enteresan bacaklarla alakalı birşeymi var anlamadım. Elimdeki hazır olan lcd.h dosyasında sadece bacaklar ile ilgili kodları değiştiriyorum ama ekrana yazı yazamıyorum. eski bacakları tekrar tanıtıyorum bu sefer oluyor. Ne alaka anlamadım.

MC_Skywalker

ARM işlemcilerde 1 pinin fonsiyonunu değiştirmek için ilgili registerde 2 bitlik işlem yapman gerekli ve PIC lerdeki gibi (TRISA, TRISB)direk atama yapılmıyor. Bu konuda atlamış olduğun biryer olabirmi bir kontrol et istersen.

scaemteitn

şimdi orjinalde lcd data bacakları şunlar:

#define  LCD_D4  0x10    //P0.4
#define  LCD_D5  0x20      //P0.5
#define  LCD_D6  0x40      //P0.6
#define  LCD_D7  0x80      //P0.7

bende bunları şu şekilde değiştirdim
#define LCD_D4  0x01    // P0.0
#define LCD_D4  0x02    // P0.1
#define LCD_D4  0x04    // P0.2
#define LCD_D4  0x08    // P0.3

Pinsel zaten default olarak komple 0 geliyo. çözemedim. lcd.h ve lcd.c ekte

http://www.filesonic.com/file/492975711/lcd_kutuphane.rar

atladığım bişey var ama neyi atladığımı anlamadım.



X-Fi

Neden arm kullanmak istediğinizi öğrenebilirmiyim pic de internetteki sayısız uygulamayı yaptınız kendi kodlarınızı yazmaya başladınızda yavaş mı gelmeye başladı pic?

Bir üst seviye işlemciye geçmeye karar verdiniz öğreniminize devam edebilmek içinde en basitinden lcd fonksiyonunu mu çalıştıramıyorsunuz?

ben bu işde bi çelişki görüyorum beni yanlış anlamadıysanız.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

scaemteitn

yıllardır pic kullanıyorum ve artık farklı tadlara bakmanın zamanı geldi diye düşünüyorum. Ve yazdığım programı isis te rahatça deneyebildiğim için arm ile uğraşmaya karar verdim. tabi pic te isis te simüle edilebiliyor fakat dediğim gibi farklı yapılarlada uğraşmak istedim. Ayrıca bugün arm tabanlı işlemcileri kullanmayan elektronik cihaz kalmadı gibi bişey. Geçenlerde schneider plc geçti elime. hazır elimde iken bi kurcalayım dedim. baktım onda ana işlemcinin dışında birde arm kullanmışlar. Ayrıyetten aynı plc nin hmi ında da arm işlemci vardı. Bana böylece armlarla çalışmam için bir sebep oldu. maksat kendimize iş çıkarmak :).

computerboy

#51
main dosyasına ve lcd kütüphanesine lcd'de kullanacağın pinleri tanımlamışsın 2 yerde tanımlamadan denermisin bir sadece lcd kütüphanesinde olsun buraya tüm dosyayı yükle bakalım.

Başarılar.

Burda iki kişinin sorusu bir birine karışmış gibi gözüküyor.

#include<lpc21xx.h>
#define LCD_RS     0x00000001
#define LCD_E     0x00000002
#define LCD_D4     0x00000004
#define LCD_D5     0x00000008
#define LCD_D6        0x00000010
#define LCD_D7     0x00000020                 
#include "lcd_4x20.c"

bu kodların yerine

#include<lpc21xx.h>           
#include "lcd.h"

bu şekilde olması gerek.




matador



Aldığım bu hatayı çözemedim.

Kod derlenip hex. dosyasını oluşturuyor proteusta deniyorum hemen normalde P0.0 çıkışının yanıp sönmesi gerekirken 1 olarak kalıyor. Simülasyonu durduğumda ise xtal 1 ve 2 pinlerinin modellerinin olmadığı yazıyor uyarılarda Proteus v7.8 sp2 kullanıyorum.

matador

Gecikme rutinindeki 12000 i 1200 yaptım düzeldi bu arm ve keilde ki ilk programımdı.

http://www.emrahbudak.com/wp-content/uploads/2011/08/Lpc2104-Mikro-Denetleyicisini-KEIL-İle-Programlamak.pdf

Linkteki anlatımdan baka baka yapıyorum. Alışmak için.

http://hotfile.com/dl/131281469/3548a94/arm_iklk.DSN.html

burakoz1989

arkadaşlar biliyorum çok şey istiyorum ama yukarda verdiğininz linkleri yenileyebilirseniz inanın çok makbule geçecek teşekkürler.

burakoz1989

Alıntı yapılan: X-Fi - 11 Eylül 2010, 21:31:08
uzun uğraşlarım sonucunda uartı çalıştırdım kodları ekledim benim gibi takılanlar için yardımcı olacaktır.


(Resim gizlendi görmek için tıklayın.)

keil uVision4
arm 412

http://rapidshare.com/files/418473382/ARM_uart.rar
hocam mümkünse linki yenileyebilirmisinz çok uğraştım bi türlü çözemedim devre düzgün çalışıyo gözüküyo isisde ama virtual terminalde hiç bişi gözükmüyo her seyi denedim teşekkürler şimdiden