LCD Pinlerini nasıl ayarlayabilirim ?

Başlatan orhanc, 02 Mayıs 2010, 20:34:15

ahmet2004

*orhanc*

microC mi kullanıyorsun HitechC mi kullanıyorsun?

arslan74 un verdiği kodlar çalışıyor.Senin çalıştığın çalışmayan kodlar neler eklersen bakalım?

orhanc

Alıntı yapılan: ahmet2004 - 05 Mayıs 2010, 16:34:00
*orhanc*

microC mi kullanıyorsun HitechC mi kullanıyorsun?

arslan74 un verdiği kodlar çalışıyor.Senin çalıştığın çalışmayan kodlar neler eklersen bakalım?

Hitech kullanmak istiyorum ama lcd çalışmadığı için microC Kullandım. Devrede sorun yok hitech ile bir türlü yazdıramadım çünkü lcd nin pinleri farklı şekilde bağlı

RS  > RD0
RW > RD1
E    > RD2

D4-D7 >  RD4-RD7


evet o kodlar proteusda çalışıyor ama devrede çalışmıyor
i'm doing nothing... Giddy Up  http://www.drorhan.com

ahmet2004

delay.c
/*
 *	Delay functions
 *	See delay.h for details
 *
 *	Make sure this code is compiled with full optimization!!!
 */

#include	"delay.h"

void
DelayMs(unsigned char cnt) {
	unsigned char i;
	while (cnt--) {
		i=4;
		while(i--) {
			DelayUs(uS_CNT);	/* Adjust for error */
		} ;
	} ;
}


delay.h
/*
 *	Delay functions for HI-TECH C on the PIC18
 *
 *	Functions available:
 *		DelayUs(x)	Delay specified number of microseconds
 *		DelayMs(x)	Delay specified number of milliseconds
 *
 *	Note that there are range limits: 
 *	- on small values of x (i.e. x<10), the delay becomes less
 *	accurate. DelayUs is accurate with xtal frequencies in the
 * 	range of 4-16MHZ, where x must not exceed 255. 
 *	For xtal frequencies > 16MHz the valid range for DelayUs
 *	is even smaller - hence affecting DelayMs.
 *	To use DelayUs it is only necessary to include this file.
 *	To use DelayMs you must include delay.c in your project.
 *
 *	Set the crystal frequency in the CPP predefined symbols list
 *	on the PICC-18 commmand line, e.g.
 *	picc18 -DXTAL_FREQ=4MHZ
 *
 *	or
 *	picc18 -DXTAL_FREQ=100KHZ
 *	
 *	Note that this is the crystal frequency, the CPU clock is
 *	divided by 4.
 *
 *	MAKE SURE this code is compiled with full optimization!!!
*/

#define	MHZ	*1

#ifndef	XTAL_FREQ
#define	XTAL_FREQ	20MHZ		/* Crystal frequency in MHz */
#endif

#if	XTAL_FREQ < 8MHZ
#define	uS_CNT 	238			/* 4x to make 1 mSec */
#endif

#if	XTAL_FREQ == 8MHZ
#define uS_CNT  244
#endif

#if	XTAL_FREQ > 8MHZ
#define uS_CNT  246
// 246
#endif

#define FREQ_MULT	(XTAL_FREQ)/(4MHZ)

#define	DelayUs(x)	{ unsigned char _dcnt; \
			  if(x>=4) _dcnt=(x*(FREQ_MULT)/2); \
			  else _dcnt=1; \
			  while(--_dcnt > 0) \
				{\
				asm("nop");\
				asm("nop");\
				continue; }\
		} 

extern void DelayMs(unsigned char);


Genelde hitechC de yapılan hata delay.c ve delay.h ın doğru kullanılamamasıdır.

ahmet2004

lcd.h
#ifndef LCD_H_
#define LCD_H_
/*
 *	LCD interface header file
 *	See lcd.c for more info
 */

/* write a byte to the LCD in 4 bit mode */

extern void lcd_write(unsigned char);

/* Clear and home the LCD */

extern void lcd_clear(void);

/* write a string of characters to the LCD */

extern void lcd_puts(const char * s);

extern void lcd_putch(char c);

/* Go to the specified position */

extern void lcd_goto(unsigned char pos);

/* intialize the LCD - call before anything else */

extern void lcd_init(void);

#endif /*LCD_H_*/


lcd.c
#include <htc.h>
#define	XTAL_FREQ	20MHZ
#include "delay.h"
#include "lcd.h"

#define LCD_RS RD0
#define LCD_RW RD1
#define LCD_EN RD2

#define LCD_DB4 RD4
#define LCD_DB5 RD5
#define LCD_DB6 RD6
#define LCD_DB7 RD7

/////////////////////////////
#define TRIS_RS TRISD0
#define TRIS_RW TRISD1
#define TRIS_EN TRISD2

#define TRIS_DB4 TRISD4
#define TRIS_DB5 TRISD5
#define TRIS_DB6 TRISD6
#define TRIS_DB7 TRISD7


