pic takinca lcd ekrani kayboluyor

Başlatan selvi, 11 Ağustos 2013, 16:57:40

selvi

  lcd li devrede soyle bir sorun cikiyor.pic islemcisi takili değilken lcd de kutucuklar cikiyor(karartilar).sonra pic i takinca kararti da gidiyor.yani ekranda birsey gozukmuyor.
  devreyi denemek icin pbp ile basit bir program yazdim denedim lcd ekranina yazi geliyor.yani saglikli calisiyor.
  c ile yazdigim programda ise ilk paragrafta belirtigim sorun cikiyor.ama similasyonda calisiyor.
 
E    PORTB.0
RS  PORTB.1
RW  GND

  lcd icin ilk basta 1k lik pot bagladim.sorun cikinca potu 20k lik yaptim sorun devam etti.
 
Yaşam anlamlandırıldıkça kutsaldır....

blacklogic

osilatör ayarlarını yaptın mı ? Pic çalışıyor mu ? Bir led yak söndür gerçekte led yanıp sönerse çalışıyor demektir.

Tagli

Ekranin ust satirinin kutularla dolu olmasi, ekranin saglam oldugunu ancak reset ve ayar isleminin yapilmadigini gosterir. Kontrast ayari da bu sirada yapilabilir.

Kutular silindigine gore reset isleminin yapildigi ve ekranin temizlendigi varsayilabilir. Ancak yazilar cikmiyorsa, kodda baska bir hata var demektir.
Gökçe Tağlıoğlu

selvi

#3
kodlar asagidaki sekildedir:
  
#include <16f628a.h>
#fuses INTRC,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)

#define use_portb_lcd TRUE

#include <lcd.c>

#define std  pin_a4

//#byte   portb=0x06   // B portu "tus" ismine e?itleniyor.
char harf,a1=0,a2=0,b1=0,bilgi,tus=0,deger=0,sayi=0,bs=0;
int1 st=0,satir2=0;

char port_goster()
{
    if(deger==1)   harf='a';
    if(deger==2)   harf='b';
    if(deger==3)   harf='c';
    if(deger==4)   harf='d';
       
    return harf;  // Fonksiyon "harf" de?eri ile geri döner
}

/********* ANA PROGRAM FONKSY'YONU********/

void main ( )
{
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   set_tris_a(0b00111111);
   set_tris_b(0x00);   // B portu komple çy'ky'?

   output_b(0x00); // Y'lk anda B portu çy'ky'?y' sy'fy'rlany'yor
   
   lcd_init();

   printf(lcd_putc,"\f merhaba");
   delay_ms(200);
   
   while(TRUE)  // Sonsuz döngü
   {
       tekrar:
       tus=input_a();
       tus&=0b00001111;
       
       if (tus==10){write_eeprom(0,0);write_eeprom(1,0);write_eeprom(2,0);write_eeprom(3,0);}
      
       if(tus==10) {tus=0;st=1;a1=0;b1=0;a2=0;bs=0;sayi=0;deger=0;}
     
       if(st==1 && tus!=0)
       {
          basa:
          bs++;
          if (bs==1){a1=tus;while(input(std));goto tekrar;}
          if (bs==2 && tus!=11){a2=tus;b1=0;while(input(std));goto kontrol;}
          if (bs==2 && tus==11){a1*=10;while(input(std));goto tekrar;}
          if (bs==3) {b1=tus;while(input(std));}
          
          kontrol:
          deger=a1+b1;
          bilgi=port_goster();
          
          write_eeprom(sayi,bilgi);  // yazma iþlemi için bu yeterli ve daha az yer kaplar.
          sayi++; 
        
          git:
          if(tus==12) 
          {
            
            if (satir2==1)lcd_gotoxy(1,2); // Ýmleç 1.sütun, 2. satýrda
            
            printf(lcd_putc,"%c%c%c%c",read_eeprom(0),read_eeprom(1),read_eeprom(2),read_eeprom(3););
            sayi=0;a1=0;b1=0;deger=0;bs=0;satir2=1;tus=0;while(input(std));
          }
                                                                                                                                                                                                                                                                                
          if(a2!=0){a1=a2;a2=0;bs=1;goto tekrar;}
        
          tus=0;if(sayi==255)sayi=0;a1=0;b1=0;bs=0;
      }
   }
       
}


