Arama butonu
Bu konudaki kullanıcılar: 1 misafir
30
Cevap
1150
Tıklama
0
Öne Çıkarma
Cevap: LCD'ye bişey yazdıramadım (2. sayfa)
T
20 yıl
Teğmen
Konu Sahibi

quote:

Orjinalden alıntı: psiko

trigger senin karşılaştığın sorunun aynısıyla ben de karşılaştım maalesef. devreyi kurdum ve üst satır verdiğin linkteki gibi koyu gözüküyor. neden böyle birşey oluyor acaba? acaba sorun breadboard kullanmamız olabilir mi???

Arkadaşın birinden lcd_main.c diye bir dosya aldım.Onla deneyeceğim birazdan.sonra size sonucu yazarım.belki protoboardtan da olabilir.

Akcay senin dediğini de sonra denerim eğer hı-techte yapamazsam pic basicte yazmayı denerim.


Bu mesaja 1 cevap geldi.
P
20 yıl
Çavuş

lcd.c ve lcd.h dosyalarında hiçbir sorun yok. ben kendi devremi Proteus'ta çalıştırdım. normal çalışıyor


Bu mesaja 1 cevap geldi.
T
20 yıl
Teğmen
Konu Sahibi

Yeni programı denedim ve pcbde denedim.Yine bişey değişmedi.Aynı üst satır sorunu devam ediyor.Simulasyonda çalışabilir ama önemli olan pratikte çalışması.Gözden kaçırdığımız ne var anlamadım?


Bu mesaja 1 cevap geldi.
P
20 yıl
Çavuş

simülasyonda çalışıyor lması programda bir sorun olmadığını gösterir. eğer lcd.c dosyasında sorun olsaydı simülasyonda hiç çalışmazdı zaten.

bu arada sen led yakmayı denedin mi? en basit şeyde normal çalışıyor mu diye bir kontrol et istersen. sırayla led yakmayı dene bakalım normal çalışıyormu...


Bu mesaja 1 cevap geldi.
R
20 yıl
Binbaşı

Şöyle bir tavsiyede bulunayım. Arıza veya hata arama yöntemleri ile sorunlu olabilecek noktalar test edilerek problemli bölge daraltılmalıdır.

Mesela LCD de yukarıdaki problem varsa olayı önce sorunu 2 ye ayıralım Sorun ya yazılımda yada Donanımda

Donanımdan emin olmak için basit bir prgram yazıp (bir ledi yakıp söndürmek gibi) işlemciyi çalıştırdığımız sistemin sağlıklı çalıştığından emin olmanız lazım.
Donanım kısmı sağlıklı çalışıyorsa problemi yazılımda aramamız lazım. Bilmiyorum yanlışmı düşünüyorum


Bu mesaja 1 cevap geldi.
P
20 yıl
Çavuş

ben sorunun lcd_init ile ilgili olduğunu tahmin ediyorum. LCD başlatılamıyor olabilir. lcd_init fonksiyonu aşağıdaki gibi:
#define	LCD_STROBE	((LCD_EN = 1),(LCD_EN=0)) 

void
lcd_init(void)
{
LCD_RS = 0; // write control bytes
DelayMs(15); // power on delay
PORTB = 0x3; // attention!
LCD_STROBE;
DelayMs(5);
LCD_STROBE;
DelayUs(100);
LCD_STROBE;
DelayMs(5);
PORTB = 0x2; // set 4 bit mode
LCD_STROBE;
DelayUs(40);
lcd_write(0x28); // 4 bit mode, 1/16 duty, 5x8 font
lcd_write(0x08); // display off
lcd_write(0x0F); // display on, blink curson on
lcd_write(0x06); // entry mode
}


benim burda sormak istediğim şey sondaki 4 komutun arka arkaya gelmesi normal mi? acaba bunların arasına gecikme koymak gerekir mi?


Bu mesaja 1 cevap geldi.
T
20 yıl
Teğmen
Konu Sahibi

lcd_write fonksiyonuna bakarsan komutlarından sonra delay var zaten.Bir yerlerde sorun var ama tam çözemedim.donanımda hata olduğunu hiç sanmıyorum.Bu problemi yaşayan bir sürü kişi var.Galiba bu HI-TECH'in derleyici beş para etmez.


Bu mesaja 1 cevap geldi.
P
20 yıl
Çavuş

Hi-Tech en iyi derleyici olarak kabul ediliyor. derleyici ile hiçbir alakası olmadığına emin olabilirsin. sorun başka bir yerde. bu arada sende üst satırın tamamen koyu olması her zaman için mi geçerli? mesela bende POT2la oynayarak VEE bacağına 0V civarı geldiğinde üst satır koyu oluyor. 1-1.5V civarı geldiğinde o kayuluk gidiyor ve üst satırın sonunda kursör gözüküyor. kursör satırın sonunda yanıp sönüyor.


