bu tür lcd bağlantısında kart calısırken lcd yi yerinden sökünce kart da duruyor

Başlatan zamzam23, 25 Temmuz 2011, 17:33:12

zamzam23


enteresan bir sıkıntım var:
lcdye hiçbir komut göndermediğim bir zamnda lcd ekranı yerınden sokunce ana kart da çalısmayı bırakıyor duruyor sebebi ne olabılır?

Maxim

ama zaten temelde böyle birşey litaratüre ters değilmi :)
siz sanki devre çalışırken birşey söküp-takmak normalmişte, bu neden olmuyor gibi sormuşsunuz .

valla ben hatırlıyorum 100nf söküp taktım lcd ekran bozulmuştu

fahri-


zamzam23

bunu şuna binaen söylüyorum: az önce denedim bizim suan kullandıgımız kartta boyle bır olay yok yani lcd ekranı cıkarsak da calısmaya devam edıyor ekranı yerıne taktıgımızda 2 sn hıcbırsey yok sonra tekrar eskı gostermesı gereken seylerı gosteıyor. bunun sebebını acıklar mısın madem. işlemci PIC30f4011.bu işlemcinin özel lcd driveri mi var ona bakmam lazım

zamzam23

Alıntı yapılan: fahri- - 25 Temmuz 2011, 17:49:58
ccs'nin lcd driverı ile ilgili bu. lcd olmazsa program devam etmiyor.
yani ccs değilde baska bir dil olsa lcd ekransız da calısabılırmıydı?

fahri-

lcd den bir data beklemeyen driver da çalışır. ccs nin driverını modifiye edebilirseniz yine çalışır. derleyiyici ile ilgili değil bu. yazılan driver ile ilgili.

Okan AKÇA

eger lcdden bilgi okumuyorsanız söküp takmanız farketmez acıkcası ben cok söküp takıyorum ama dogru degil.

zamzam23

lcd den bilgi okuyorum şifreli giriş yaparken dogru şifre girip girmediğini kontrol ediyorum sanırım o fonksıyonu iptal edince driverin ıcınden, sıstem normale donecek ama tam deneyemedım aksam ustuydu cıkmam gerektı ıs yerınden ama yarın bı bakıcam olmazsa o fonksıyonu ıptal ederım o zmn şifre kısmını nasıl yapmalıyım?ana menüye girmeden once kullanıcı dogru sıfreyı gırmelı.

zamzam23

// 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_D3
#define LCD_RS    PIN_B2
#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
 0x0C,//0xf,                    // Display on
 1,                      // Clear display
 6                       // Increment cursor
 };

/*
byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xC, 1,6};

Value   Cursor  Blink
0x0C     Off      Off
0x0D     Off      On
0x0E     On       Off
0x0F     On       On

*/

//-------------------------------------
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_setcursor_vb(short visible, short blink) {
  lcd_send_byte(0, 0xC|(visible<<1)|blink);
}


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


kulandıgım lcd driveri bu. denemem sonucsuz oldu. RW pinini iptal edince de aynı sorun devam etti.

fahri-

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

bu satır programı kitliyor olabilir.

JKramer

Ben de onu diyecektim ama RW pinini iptal etmesine rağmen sorun devam etmiş; yani o if bloklarına hiç girmemiş.

fahri-

rw pinini iptal etmek yetmez bence. o satırı while döngüsünden kurtarmak gerekir.

zamzam23


SERRO EFE

O satırı iptal ettiğinizde problem ortadan kalkacaktır. Tecrübe etmiş bi tanıdığım var.

zamzam23

Malesef. RW satırını iptal etmeden sadece o satırı kaldırıp programı derledim ancak sorun devam ediyor. Ekranı devreden ayırdığım zaman programın çalısmasının devam etmesini istiyorum ancak olmuyor.mesela bazen de kartın calısması duruyor elimle lcd ekranın arkasındakı pinlere dokundugum zamn normale dönüyor.