#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))



bit bit_test (unsigned char var, unsigned char bit_no) { 

if ( !!(var & (1 << bit_no)) ) 
return 1; 
else 
return 0; 

} 


/*
void LCD_STROBE(void){
LCD_EN = 1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
LCD_EN = 0;

};
*/


/* Write unsig int to LCD */

void lcd_write_int( unsigned int val){

unsigned int temp= 0;
unsigned int t= 10000;
char flag=1;
char flag_minus=0;
unsigned char sifirlar = 0;

if (val == 0){
lcd_puts("0 ");
return;
}

/* if (val < 0){
flag_minus= 1 ;
val*= -1;
}
*/

do{

temp= val/t;

if (flag)
if ( temp == 0 ){
sifirlar++;
continue;
}

else {
flag= 0;
if(flag_minus)
lcd_putch('-');
}

lcd_putch('0'+temp);

val= val - temp*t;

}while(t/=10);

while (sifirlar--)
lcd_puts(" ");


}



void lcd_write_char( unsigned char val){

unsigned int temp= 0;
unsigned int t= 100;
char flag=1;
char flag_minus=0;
unsigned char sifirlar = 0;

if (val == 0){
lcd_puts("0 ");
return;
}

/* if (val < 0){
flag_minus= 1 ;
val*= -1;
}
*/

do{

temp= val/t;

if (flag)
if (temp==0){
sifirlar++;
continue;
}

else {
flag= 0;
if(flag_minus)
lcd_putch('-');
}

lcd_putch('0'+temp);

val= val - temp*t;

}while(t/=10);

while (sifirlar--)
lcd_puts(" ");

}




/* write a byte to the LCD in 4 bit mode */

void
lcd_write(unsigned char c)
{
DelayUs(40);

//LCD_DATA = ( ( c >> 4 ) & 0x0F );
if ( c & 0b00010000 )
LCD_DB4 = 1;
else
LCD_DB4 = 0;

if ( c & 0b00100000 )
LCD_DB5 = 1;
else
LCD_DB5 = 0;

if ( c & 0b01000000 )
LCD_DB6 = 1;
else
LCD_DB6 = 0;

if ( c & 0b10000000 )
LCD_DB7 = 1;
else
LCD_DB7 = 0;


LCD_STROBE();

//LCD_DATA = ( c & 0x0F );
if ( c & 0b00000001 )
LCD_DB4 = 1;
else
LCD_DB4 = 0;

if ( c & 0b00000010 )
LCD_DB5 = 1;
else
LCD_DB5 = 0;

if ( c & 0b00000100 )
LCD_DB6 = 1;
else
LCD_DB6 = 0;

if ( c & 0b00001000 )
LCD_DB7 = 1;
else
LCD_DB7 = 0;


LCD_STROBE();
}

/*
* Clear and home the LCD
*/

void
lcd_clear(void)
{
LCD_RS = 0;
lcd_write(0x1);
DelayMs(20);
}

/* write a string of chars to the LCD */

void
lcd_puts(const char * s)
{
LCD_RS = 1; // write characters
while(*s)
lcd_write(*s++);
}

/* write one character to the LCD */

void lcd_putch(char c)
{
	LCD_RS = 1; // write characters
	lcd_write( c );
}

/*
* Go to the specified position
*/

void lcd_goto(unsigned char pos)
{
LCD_RS = 0;
lcd_write(0x80+pos);
}


/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
char init_value;

init_value = 0x3; // RB4=1, RB5=1, RB6=0, RB7=0;

LCD_RW = 0;
LCD_RS = 0;
LCD_EN = 0;


// TRISA = 0b00110000;

TRIS_DB4 = 0; // OUTPUT
TRIS_DB5 = 0; // OUTPUT
TRIS_DB6 = 0; // OUTPUT
TRIS_DB7 = 0; // OUTPUT

TRIS_RS = 0; // OUTPUT
TRIS_EN = 0; // OUTPUT
TRIS_RW = 0; // OUTPUT


LCD_RS = 0;
LCD_EN = 0;
LCD_RW = 0;

DelayMs(35); // wait 15mSec after power applied,

//LCD_DATA = init_value; // 0X3
LCD_DB4 = 1;
LCD_DB5 = 1;
LCD_DB6 = 0;
LCD_DB7 = 0;

LCD_STROBE();
DelayMs(25); // 5
LCD_STROBE();
DelayUs(200); // 200
DelayUs(200); 
LCD_STROBE();
DelayUs(200); // 200
DelayUs(200); 

//LCD_DATA = 2; // Four bit mode
LCD_DB4 = 0;
LCD_DB5 = 1;
LCD_DB6 = 0;
LCD_DB7 = 0;


LCD_STROBE();

lcd_write(0b00011100); // Set interface length

// lcd_write(0xF); // Display On, Cursor On, Cursor Blink

