Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

LCD problemi

Başlatan halnpx, 29 Aralık 2015, 14:32:26

halnpx

Arkadaşlar merhaba,

belki konuya bakıp hala mı, yine mi, diye söylenebilirsiniz ama ne yazık ki iki haftadır forumlarda dolanmaktan harap oldum ve halen aynı noktadayım. :(
son çare konu açmak durumunda kaldım.
umarım birileri yardımcı olur.

derdim özetle LCD de yazı alamamak. ne yaptığımı ise şu şekilde aktarayım:
kodları CCS C de yazıyorum.
proteusta simülasyon yapıyorum. simülasyonda sorun gözükmüyor, tabi burada proteus heralde birçok kabulü kendisi yaptığından pratikte aynı sonuçları göremiyoruz.
2x16 LCD kullanıyorum. bozuk olmasına ihtimal vererek başka LCD lerle de denedim sonuç aynı.
ekranda ilk satıda içi dolu kareler gözüküyor, ikinci satıda ise hiçbir şey yok.
bu durumda öncelikle bağlantıları kontrol ettim, defalarca kontrol ettim ama bağlantılarda sorun yok. süreklilik test cihazı ile de kontrol ediyorum yine aynı. LCD nin pinlerini lehimlerken birbirine temas etmesini kontrol ettim, ardaşık pinlerde kısa devre yok vb
MCU bacaklarına temas etmesini kontrol ettim sorun yok.
MCU beslemelerini kontrol ettim sorun yok.
LCD beslemesini kontrol ettim, ben emniyetli olması için 4.8V ile çalıştırıyorum.
arka plan ışığı için de 3.8V veriyorum.
10K Pot ile kontrastı ayarlıyorum. pot en açıkta iken kareler gözükmüyor, ksıtıkça kareler görünmeye başlıyor.
Daha sonra yaptığım aramalarda ilk satırda içi dolu kareler LCD nin voltaj verince gösterdiği default ekran görüntüsüymüş. öyle yazıyorlar. hatta deneyince gördüm MCU bağlamadan voltaj verince de aynı görüntü çıkıyor.
MCU nun diğer bacaklarındaki ve kristal bağlantısını kontrol ettim onlarda da sorun yok.
LCD nin bacaklarının hangi adresler olduğunu kontrol ettim, hem datasheet de hem de kartın üzerinde yazıyor ve programdaki tarif edilen adreslere bağlıyorum. bence burada da bir sorun yok gibi.
yazdığım kodda da esasen bir problem yok. LCD den görüntü almak hariç diğer kısımlar sorunsuz çalışıyor, ama LCD den görüntüyü bir türlü alamıyorum.
D portundan LCD bağlantısı yapıyorum.

programın kodu aşağıdaki gibi:

// Ana kütüphane ve işlemci kütüphanesinin bilgilerinin olduğu dosya çağırılıyor
#include "dnm-05a.h"

//#use fast_io(d)                  //Port yönlendirme komutlary D portu için geçerli

#include <math.h>                // Matematik işlemlerin kütüphanesi çağırılıyor
#include <lcd-h.c>               // LCD çalıştırmak için kütüphane çağırılıyor
//#define use_portd_lcd TRUE       // D portu LCD çalıştırmak üzere ayarlanıyor

   // Bütün değişkenler burada tanımlanıyor
   int i=0;
   long int m1_pos, m2_pos;
   float sure_high1=0, sure_high2=0;
   long int sure_low1=0, sure_low2=0;
   long int aci1=0, aci2=0;
   
void main()
{
   // Başlangıç ayarları yapılıyor
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   // Program kodları başlıyor
   
   set_tris_a(0xFF);       // A portu giriş yapılıyor
   set_tris_b(0x00);       // B portu çıkış yapılıyor
   output_b(0x00);         // B portunun çıkışları sıfırlanıyor
   set_tris_c(0x00);       // C portu çıkış yapılıyor
   output_c(0x00);         // C portunun çıkışları sıfırlanıyor
   set_tris_d(0x00);       // D portu çıkış yapılıyor
   output_d(0x00);         // D portunun çıkışları sıfırlanıyor
   set_tris_e(0xFF);       // E portu giriş yapılıyor
   
   setup_adc(adc_clock_div_32);     // Analog girişin saati tanımlanıyor
   setup_adc_ports(AN0_AN1_AN3);    // Analog portlar tanımlanıyor
   
   lcd_init();             // LCD başlatılıyor
   delay_ms(500);          // LCD nin başlaması için bekleniyor
   //lcd_send_byte(0, 0xd);  // LCD ekranda imleç yanıp sönsün
   
   output_high(PIN_B0);    // Cihazın çalıştığını gösteren led yakılıyor
   
   basla:                  // Sonsuz döngüye giriliyor
   
   if(input(PIN_E0)==0)
   {
      output_high(PIN_B1);
      delay_ms(500);
      output_low(PIN_B1);
      delay_ms(500);
      
      while(input(PIN_E0)==0)
      {
         for(i=0;i<10;i++)
         {
         output_high(PIN_B5);
         delay_us(1500);         // Servo sürekli cw yönünde dönüyor
         output_low(PIN_B5);
         delay_us(18500);
         }
      }   
   }   
   
   if(input(PIN_E1)==0)
   {
      output_high(PIN_B1);
      delay_ms(500);
      output_low(PIN_B1);
      delay_ms(500);
      
      while(input(PIN_E1)==0)
      {
         for(i=0;i<10;i++)
         {
         output_high(PIN_B5);
         delay_us(1440);         // Servo sürekli ccw yönünde dönüyor
         output_low(PIN_B5);
         delay_us(18560);
         }
      }   
   }   
   
   set_adc_channel(0);           // Analog girişten veri okunuyor
   delay_us(50);
   m1_pos=read_adc();
   
   set_adc_channel(1);           // Analog girişten veri okunuyor
   delay_us(50);
   m2_pos=read_adc();               
   
   sure_high1=ceil((0.8+1.4*(float)m1_pos/1023)*1000); // Analog veriler sinyale çevriliyor
   sure_low1=20000-(long)sure_high1;
      
   sure_high2=ceil((0.8+1.4*(float)m2_pos/1023)*1000); // Analog veriler sinyale çevriliyor
   sure_low2=20000-(long)sure_high2;
   
   for(i=0;i<20;i++)
   {
   output_high(PIN_B7);          // Analog veriye göre servo1 sürülüyor
   delay_us((long)sure_high1);
   output_low(PIN_B7);
   delay_us(sure_low1);
   
   output_high(PIN_B6);          // Analog veriye göre servo2 sürülüyor
   delay_us((long)sure_high2);
   output_low(PIN_B6);
   delay_us(sure_low2);
   }
   
   aci1=floor((float)m1_pos*180/1024);    // Servoların açıları hesaplanıyor
   aci2=floor((float)m2_pos*180/1024);
   
   // servoların açı değerleri LCD ye yazdırılıyor
   
   printf(lcd_putc, "\fMotor 1  Motor 2\n   %03Lu%c     %03Lu%c", aci1, 223, aci2, 223);
   
   goto basla;
   
}


LCD.c dosyasından şüphelendiğim için değişiklikler yaparak denedim.

kullandığım LCD.c lerden ilki:
///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2007 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE

struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;


#if defined use_portb_lcd
   //#locate lcd = getenv("sfr:PORTB")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf81
   #else
    #locate lcd = 6
   #endif
   #define set_tris_lcd(x) set_tris_b(x)
#else
   //#locate lcd = getenv("sfr:PORTD")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf83
   #else
    #locate lcd = 8
   #endif
   #define set_tris_lcd(x) set_tris_d(x)
#endif

#ifndef lcd_type
#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#endif

#define lcd_line_two 0x40    // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}


ikinci LCD.c dosyası:
//  pin baglantilari asagidaki gibi olmali
//  D="data ucu"
//  D0 = RS
//  D1 = RW
//  D2 = Enable
//  D4 = LCD D4
//  D5 = LCD D5
//  D6 = LCD D6
//  D7 = LCD D7

///////////////////////////////////////////////////////////////////////////
////                             LCD.C                                 ////
////                 Genel LCD modül sürücüsü                          ////
////                     düzenleme "asadam"                            ////
////                  web: [url=http://www.picproje.com]www.picproje.com[/url]                            ////
////  lcd_init()   program basinda mutlaka cagrilmali      .           ////
////                                                                   ////
////  lcd_putc("c")  LCD ye karakter gönderme (örnekte c gönderildi.   ////
////                     Asagidaki isaretler özel mana tasir           ////
////                      \f  LCD yi temizler                          ////
////                      \n  ikinci satirin basina gider              ////
////                      \b  bir posizyon geri gelir                  ////
////                                                                   ////
////  lcd_gotoxy(x,y) LCD yazma bölgesi ayarlanir                      ////
////                                                                   ////
////  lcd_getc(x,y) LCD den karakter çeker (x,y bölgesindeki  degeri   ////
////                                                          alir     ////
////                                                                   /////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////

// #define use_portb_lcd TRUE      ////     Hangi port kullanilmak isteniyorsa burada // isareti
// #define use_portc_lcd true      ////     cümlenin basindan kaldirilmali  
// #define use_portd_lcd true      ////     örn c portu icin 2. satirin basindaki // kaldirilmali



struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN rs;           // on to an I/O port to gain
           BOOLEAN rw;               // access to the LCD pins.
           BOOLEAN enable;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;


#if defined use_portb_lcd
   //#locate lcd = getenv("sfr:PORTB")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf81
   #else
    #locate lcd = 6
    #endif
   #define set_tris_lcd(x) set_tris_b(x)
   #endif


#if defined use_portc_lcd
  #ifdef __pch__
  #locate lcd = 0x82
  #else
  #locate lcd = 7
   #endif
  #define set_tris_lcd(x) set_tris_c(x);
#endif

#if defined use_portd_lcd
  #ifdef __pch__
 #locate lcd = 0x83
  #else
 #locate lcd = 8
  #endif
  #define set_tris_lcd(x) set_tris_d(x);
#endif

   

#ifndef lcd_type
#define lcd_type 2           // LCD tipi seçme  >> 0=5x7, 1=5x10, 2=2 satir
#endif

#define lcd_line_two 0x40    // ikinci satir için LCD RAM adresi


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // LCD yi, baslatmak için gönderilen bitler
                             


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // yazma modu için tüm pinler çikis
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // Okuma modu için tüm pinler giris



BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}