Bu mesaja 1 cevap geldi.
T
20 yıl
Teğmen
Konu Sahibi

Valla ben de potla bakıyorum ama bişey değişmiyor.Ya ust satır koyu oluyor ya da kontrast voltajı iyice azalınca hiç bişey görünmüyor.


Bu mesaja 1 cevap geldi.
P
20 yıl
Çavuş

elinde 8 bit mod için çalışan lcd.c ve lcd.h dosyaları olan var mı? bir de 8 bit mod ile deneyelim bakalım...


Bu mesaja 1 cevap geldi.
T
20 yıl
Teğmen
Konu Sahibi

Sorunu hallettim.Arkadaştan aldığım başka bir lcd dosyasını kullandım ve ekrana istediğimi yazdırabildim.Yalnız 2 farklı lcdden 1 tanesi çalıştı.Diğerinin üst satır aynı yine.Galiba lcdnin mikroişlemcisine de bağlı biraz olay.Ya da belki diğeri bozuk olabilir yeni aldım ama.Aşağıda da ieteyenler için LCD_MAIN.c dosyası.Portları vs kendi donanımınıza göre ayarlayınız.
/* 
USER'S ROUTINES DESCRIPTION:

LCD_INIT() -----------> initilalize the LCD.
You must call it the first time you use the LCD
and before any other LCD routines.

LCD_CLEAR() ----------> Clears and Home LCD.

LCD_CMD('char') ------> Send a command to the LCD.
See LCD datasheet for the complete
list of commands.

LCD_GOTO(line,pos) ---> Set the Cursor to a specified Line and position.
Lines available are from 1 to 4. Pos available
starts from 1 to max available on your LCD.

LCD_PUTCH('char') ----> Write a character on LCD (ASCII representation).

LCD_PUTS("string") ---> Write a string on LCD.

LCD_PUTUN(number) ---> Write an Unsigned Number on LCD.
It works both with INT (16bit) and CHAR (8bit).

LCD_PUTSN(number) ---> Write a Signed Number on LCD (with Sign if <0).
It works both with INT (16bit) and CHAR (8bit).


/************************************************************************/
/* */
/* !!! ATTENTION !!! */
/* Follow these simple instructions to configure your LCD module */
/* */
/* 1) check your hardware to determine which lines to use */
/* (you need 6 output lines). */
/* 2) set properly TRIS registers in your main code to configure */
/* the 6 lines as outputs. */
/* 3) In the next step use the defines to set the 6 lines as your */
/* hardware requires. */
/* 4) Set LCD Rows and Columns number using the define as shown */
/* 5) You are ready...your LCD will work!!! :) */
/* */
/************************************************************************/


/************************************************************************/
/* Use this includes if these files are not included in your main code */
/************************************************************************/
/*#include <pic.h>
/*#include "delay.c"


/************************************************************************/
/* Use the following defines to set the lines as your hardware requires */
/* ...you can use ANY output line of the MCU, even on several ports :) */
/************************************************************************/

#define LCD_RS RA2 // Register select
#define LCD_EN RA3 // Enable
#define LCD_D4 RB0 // LCD data 4
#define LCD_D5 RB1 // LCD data 5
#define LCD_D6 RB2 // LCD data 6
#define LCD_D7 RB3 // LCD data 7



/************************************************************************/
/* Now you have only to write LCD Rows and Columns number */
/************************************************************************/

#define LCD_ROWS 2 // valid numbers are: 1,2
// (set to 2 for 2 or more rows)
#define LCD_COLS 16 // valid numbers are: 8,16,20

/************************************************************************/
/* Use the following defines to send fast command */
/* to the LCD */
/* EX: LCD_CMD(LCD_line2); will set the cursor on line 2 */
/* You can add fast command of your own!!! */
/************************************************************************/
/* */
/* !!! NOTE !!! */
/* DON'T CHANGE THE DEFINES WITHIN #if-#endif */
/* */
/************************************************************************/

#define LCD_CLR 0x01 // Clear Display
#define LCD_HOME 0x02 // Cursor to Home position