mesaj birleştirme:: 11 Ağustos 2013, 20:42:51

Alıntı yapılan: Tagli - 11 Ağustos 2013, 20:23:30
Ekranin ust satirinin kutularla dolu olmasi, ekranin saglam oldugunu ancak reset ve ayar isleminin yapilmadigini gosterir. Kontrast ayari da bu sirada yapilabilir.

Kutular silindigine gore reset isleminin yapildigi ve ekranin temizlendigi varsayilabilir. Ancak yazilar cikmiyorsa, kodda baska bir hata var demektir.

  pbp ile soyle basit bir program yazdim lcd dee yazilar cikiyor.

@ DEVICE pic16F628 'islemci 16F628A 
@ DEVICE pic16F628, WDT_ON 'Watch Dog timer kapali 
@ DEVICE pic16F628, PWRT_ON 'Power on timer acik 
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628, MCLR_OFF 'MCLR pini kullaniliyor. 
@ DEVICE pic16F628, INTRC_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, BOD_OFF
 
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
'DEFINE LCD_COMMANDUS 2000 'Command delay time in us
'DEFINE LCD_DATAUS 50 'Data delay time in us

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  '9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
 
CMCON=7           '16F628 de komparatör pinleri iptal hepsi giris çikis
OPTION_REG.7=1    'Dahili pull-up lar pasif yapildi
TRISB=%00000000
TRISA=%00011111
PORTB=0
PORTA=0
PORTA.0=0

CLEAR
PAUSE 200
LCDOUT $FE,1 
STAR:
LCDOUT $FE,2,"merhaba" 
LCDOUT $FE,$C0,"dunya"
PAUSE 300

 GOTO STAR
Yaşam anlamlandırıldıkça kutsaldır....

RaMu

   lcd_init();

   printf(lcd_putc,"\f merhaba");
   delay_ms(200);

// buranın ardına

while(1);

//ekleyip burada kalmasını sağlayarak denermisin,
//200 ms yazının görülebilmesi için kısa olabilir,
//buraya kadar lcd nin çalışmasında sıkıntı çıkaracak birşey yok,
//simulasyonda çalışıyor, zaten bende denedim,
//simulasyonda çalışıp gerçekte çalışmama durumu başıma gelmişti,
//sen yukarıdakini bir dene
//olmazsa lcd kurulumunu lcd init haricinde yapmak için birşeyler öneririm.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

selvi

Alıntı yapılan: RaMu - 12 Ağustos 2013, 03:22:40
   lcd_init();

   printf(lcd_putc,"\f merhaba");
   delay_ms(200);

// buranın ardına

while(1);

//ekleyip burada kalmasını sağlayarak denermisin,
//200 ms yazının görülebilmesi için kısa olabilir,
//buraya kadar lcd nin çalışmasında sıkıntı çıkaracak birşey yok,
//simulasyonda çalışıyor, zaten bende denedim,
//simulasyonda çalışıp gerçekte çalışmama durumu başıma gelmişti,
//sen yukarıdakini bir dene
//olmazsa lcd kurulumunu lcd init haricinde yapmak için birşeyler öneririm.


  belirttiginiz sekiilde denedim,olmadi.eger pbp ile  olmasi sorunun ayar sorunundan kaynakli ihtimalini yukseltiyor.c de mclr ayari icin birsey yapmaya gerek var mi.ben 4k7 direnc le 5v a cektim.
Yaşam anlamlandırıldıkça kutsaldır....

RaMu

#6
   // TODO: USER CODE!!

lcd_init();

delay_ms(50);
lcd_send_byte(0,0x00);
delay_ms(50);
lcd_send_byte(0,0x00);
delay_ms(50);
lcd_send_byte(0,0x00);
delay_ms(50);

lcd_send_byte(0,0x01);
delay_ms(50);
lcd_send_byte(0,0x02);
delay_ms(50);
lcd_send_byte(0,0x28);
delay_ms(50);
lcd_send_byte(0,0x0f);
delay_ms(50);
lcd_send_byte(0,0x06);
delay_ms(50);