diğer LCD.c dosyası: (bu dosyayı kullanırken "//#define use_portd_lcd TRUE" ibaresini yorum yapıyorum)

// flex_lcd.c

// These pins are for the Microchip PicDem2-Plus board,
// which is what I used to test the driver.  Change these
// pins to fit your own board.

#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7

#define LCD_E     PIN_D0
#define LCD_RS    PIN_D1
#define LCD_RW    PIN_D2

// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

#define USE_LCD_RW   1     

//========================================

#define lcd_type 2        // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line


int8 const LCD_INIT_STRING[4] =
{
 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
 0xc,                    // Display on
 1,                      // Clear display
 6                       // Increment cursor
 };
                             

//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note:  !! converts an integer expression
// to a boolean (1 or 0).
 output_bit(LCD_DB4, !!(nibble & 1));
 output_bit(LCD_DB5, !!(nibble & 2)); 
 output_bit(LCD_DB6, !!(nibble & 4));   
 output_bit(LCD_DB7, !!(nibble & 8));   

 delay_cycles(1);
 output_high(LCD_E);
 delay_us(2);
 output_low(LCD_E);
}

//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine.  For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.     

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3

retval = 0;
   
output_high(LCD_E);
delay_cycles(1);

retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
 
output_low(LCD_E);
   
