LPC2104 ve Proteus Problemi

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

fatihinanc

@Brsmnc
Hocam düzeltme için teşekkür ederim...
Bunu timer modülünü anlamak için bir alıştırma niyetine yapmıştım.Şimdi timer modülünü halletik sayılır.
Verdiğiniz örnek koddan yola çıkarak biraz daha değişik birşeyler yapılabilir. Teşekkür ediyorum.

@computerboy
Fast GPIO ve USB haricinde LPC2138 in LPC2148 den çok da eksiği yok gibi.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

sdonmez

Merhaba,

Ben de LCPxresso kartını beklerden ufaktan denemeler yapıyorum. LCD uygulaması için http://www.dreamislife.com/arm/#lcd_demo adresindeki lcd.c ve lcd.h dosyalarını kullandım.  Baktım olmadı, az da olsa değişiklikler yaparak çalışır halde getirdim.  Yalnız ufaktan bir sorunum var.

Lcd.c kodu aşağıda.  Orjinalinde lcd_gotoxy tarzı komut olmadığından CCS kütüphanelerindeki yapıyı ekledim.

#include "lpc210x.h"
#include "lcd.h"

void lcd_wait(){
      int loop=8000;  //more than enough
      //busy loop
      while(loop--);
}

void lcd_out_data4(unsigned char val){
     IOCLR |= (LCD_DATA);
     IOSET |= (val<<4);
}

void lcd_write_nibbles(unsigned char val){

     //higher-order byte
     lcd_en_set();
     lcd_out_data4((val>>4)&0x0F);
     lcd_en_clr();

     lcd_wait();

     //lower-order byte
     lcd_en_set();
     lcd_out_data4((val)&0x0F);
     lcd_en_clr();
     
     lcd_wait();
}

void lcd_write_control(unsigned char val){
     lcd_rs_clr();
     lcd_write_nibbles(val);
}

void lcd_init(){

        PINSEL0 &= (~LCD_GPIO_SEL0);
        PINSEL1 &= (~LCD_GPIO_SEL1);
        /* we only work on OUTPUT so far */
        IODIR |= LCD_IOALL;
        
        /* IO init complete, init LCD */

       /* init 4-bit ops*/
       lcd_rs_clr();
       lcd_rw_clr();
       lcd_en_clr();

       //wait VDD raise > 4.5V
       lcd_wait();
       
       //dummy inst 
       lcd_write_nibbles(0x30);
       lcd_write_nibbles(0x30);
       lcd_write_nibbles(0x30);

       //FUNCTION SET
       //001DL  N F XX
       //DL=1: 8bit
       //DL=0: 4bit
       //N=0: 1 line display
       //N=1: 2 line display
       //F=0: 5x7 dots
       //F=1: 5x10 dots

       //our case:
       //0010 1000

       lcd_en_set();
       lcd_out_data4(0x2);
       lcd_en_clr();
       lcd_wait();

		/*
		Function Set: 8-bit, 1 Line, 5x7 Dots	0x30	48 
		Function Set: 8-bit, 2 Line, 5x7 Dots	0x38	56	
		Function Set: 4-bit, 1 Line, 5x7 Dots	0x20	32
		Function Set: 4-bit, 2 Line, 5x7 Dots	0x28	40 
		Display on Cursor on					0x0E	14
		Display on Cursor off					0x0C	12
		Display on Cursor blinking	 			0x0F	15	
		Shift entire display left				0x18	24
		Shift entire display right				0x1C	30
		Move cursor left by one character		0x10 	16
		Move cursor right by one character		0x14	20
		Clear Display (also clear DDRAM content)0x01	1  
		*/

	   // Fonksiyon seti 
       lcd_write_nibbles(0x28);
       
       //LCD ON	CURSOR OFF
       lcd_write_nibbles(0x0C);

       //Clear Display
       //lcd_write_nibbles(0x01);

       //Entry mode
       lcd_write_nibbles(0x06);
}

void lcd_putchar(unsigned char c){

       lcd_rs_set();
       lcd_write_nibbles(c);
}

void lcd_print(unsigned char* str){
    int i;

  //limit 1 line display for prints
    for (i=0;i<16 && str[i]!=0;i++)
	{
    	lcd_putchar(str[i]);
    }
}

void lcd_gotoxy(unsigned int x, unsigned int y)
{
	unsigned char address;

	switch(x)
	  {
	   case 1:
	     address = LCD_LINE_1_ADDRESS;
	     break;
	
	   case 2:
	     address = LCD_LINE_2_ADDRESS;  
	     break;
	
	   case 3:
	     address = LCD_LINE_3_ADDRESS;
	     break;
	
	   case 4:
	     address = LCD_LINE_4_ADDRESS;
	     break;
	
	   default:
	     address = LCD_LINE_1_ADDRESS;
	     break; 
	  }

	address += y-1;
	//lcd_write_nibbles(0x80 | address);
	lcd_write_nibbles(address);
	//lcd_write_nibbles(0x80+y);
}


