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.
lcd.c ve lcd.h dosyalarında hiçbir sorun yok. ben kendi devremi Proteus'ta çalıştırdım. normal çalışıyor
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?
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...
Şö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
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?
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.
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.
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.
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...
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 }
yeni mesaja git
Yeni mesajları sizin için sürekli kontrol ediyoruz, bir mesaj yazılırsa otomatik yükleyeceğiz.Bir Daha Gösterme