20mhz 16f877A ccs ve 2x16lcd

Başlatan muhittin_kaplan, 23 Ağustos 2010, 16:23:38

ahmet2004


Bence Lcd bağlantılarını yanlış bağlamışsındır.Ben denedim acaba bir şey mi var diye çalışıyor kodunda sorun yok.

20mhz 2x16lcd pic16f877a

muhittin_kaplan

Ahmet hocam, Aynı devreyi 4Mhz İle Çalıştırıyorum,ICSP ile hiçbirşey Sökmeden Deniyorum 20mhz Çalışmıyor. Ama Kontrast ı 0 bağlamıştım onu deneyeyim yarın

acemi2010

Merhaba;
CCS'yi hiç bilmiyorum.
lcd init'den geçmeden önce 200milisec (yada 300ms) bir bekleme verip deneyebilirmisiniz? Bu süre LCD'nin power up self setup'ı için gerekli.

Bir de yerinizde olsam lcd.c kütüphanesine girip kontrol sinyalleri için (en, rs, r/w) strobe'u (darbe sürelerini) uzatır öyle denerdim.

Timuçin


muhittin_kaplan


zamzam23


askuzucu

picin osilatorunde sorun olmasın?
bazen 4MHz de çalışırken 20MHz de çalışmıyor.

acemi2010

Alıntı yapılan: askuzucu - 26 Ağustos 2010, 10:50:12
picin osilatorunde sorun olmasın?
bazen 4MHz de çalışırken 20MHz de çalışmıyor.

Bir zaman, ben de buna benzer bir sorun yaşamıştım.
20 Mhz kullanıyor olmama rağmen configurasyonu HS yaptığımda çalışmıyor ama XP yaptığımda 20Mhz sorunsuz çalışıyordu

Timuçin

muhittin_kaplan

20mhz de led programı çalışıyor. ama ne yaptımsa 20mhz de lcd çalıştıramadım.

KAZIMUGUR

Sorunsuz çalışıyor.
Aşağıdakileri dene.
(Başka başlıklara bakılırsa format zamanın geçmiş. ::) )

// 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_D2 
//#define LCD_RW    PIN_D1 
//#define USE_LCD_RW   1
// 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 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 

/*Here's a test program for the Flex driver: 
Kod: 

#include <16F877.H> 
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP 
#use delay(clock = 4000000) 

#include "flex_lcd.c" 
    
//========================== 
void main() 
{ 
lcd_init();  // Always call this first. 

lcd_putc("\fHello World\n"); 
lcd_putc("Line Number 2"); 

while(1); 
} */


#use delay(clock=20000000) 
#include <lcdflex.c> 
//int a;


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
  // setup_pp(PMP_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);
   int8 a=0;
    lcd_init(); 
    
       while(TRUE) 
   { 
   
      for (a=1;a<=0xff;++a)   
      {  
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\ fn=%u",a);
       Delay_Ms(200);  
      }
    }
}

muhittin_kaplan

Sanırım Hocam Ben Bir Formatlayayım..

KAZIMUGUR

Fazla oynamadan kullanmadan dolaşmadan,
kuracaklarını kur , ayarlarını yap,
İMAJ al.(norton ve ya acronis)
Böylece sorun olduğunda uğraşmadan 10-20 dakikada tertemiz....

ErsinErce

Önceden 16F877-04, 16F877-20 gibi çeşitler vardı (hala var mı bilmiyorum), 04 olanı 4mhz in üzerinde çalıştıramıyorduk, acaba böyle bir problem olabilir mi? işlemcinin üzerindeki tam kod nedir acaba?

muhittin_kaplan

"A" hocam, Ben LCD ye Bağlıyorum.

muhittin_kaplan

sonucu yazmamışım.
lbaşka bir lcd ile denedim 20 de de çalışıyor.

muratti_70

@muhittin kaplan hocam,
Kullandığın lcd nin bilgisini verebilirmisin bende aynı sorunu yaşıyorum, 4 mhz de sorun yok 20 mhz de lcd de anlamsız yazılar çıkıyor ve sistemi 20 mhz de çalıştırmam gerekiyor malesef.
Herkese saygılar.
dijital elektroniğe aşığım :)