Ama gelin görün ki, ana programda aşağıdaki kodu yazınca 2. satır doğru yerde çıkarken
lcd_init();
	lcd_gotoxy(1,5);
	lcd_print("LCD");
	wait();
	lcd_init();
	lcd_gotoxy(2,3);
	lcd_print("DENEME");


Bu kodu yazdığımda çalışmıyor.
lcd_init();
	lcd_gotoxy(1,5);
	lcd_print("LCD");
	wait();
	lcd_gotoxy(2,3);
	lcd_print("DENEME");


Göremediğim bir yer var ama bulamadım.
Yardımlarınızı bekliyorum.

Tüm dosyalar için: http://rapidshare.com/files/418655017/2x16_4bit_LCD_v3.rar
Devre şeması:



Şadan



muhittin_kaplan


muhittin_kaplan

aklıma gelmişken sorayım..
yaptığımız multitasking çalışmada her zamanlama kesmesinde bir işlemi yapıyoruz.

t1:görev1
t2:görev2
t3:görev3
t4:görev1
....
gibi bir çalışma sistemi mevcut anladığım kadarı ile. yanlız aklıma takılan şu oldu burada görev2 zamanında bitmezse ve kesme oluşursa ve tick sayısı artarsa ne olacak ?

picusta

Alıntı yapılan: muhittin_kaplan - 13 Eylül 2010, 10:06:51
yanlız aklıma takılan şu oldu burada görev2 zamanında bitmezse ve kesme oluşursa ve tick sayısı artarsa ne olacak ?
"Preemptive" multi-tasking kullanacaksin.
Cooperative olmasi için herkes (görevler) birbirine saygi duymali, ayni kooperatiflerdeki gibi, yoksa bu is yürümez. Ayrica time slot, round-robbin kavramlarina da girmelisin.

X-Fi

#36
lpc2138 in rtc sinide çalıştırdım incelemek isteyenler için projeyi ekliyorum
bir güzel özelliği daha var rtc entegrelerde olmayan alarm özelliği yüzünden ram adresini kullanıp büssürü işlemler yapıyorduk armde alarm modülü var kendisi karşılaştırıp size kesme veriyor çok güzel özellikler bunlar kolay gelsin. :)



not: program 3sn sonra alarm verecek şekilde derlendi.

http://rapidshare.com/files/418790067/ARM_rtc.rar
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Brsmnc

#37
Alıntı yapılan: muhittin_kaplan - 13 Eylül 2010, 10:06:51
. yanlız aklıma takılan şu oldu burada görev2 zamanında bitmezse ve kesme oluşursa ve tick sayısı artarsa ne olacak ?

Evet picustanın dediği gibi görevlerin işlerini zamanında bitirip akışı diğerlerine vermesi lazım yoksa sistem çalışmaz hale gelir. Bu cooperative oluyor.Multitasking daha farklı. Örneğin benim PIC kullanarak ethernet üzerine bir çalışmam var.Bu yazmış olduğum yapı orada kullanılıyor. PIC bir fonksiyonda ağ üzerinden bir paket alıyor ve hemen diğer görevlerde alınan paketin içerisini işliyor.Diğer görevlerde işlenen veriden hesaplama yapılıyor.Diğer görevlerde ağdan veriyi gönderen IP adresine cevap veriyor.
Bu görevlerden bir tanesi kendisine ayrılan süreyi aşarsa sistem kilitleniyor ve ağdan gelen isteklere cevap veremez hale geliyor. Çünkü 1ms gibi zaman periyotları ile gelen veri varmı yokmu diye taraması gerekiyor.
Görev2 zamanında bitmez ise diğer görevleri geciktirmiş olur. Bu yüzden işletim sistemleri kullanılıyor ve her göreve belirli bir süre veriliyor.O görev bitmese bile işletim sistemi görevi kesip akışı başka bir göreve veriyor.Daha sonra yarım kalan göreve dönüldüğünde görev kaldığı yerden devam ediyor.Buna multitasking deniyor.

muhittin_kaplan

bende öyle yorumlamıştım, yarım kalan görevin nerede kaldığınıda anlayabilmesi için her task a bir ProgramCounter gerek diye düşünüyorum bu donanımsal sayıcıyı nasıl sağlıyoruz ?
(inşallah doğru sorular soruyorumdur)