return(retval);   
}   
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;

output_high(LCD_RW);
delay_cycles(1);

high = lcd_read_nibble();

low = lcd_read_nibble();

return( (high<<4) | low);
}
#endif

//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60); 
#endif

if(address)
   output_high(LCD_RS);
else
   output_low(LCD_RS);
     
 delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_E);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

//----------------------------
void lcd_init(void)
{
int8 i;

output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

output_low(LCD_E);

delay_ms(15);

for(i=0 ;i < 3; i++)
   {
    lcd_send_nibble(0x03);
    delay_ms(5);
   }

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
   {
    lcd_send_byte(0, LCD_INIT_STRING[i]);
   
    // If the R/W signal is not used, then
    // the busy bit can't be polled.  One of
    // the init commands takes longer than
    // the hard-coded delay of 60 us, so in
    // that case, lets just do a 5 ms delay
    // after all four of them.
    #ifndef USE_LCD_RW
    delay_ms(5);
    #endif
   }

}

//----------------------------

void lcd_gotoxy(int8 x, int8 y)
{
int8 address;

if(y != 1)
   address = lcd_line_two;
else
   address=0;

address += x-1;
lcd_send_byte(0, 0x80 | address);
}

//-----------------------------
void lcd_putc(char c)
{
 switch(c)
   {
    case '\f':
      lcd_send_byte(0,1);
      delay_ms(2);
      break;
   
    case '\n':
       lcd_gotoxy(1,2);
       break;
   
    case '\b':
       lcd_send_byte(0,0x10);
       break;
   
    default:
       lcd_send_byte(1,c);
       break;
   }
}