/************************************************************************/
#if (LCD_COLS==20)
#define LCD_line1 0x80 // Line 1 position 1
#define LCD_line2 0xC0 // Line 2 position 1
#define LCD_line3 0x94 // Line 3 position 1 (20 char LCD)
#define LCD_line4 0xD4 // Line 4 position 1 (20 char LCD)
#else
#define LCD_line1 0x80 // Line 1 position 1
#define LCD_line2 0xC0 // Line 2 position 1
#define LCD_line3 0x90 // Line 3 position 1 (16 char LCD)
#define LCD_line4 0xD0 // Line 4 position 1 (16 char LCD)
#endif
/************************************************************************/
void LCD_STROBE(void);
void LCD_NIBBLE_OUT(unsigned char);
void LCD_WRITE(unsigned char);
void LCD_CMD(char);
void LCD_GOTO(char,char);
void LCD_CLEAR(void);
void LCD_PUTCH(char);
void LCD_PUTUN(unsigned int);
void LCD_PUTSN(signed int);
void LCD_PUTS(const char *);
void LCD_INIT(void);
void saniye(int);


void saniye(int i)
{
int a;

for(a=1000*i;a>0;a--)
DelayMs(1);
}


/****************************************/
/* Enable LCD to read data */
/****************************************/
void LCD_STROBE (void)
{
LCD_EN = 1;
DelayUs(1);
LCD_EN=0;
}


/****************************************/
/* Write a nibble to the LCD */
/****************************************/
void LCD_NIBBLE_OUT (unsigned char c )
{
if ( c & 0b10000000 )
LCD_D7=1;
else LCD_D7=0;
if ( c & 0b01000000 )
LCD_D6=1;
else LCD_D6=0;
if ( c & 0b00100000 )
LCD_D5=1;
else LCD_D5=0;
if ( c & 0b00010000 )
LCD_D4=1;
else LCD_D4=0;
LCD_STROBE();
}


/****************************************/
/* Write a byte to the LCD (4 bit mode) */
/****************************************/
void LCD_WRITE (unsigned char c)
{
LCD_NIBBLE_OUT(c);
c <<= 4;
LCD_NIBBLE_OUT(c);
DelayUs(50);
}


/****************************************/
/* send a command to the LCD */
/****************************************/
void LCD_CMD (char c)
{
LCD_RS = 0; // write command
LCD_WRITE(c);
}


/****************************************/
/* GoTO specified line and position */
/****************************************/
void LCD_GOTO (char line,char pos)
{
switch(line)
{
case 1: LCD_CMD((LCD_line1-1)+pos);
break;
case 2: LCD_CMD((LCD_line2-1)+pos);
break;
case 3: LCD_CMD((LCD_line3-1)+pos);
break;
case 4: LCD_CMD((LCD_line4-1)+pos);
}
}


/****************************************/
/* Clear and Home LCD */
/****************************************/
void LCD_CLEAR (void)
{
LCD_CMD(LCD_CLR);
DelayMs(3);
}


/****************************************/
/* Write one character to the LCD */
/****************************************/
void LCD_PUTCH (char c)
{
LCD_RS = 1; // write characters
LCD_WRITE(c);
}


/****************************************/
/* Write numbers to the LCD */
/****************************************/
void LCD_PUTUN (unsigned int c)
{
unsigned char t1,i,wrote;
unsigned int k;

wrote=0;
for (i=4;i>=1;i--)
{
switch(i){
case 4: k=10000;
break;
case 3: k=1000;
break;
case 2: k=100;
break;
case 1: k=10;
}
t1=c/k;
if((wrote)||(t1!=0))
{
LCD_PUTCH(t1+'0');
wrote=1;
}
c-=(t1*k);
}
LCD_PUTCH(c+'0');
}
/****************************************/
void LCD_PUTSN (signed int c)
{
if(c<0)
{
LCD_PUTCH('-');
c*=(-1);
}
LCD_PUTUN(c);
}


/****************************************/
/* Write a string to the LCD */
/****************************************/
void LCD_PUTS (const char * s)
{
LCD_RS = 1; // write characters
while(*s)
LCD_WRITE(*s++);
}


/****************************************/
/* Initialize LCD */
/****************************************/
void LCD_INIT (void)
{
LCD_RS = 0; // write control bytes
DelayMs(15); // power on delay
LCD_D4=1;
LCD_D5=1;
LCD_D6=0;
LCD_D7=0;
LCD_STROBE();
DelayMs(5);
LCD_STROBE();
DelayUs(100);
LCD_STROBE();
DelayMs(5);
LCD_D4=0; // set 4 bit mode
LCD_STROBE();
DelayUs(40);

#if (LCD_ROWS==1)
LCD_WRITE(0b00100000); // 4 bit mode, 1 line, 5x8 font
#else
LCD_WRITE(0b00101000); // 4 bit mode, 2 or more lines, 5x8 font
#endif

LCD_WRITE(0b00001000); // display off
LCD_WRITE(0b00001100); // display on, curson off, blink off
LCD_WRITE(0b00000110); // shift entry mode, display not shifted
}




DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.