lcd_write(0b00101000); // function set 4 bits, 2 lines, font set # 1
lcd_write(0b00001100); // display on, cursor off, blink off
lcd_write(0b00000110); // increment - no display shift

lcd_write(0x6); // Set entry Mode
lcd_clear(); // Clear screen
}

orhanc

Eve birazdan gideceğim deneyip tekrardan bilgi vereceğim
i'm doing nothing... Giddy Up  http://www.drorhan.com

ahmet2004

#20

20Mhz  kristal kullanılmıştır.





ÖM inize cevap yazmak istedim bu mesaj geliyor.
Mesaj ayarlarınızı tüm kullanıcılardan mesaj al kısmını seçerseniz.
Kullanıcı 'orhanc' sizi engellemiştir.


orhanc

#21
Tamam düzelttim ayarı kaçmış :)
i'm doing nothing... Giddy Up  http://www.drorhan.com

orhanc

Ben bir şey daha sorayım bununla ilgili. Ben hitechi derleyici olarak mplab içinden kullanıyorum bunun bir etkisi olabilir mi ve tam sürüm olmasıan rağmen lite modu kullanılıyor gibi bir uyarı veriyor ve onu düzeltemedim.
i'm doing nothing... Giddy Up  http://www.drorhan.com

ahmet2004

ben hitech-ide den kullanıyorum.Başka bir sınırsız hitech kur sınırlamalar kalmaz o zaman.

orhanc

#24
#define LCD_RS RD0
//#define LCD_RW RD2
#define LCD_EN RD1

#define LCD_DB4 RD2
#define LCD_DB5 RD3
#define LCD_DB6 RD4
#define LCD_DB7 RD5


Devremin pinleri bu şekildeymiş ve bağladım ama görüntü gelmedi. Aynı pinler ile microc çalışıyor ve devre 8mhz ve 18f4620 kullandım.
i'm doing nothing... Giddy Up  http://www.drorhan.com

orhanc

sizin devrenin aynısını yaptık dosyaları da aldık ve çalıştırdık ancak yine görüntü yok tek farkı devre 8mhz ve main.c kodu da şöyle

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

void main(void)
{
   PORTD = 0x00;
   TRISD = 0x00;

   lcd_init();
   lcd_clear();
   lcd_goto(1);   
   lcd_puts("test programi.");
   lcd_puts("Merhaba Dunya.");
while(1){

}
}
i'm doing nothing... Giddy Up  http://www.drorhan.com

z

LCD yi neden hazir fonskyonlarla kullanmaya calisiyorsun?

LCD nin bir kac sayfalik dokumanini incelersen C gibi bir dilde 5-10 satirda ihtiyacin olan fonksiyonlari yazabilecegini farkedeceksin.
Kendi kendinin patronu olur diledigin portu diledigin pini kullanirsin.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

M_B

Merhaba orhanc;
Bende sizin main kodunu ve arslan74 hocamızın verdiği kutuphaneyi kullanarak Isıs te sımule ettim calısıyor. Bir sorun gozukmedı.
Siz İsiste sımule ettiğinizde normal olarak calısıyor mu?.
Birde Hex yuklerken Config ayarlarını programlayıcı üzerinden yapıyormusunuz. Cunku main de Config ayarınızı goremedım.
Ornek olarak :
__CONFIG(1,INTIO); 
__CONFIG(3,MCLRDIS); 
__CONFIG(4,DEBUGDIS); 
__CONFIG(5,UNPROTECT); 
__CONFIG(6,UNPROTECT); 
__CONFIG(7,UNPROTECT);


Kolay gelsin.

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

ahmet2004

#28
Buda benim yazdıklarım senin donanımında çalışıyor.

#include <stdio.h>
#include <stdlib.h>
#include <htc.h>
#include <pic18f4620.h>

__CONFIG(1, HS & IESODIS & FCMDIS);
__CONFIG(2, PWRTDIS & BORDIS & WDTDIS & WDTPS128);
__CONFIG(3, CCP2RB3 & LPT1DIS & MCLREN);
__CONFIG(4, STVREN & LVPDIS & DEBUGDIS & XINSTDIS);
__CONFIG(5, UNPROTECT);
__CONFIG(6, UNPROTECT);
__CONFIG(7, UNPROTECT);

#define		XTAL_FREQ	8MHZ
#include 	"delay.h"
#include 	"lcd.h"

void main(void)
{
PORTD = 0x00;
TRISD = 0x00;

lcd_init();
lcd_clear();
lcd_goto(1); 
lcd_puts("test programi.");
lcd_puts("Merhaba Dunya.");
while(1){

}
}



ilk başta RW pinini RD1 e vermişsin.Benim yazdıklarımla birlikte Lcd RW pini şaseye bağlayınca çalışıyor.


Son durumu söyle ona göre devam edelim.

orhanc

Proteusa güvenmeyin gerçek devrede hiçbiri çalışmıyor :) ben configi mplabın ayar menüsünden yapıyorum
i'm doing nothing... Giddy Up  http://www.drorhan.com