//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;

lcd_gotoxy(x,y);

// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7)); 

output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);

return(value);
}
#endif


bazı görselleri aşağıda ekliyorum:

[url=http://postimg.cc/image/4nftzmmbf/][img]http://s9.postimg.cc/4nftzmmbf/20151228_231924.jpg[/img][/url]

[url=http://postimg.cc/image/fpojll8b7/][img]http://s13.postimg.cc/fpojll8b7/20151228_231934.jpg[/img][/url]

[url=http://postimg.cc/image/l09zwjou1/][img]http://s12.postimg.cc/l09zwjou1/20151228_231944.jpg[/img][/url]


birçok yerde gecikme beklemeleri veriyorum ama bir faydası olmadı. yukarıda yazılı olan kodda hepsi gözükmüyor, fayda görmeyince kodların içinden çıkardım.
kodlarda D portunu kullanmaya çalışıyorum, o yüzden mi olmuyor diye düşündüm B portuna göre revize edince de bir sonuç alamadım.
Hatta tercih etmememe rağmen B portu için sadece "Merhaba Dünya" diyen hazır kodlar bulup denedim yine olmadı.
uzun süre LCD.c deki konfigürasyonlarla uğraştım ama sonuç alamadım.
artık "LCD_init()" kısmının çalışmadığını düşünmeye başlıyorum.
tam da bu noktada "E" bacağına giden voltajı kontrol edeyim dedim. MCU açıldığında 4.5V-4.7V veriyor ve sonrasında 0.15V kadar iniyor.
"RW" bacağında 0V var, toprağa bağlayınca da durum değişmiyor.
"RS" bacağında 4.5V var.
"LCD_init(16)" diye bir şey de var, acaba bu nedir, derdimize derman olur mu?  ???
kullandığım kristal 10MHz. acaba bu kristal hızını düşürmeli miyim?
bir yerlerde MCU nun besleme ayaklarına 100nF kondansatör ekleyin diyordu. bir işe yarar mı bilmiyorum.
bir LCD daha alıp deneyeyim diyorum ama sanki sonuç değişmeyecekmiş gibi geliyor.
LCD uygulamasından tamamen vazgeçmenin eşiğindeyim >:( hatta dün içimden LCD leri kırmak geldi.

umarım tam olarak yaptıklarımı anlatabilmişimdir. neyi yanlış yapıyorum bilmiyorum.
lütfen birileri yardımcı olsun.
önerilerinizi bekliyorum.

sifirzero

#1
Çozum arkadasim boşta kalan data uclarini notr cek eksi uca bagla.

mesaj birleştirme:: 29 Aralık 2015, 16:49:19

Lcd kutuphanesi yanlis olsa zaten hex alamazsin calismaz
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

halnpx

denedim, ne yazık ki sonuç yine değişmedi  :(

sadogan

Devre şemanı görsek.

sifirzero

Aşama asama ilerle veya basit devrede dene lcd den yazi yazsin.lcd o kareleri veriyorsa lcd çalisiyor.bende ayni problemi yasadim yabanci birsitede bulmustum sonucunu bosta kalan data ucunu notr yapmistim.birde breadbord yapiyorsan kablolari kontrol et calisiyor mu
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Maxim

bir lcd bu kadar uğraştırmaması lazım
hangi işlemciyi kullanıyorsunuz ve lcd ayak bağlantısını yazarmısınız çabucak

izturk

4MHz kristalle bi dene. power up timer i aç. program ilk açıldığında direk lcd ye komut göndermesin önce gecikme veya başka işlemler yap. Bi de lcd pinlerini tinerle. Pasta kalıntısı çalışmamasına sebep olabilir. Başıma gelmişti

bc_esd

     devre şemanızı verirseniz daha kolay yardımcı oluruz.

kodlarda

#define use_portd_lcd TRUE  satırını    #include <lcd-h.c> satırından önce yazıp dener misiniz.

yani
--------
#include <math.h> 
#define use_portd_lcd TRUE      
#include <lcd-h.c>
-----             


olacak şekilde

muratdu


halnpx

öncelikle ilginize teşekkürler

#define satırını #iclude satırınınn önüne aldım
16f877a kullanıyorum
4Mhz kristalle de denedim
hatta sadece lcd ye "Merhaba" yazan bir kod denedim
power up timer la da denedim

devre şeması aşağıdadır.

[url=http://postimg.cc/image/nn8o0niur/][img]http://s13.postimg.cc/nn8o0niur/image.jpg[/img][/url]


[URL=http://dosya.co/a3hj4mzdvi9q/cls-01.DSN.html]cls-01.DSN -  108 KB[/URL]


bağlantılar dosyadaki gibidir, daha önce fotoğrafını da göndermiştim, fotoğraftan ne kadar anlaşılıyor emin değilim ama oldukça görünür şekilde çekmeye çalışmıştım.

ama sonuç değişmedi hatta elimdeki birkaç lcd de sonuç aynı.

sadece lcd için olan kod çok basit, lcd_init() öncesi ve sonrası 1sn beklemeler ekliyorum yine de olmuyor. kodda hangi satırda olduğunu kontrol etmek için led yakma ekledim bu kısımlar sorunsuz çalışıyor.

denemeler sırasında nasıl oldu bilmiyorum ama bir ara her iki satır da içi dolu kareler oldu ve ekrandaki yazılar değişmesi gerektiğinde ekran refresh oluyor ama yazı olarak bir görüntü olmuyor, sadece içi dolu kareler görünüyor.

en son olarak lcd_init() satırında donma yaşamaya başladım. belki lcd ile iletişime geçemediğinden de olabilir. sanırım bu kadar denemenin sonunda lcdler gitti  :D aynı benim kafa gibi ;D

aslında lcd nin bence de bu kadar uğraştırmaması lazım. bağlantıları da tekrar kontrol ettim, kısa devre kontrolünde pinlerle kartın bus yollarını (sarı bölgeler) kontrol ediyorum hepsinde ses geliyor.

buna rağmen ben lcd de problem olduğunu düşünüyorum, yeni bir lcd alıp pinlerini de aldığım yerde lehimletip orada kontrol ettirip almayı düşünüyorum.

artık lcd de daha fazla vakit harcamak istemediğimden lcd kısmına bir ara vericem heralde. diğer kısımlarda çalışmaya vakit harcıyayım bari, sürekli başarısızlık kötü bir his, biraz çalışan kısımlar üzerinde uğraşayım.

yine de önerileriniz varsa öğrenmek için istekliyim takip ederim ve yeni lcd denemesi sonrası durumu yazarım.

fahri-

Programınız proteus da çalışıyorsa büyük ihtimalle programınızda sıkıntı yok. Belki de pic i çalıştıramıyorsunuz. Önce pic in çalıştığından emin olun. Onun için pic in 1 ucundan 1 sn lik LED yakıp söndürün. 1 sn zamanlamanın tutup tumadığını kontrol etmeye çalışın.

Maxim

basit bir kod yazdım
aşağıdaki hex dosyasını hiç birşeyi değişmeden direk olarak işlemciye yükleyin
eğer gene olmadıysa malzemeleri değiştirin, muhtemelen bozuk bişey var

bazı detaylar var
-16F877A işlemcinin mclr ucu +5 voltta olması lazım
-osc 10mhz kristal olacak
-lcd nin kontras potu bağlı olacak
-lcd nin RW ucunu gnd ye bağlayın

diğer lcd bağlantıları aynı şemadaki gibi

:10000000000000308A00F5288030A100FE309420E6
:10001000013094207530A7003030C128A101A1170C
:10002000AF00FE3094202F089428A501AA00AB0150
:10003000A01125080319A0150530A4002730A90038
:1000400010302E200330A900E8302E20A9016430A2
:100050002E20A9010A302E202A083528A8002B08B6
:10006000A7002A08A600D5202608A600A403031985
:10007000A011250803193F28240203184628260842
:10008000031DA011A0194628303E94280800AD0099
:10009000081088108316081088100F308805831206
:1000A0002D08A01871283E30A7008030C1203330C1
:1000B000AC0085201330A7008830C1208520643033
:1000C000C02085206430C0202230AC00852028303C
:1000D00070200C30702006307020A0142D0871287C
:1000E0002014AC00201C7F288810033C031C8428AB
:1000F00084200730A700D030C1200314080020144A
:10010000FE3C031992288814201C201008140F307C
:1001100088052C08F03988040810AC0E20188528B2
:100120003230C0202D08F128A11B47280800A40068
:10013000A201240803178D000313250803178F005D
:10014000AA200319F1289420A40A0319A50AA20FD2
:100150009928F128831603178C170C14000000004F
:1001600083120C08F128A901A800FF30A807031C7E
:10017000A907031CF1280330A700E430C120B528EB
:10018000A701F63EA600A709031CCC28FE300000FC
:10019000A6070318C728A6070000A70FC628000057
:1001A0002618D2282618D4280800AB01AA0110303E
:1001B000AC00270DAA0DAB0D2808AA022908031CC4
:1001C000290FAB020318EB282808AA0729080318EF
:1001D000290FAB070310A60DA70DAC0BD9282608D5
:1001E000080083138312031308008301A001831600
:1001F0008501860187018312850186018701073009
:1002000083169F009C0001308312A900F4308A01FC
:10021000B4208A010420B00A8030A1008A010E2097
:100220003E308A01472030088A01152020308A019B
:1002300047208A0147208030A100C0308A010E206B
:100240000130A5002C308A01972064308A01B32048
:100250008A010B298A012A295000490043005000D5
:0A02600052004F004A004500000064
:02400E00723FFF
:00000001FF

bodrum48

Osilatör seçiminiz XT ise HS yapıp deneyin.

halnpx

biraz geç oldu ama ancak müsait olup bakabildim. hex kodu yükleyince veya osilatör tipini değiştirince de olmadı.
sizin de bahsettiğiniz gibi ben de artık sadece donanımdan şüpheleniyorum.
MCU LCD hariç gayet düzgün çalışıyor. elimdeki LCD leri denemeler sırasında bozmış olablirim, haftasonu yeni LCD alıp deneyeceğim.
sonucunu yazıcam.
herkese ilgisi ve yardımı için teşekkürler.