lcd init yapınca ardından yukarıda yazdıklarımı ekleyerek bir dene,
bunlarıda lcd_init in bir parçasıymış gibi düşün,
bir defaya mahsus işlenecek biryerde olsunlar.

Bu arada lcd bağlantısını bu şekilde yapıyorsun değil mi, 4 bit mod.




Şşimdi farkettim, ccs c kodunda
#fuses INTRC,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT

INTRC dahili osilatör kullanıyorum demişsin,
ama anladığım kadarıyla harici 4MHz kristal ile devreyi çslıştırıyorsun, problem bu olabilir,
#fuses XT,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT

XT yazıp 4MHz harici kristal kullanacağını belirtmelisin.

MCLR kapatılamıyorsa, ayar yapılmadıysa 4.7k ile +5V a çekmek şart-uygundur.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

selvi

    soylediginiz sekilde kodlari ekledim.ayni problem devam ediyor.
    devrede ve simulasyonda da RW pini gnd ye cekmistim.sonra rw pinin i  rb2 ye cektim.sorun ayni.

   dahili kristal kullandim.farkli bir devrede sorun cikarmamisti.normal calisiyordu.
 
  forumu inceledim oyle bir sorunla karsilasani gormedim.sorunlar genelde simulasyonda ortaya cikiyormus.benim yazdigim program simulasyonda calisiyor.fakat gercekte calismiyor.sorun lcd kisminda gozukuyor.
Yaşam anlamlandırıldıkça kutsaldır....

sadogan

LCD.c içindeki bağlanıtlar fiziki bağlantıyla aynımı ?

frederic

2.Mesajınızdaki #fuses INTRC,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT satırını ;

#fuses INTRC,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT,NOMCLR şeklinde değiştirip deneyin.

sadogan

Flexible_lcd.c
#define LCD_DB4   PIN_D0
#define LCD_DB5   PIN_D1 
#define LCD_DB6   PIN_D2 
#define LCD_DB7   PIN_D3 

#define e   pin_D4 // LCD'nin E ucu RB5 pinine bağlı
#define rs  pin_D5 // LCD'nin RS ucu RB4 pinine bağlı
//////////////////////////////
 #define lcd_type 2          // 0=5x7, 1=5x10, 2=2 lines
#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};

void lcd_send_nibble( BYTE n )
 {
      output_bit(LCD_DB4, (n &  1)); 
      output_bit(LCD_DB5, (n &  2));  
      output_bit(LCD_DB6, (n &  4));    
      output_bit(LCD_DB7, (n &  8)); 
      delay_cycles(50);      
      output_high(e);      
      delay_cycles(40);      
      output_low(e);
      delay_cycles(20);
}
void lcd_send_byte( BYTE address, BYTE n )
{
    //  delay_cycles(40);
      output_bit(rs,address);
      delay_cycles(20);     
      lcd_send_nibble( n>>4);
      delay_cycles(20);
      lcd_send_nibble( n );
      output_low(rs);
      delay_cycles(20);
     
 }

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;
   }
  
}
void lcd_init() {
    BYTE i;
    output_low(rs);
    delay_us(20);
    output_low(e);
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(10);
    }
    lcd_send_nibble(2);
    delay_us(40);
    for(i=0;i<=3;++i){
    lcd_send_byte(0,LCD_INIT_STRING[i]);delay_us(50);}
    
         lcd_gotoxy( 1,  1);
        
      lcd_putc("LCD ............");
               lcd_gotoxy( 1,  2);
      lcd_putc("TESTTING........");  
    //     delay_ms(1000);
    
}

LCD.c kütüpha bunun ile değiştirip LCD bağlantılarını kürüphan içinden size uygun şekle getirip test
edebilirmisiniz.
not:lcd w/r gnd bağlı olmalı

selvi

  lcd dosyasinda rw pini rb2 ile bagli olmasi gerekiyor.orda bir degsiklik yapmadan direk gnd ye cekmistim.rb2 pinini rw pinine baglayinca sorun giderildi.
Yaşam anlamlandırıldıkça kutsaldır....