picusta

Her görevin hafizada  Task Control Block'u vardir. Her görevin ayri stack'i vardir. Scheduler gerektigi zaman bu aktif olacak görevin stackini yükler. Picproje e-dergisinin 1. sayisinda bir amatör tarafindan yazilmis (PIC18'de) RTOS makalesi var. Aman aman degil ama idare eder. Ona bir göz atin.

sdonmez

Dün yazmış olduğum sorunu düzelttim.
4x20 Lcd kütüphaneleri:

Lcd.c
#include "lpc210x.h"
#include "lcd.h"

void lcd_wait(void){
      int loop=5000;  //more than enough
      //busy loop
      while(loop--);
}

void lcd_out_data4(unsigned char val){
     IOCLR |= (LCD_DATA);
     IOSET |= (val<<4);
}

void lcd_write_nibbles(unsigned char val){

     //higher-order byte
     lcd_en_set();
     lcd_out_data4((val>>4)&0x0F);
     lcd_en_clr();

     lcd_wait();

     //lower-order byte
     lcd_en_set();
     lcd_out_data4((val)&0x0F);
     lcd_en_clr();
     
     lcd_wait();
}

void lcd_write_control(unsigned char val){
     lcd_rs_clr();
     lcd_write_nibbles(val);
}

void lcd_init(void){

        PINSEL0 &= (~LCD_GPIO_SEL0);
        PINSEL1 &= (~LCD_GPIO_SEL1);
        /* we only work on OUTPUT so far */
        IODIR |= LCD_IOALL;
        
        /* IO init complete, init LCD */

       /* init 4-bit ops*/
       lcd_rs_clr();
       lcd_rw_clr();
       lcd_en_clr();

       //wait VDD raise > 4.5V
       lcd_wait();
       
       //dummy inst 
       lcd_write_nibbles(0x30);
       lcd_write_nibbles(0x30);
       lcd_write_nibbles(0x30);

       //FUNCTION SET
       //001DL  N F XX
       //DL=1: 8bit
       //DL=0: 4bit
       //N=0: 1 line display
       //N=1: 2 line display
       //F=0: 5x7 dots
       //F=1: 5x10 dots

       //our case:
       //0010 1000

       lcd_en_set();
       lcd_out_data4(0x02);
       lcd_en_clr();
       lcd_wait();

		/*
		Function Set: 8-bit, 1 Line, 5x7 Dots	0x30	48 
		Function Set: 8-bit, 2 Line, 5x7 Dots	0x38	56	
		Function Set: 4-bit, 1 Line, 5x7 Dots	0x20	32
		Function Set: 4-bit, 2 Line, 5x7 Dots	0x28	40 
		Display on Cursor on					0x0E	14
		Display on Cursor off					0x0C	12
		Display on Cursor blinking	 			0x0F	15	
		Shift entire display left				0x18	24
		Shift entire display right				0x1C	30
		Move cursor left by one character		0x10 	16
		Move cursor right by one character		0x14	20
		Clear Display (also clear DDRAM content)0x01	1  
		*/

	   // Fonksiyon seti 
       lcd_write_nibbles(0x28);
       
       //LCD ON	CURSOR OFF
       lcd_write_nibbles(0x0C);

       //Clear Display
       //lcd_write_nibbles(0x01);

       //Entry mode
       lcd_write_nibbles(0x06);
}

void lcd_putchar(unsigned char c){

       lcd_rs_set();
       lcd_write_nibbles(c);
	   lcd_rs_clr();
}

void lcd_print(unsigned char* str){
    int i;

  //limit 1 line display for prints
    for (i=0;i<16 && str[i]!=0;i++)
	{
    	lcd_putchar(str[i]);
    }
}

void lcd_gotoxy(unsigned char x, unsigned char y)
{
	unsigned char address;

	switch(x)
	  {
	   case 1:
	     address = LCD_LINE_1_ADDRESS;
	     break;
	
	   case 2:
	     address = LCD_LINE_2_ADDRESS;  
	     break;
	
	   case 3:
	     address = LCD_LINE_3_ADDRESS;
	     break;
	
	   case 4:
	     address = LCD_LINE_4_ADDRESS;
	     break;
	
	   default:
	     address = LCD_LINE_1_ADDRESS;
	     break; 
	  }

	address += y-1;
	lcd_write_nibbles(0x80 | address);
	//lcd_write_nibbles(address);
	//lcd_write_nibbles(0x80+y);
}


Lcd.h

// Copyright (c) 2004 senz at arm.dreamislife.com
//
//
// THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

/***************************************/
/* LCD routines for OLIMEX LPC-MT-2106 */
/* 16x2 Character LCD 1602K            */
/* 4-bit mode operation                */
/***************************************/


/* DEFINE IOMASK */
#define  LCD_D4  0x00000010   	//P0.04
#define  LCD_D5  0x00000020   	//P0.05
#define  LCD_D6  0x00000040   	//P0.06
#define  LCD_D7  0x00000080   	//P0.07
#define  LCD_EN  0x00400000   	//P0.22
#define  LCD_RS  0x00800000   	//P0.23
#define  LCD_RW  0x01000000  	//P0.24

#define  LCD_DATA           (LCD_D4|LCD_D5|LCD_D6|LCD_D7)
#define  LCD_IOALL          (LCD_D4|LCD_D5|LCD_D6|LCD_D7|LCD_EN|LCD_RS|LCD_RW)

#define  LCD_GPIO_SEL0      0x0000FF00   //MASK for P0.04-P0.07
#define  LCD_GPIO_SEL1      0x0003F000   //MASK for P0.22-P0.24

#define LCD_LINE_1_ADDRESS 	0x80            
#define LCD_LINE_2_ADDRESS 	0xC0       
#define LCD_LINE_3_ADDRESS 	0x94         
#define LCD_LINE_4_ADDRESS 	0xD4 

/* Functions Header */
/* internal I/O functions */
#define lcd_rs_set() IOSET |= LCD_RS
#define lcd_rs_clr() IOCLR |= LCD_RS
#define lcd_en_set() IOSET |= LCD_EN
#define lcd_en_clr() IOCLR |= LCD_EN
#define lcd_rw_set() IOSET |= LCD_RW
#define lcd_rw_clr() IOCLR |= LCD_RW

#define lcd_clear()         lcd_write_control(0x01)
#define lcd_cursor_home()   lcd_write_control(0x02)

#define lcd_display_on()    lcd_write_control(0x0E)
#define lcd_display_off()   lcd_write_control(0x08)

#define lcd_cursor_blink()  lcd_write_control(0x0F)
#define lcd_cursor_on()     lcd_write_control(0x0E)
#define lcd_cursor_off()    lcd_write_control(0x0C)

#define lcd_cursor_left()   lcd_write_control(0x10)
#define lcd_cursor_right()  lcd_write_control(0x14)
#define lcd_display_sleft() lcd_write_control(0x18)
#define lcd_display_sright() lcd_write_control(0x1C)

/* wait until lcd controller is free */
void lcd_wait(void);
void lcd_out_data4(unsigned char);
void lcd_write_nibbles(unsigned char);
void lcd_write_control(unsigned char);
/* initialize both the GPIO of lpc and LCD */
void lcd_init(void);
/* put a character out to lcd */
void lcd_putchar(unsigned char);
/* print a string */
void lcd_print(unsigned char*);
void lcd_gotoxy(unsigned char x, unsigned char y);


Şadan

sdonmez

Alıntı yapılan: X_Fi - 13 Eylül 2010, 14:25:59
lpc2138 in rtc sinide çalıştırdım incelemek isteyenler için projeyi ekliyorum
bir güzel özelliği daha var rtc entegrelerde olmayan alarm özelliği yüzünden ram adresini kullanıp büssürü işlemler yapıyorduk armde alarm modülü var kendisi karşılaştırıp size kesme veriyor çok güzel özellikler bunlar kolay gelsin. :)

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

not: program 3sn sonra alarm verecek şekilde derlendi.

http://rapidshare.com/files/418790067/ARM_rtc.rar

Aynı kodu LPC2104 üzerinde çalıştırabilmek için gerekli rtc_init fonksiyonu (harici ocilatörü kullanılmıyor):
void rtc_init(void)
{
	ILR=0x2;   							/* alarm kesmeleri kurulur */
	/* Clock Control Register Ayarlari */
	CCR = 0x0003;  						/* CTCRST=1, CLKEN=1 */
	CCR = 0x0001;  						/* CTCRST=0, CLKEN=1 */						
	/* Prescaler Integer Register Ayarlari */
	PREINT=0x0000016D;					/* PREINT = int (pclk / 32768) - 1. The value of PREINT must be greater than or equal to 1 */
	PREFRAC=0x00001B00;					/* PREFRAC = pclk - ((PREINT +1) x 32768) */
}


PREINT ve PREFRAC register değerlerini 12Mhz için hesapladım. 


Şadan

teknikelektronikci

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 merhaba dosya silinmisde bana uart kütüphanesi lazim upload ekleme imkaniniz varmi ? tesekkürler
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

X-Fi

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

teknikelektronikci

Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!