18f452 ile ccs c ile 2x16 lcd sürmek yardım!

Başlatan mr_knox, 20 Ocak 2012, 10:44:21

mr_knox

arkadaşlar merhaba hepinize iyi çalışmalar ve ilgileriniz için şimdiden teşşekkürlerimi sunuyorum.
gelelim konumuza ccs c derleyicisi kullanıyorum ve bir projede çok uzadığı için daha büyük hafıza alanı olan 18f452 denetleyicisini seçtim.
programı derledim mevcut çıkan hataları düzelttim. ama isiste  deneme yapacakken simülasyonu etkin duruma getirdiğimde lcd yi sürdüğüm d portu aktif olarak olarak gözükmüyor :( acaba ccs c kütüphanesindeki lcd driver dosyasımı uyumsuzluk gösteriyor? çünkü sırf lcd denemek için bir deneme yazıyorum 16f877a da sorun yok ama aynı denemeyi 18f452 ye göre değiştirip derlediğimde sonuç yok :( bu konuda tecrübeli arkadaşların yardımlarını rica ediyorum.

tekrardan iyi çalışmalar diliyorum....
kutsal kitapları okuyup anlamayan dindar okuyup anlayan ateist olur.  ( Nikola Tesla )

skara1214

yanlış hatırlamıyorsam void mainin üstünde lcd _d true gibi bir komut kullanıyordun biraz araştırırsan görürsün o komut lcd nin hangi porta bağlandığını söylüyordu onu eklememişsindir heralde.İyi çalışmalar...
Herkes ölür ama herkes gerçekten yaşamaz

mr_knox

#define use_portd_lcd TRUE 
#include <LCD.c>   
bu komutlardan bahsediyorsun galiba arkadaşım
bunları kullandım zaten hiç lcd sürmemiş biri değilim 16f877a da değişik 4-5 uygulama yapmış ve gerçek uygulamada çalıştırmışlıklarım var
ama yinede ilgin için teşşekkür ederim
kutsal kitapları okuyup anlamayan dindar okuyup anlayan ateist olur.  ( Nikola Tesla )

fahri-


mr_knox

Alıntı yapılan: fahri- - 20 Ocak 2012, 11:21:46
peki hangi yanlışlarını düzelticez?

bu soruyu anlamlandıramadım yanlışımı bilsem zaten ortalıkta bir problem kalmaz.
benim problemim kısaca şu 16f877a ile lcd uygulamaları yaptım fakat 18f452 ile yaptığımda yukarıdada anlattığım sonuç ortaya çıkıyor 18f452 ile lcd uygulama tecrübesi olan veya bu konuda fikir sahibi arkadaşların yardımlarını bekliyorum.
kutsal kitapları okuyup anlamayan dindar okuyup anlayan ateist olur.  ( Nikola Tesla )

fahri-

Arkadaşım kodlarını ve şemanı koymadan nasıl yanlışını bulacağız. Ne kodu yazdığını şemanı nasıl bilip de yorum yapalım.

mr_knox

kutsal kitapları okuyup anlamayan dindar okuyup anlayan ateist olur.  ( Nikola Tesla )

Pir-O

CCS C'nin kütüphanesi sorunlu ben de baya problem yaşadım. İnternetten bulduğum bir kütüphane var ben onu kullanıyorum sorunsuz çalışıyor.

// 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_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_E     PIN_B0
#define LCD_RS    PIN_B1
//#define LCD_RW    0
// 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

////  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         ////
//========================================

#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

pea

Ben de Lcd.c ile çok sorun yaşadım.Her ne kadar güncelleseler , farklı port desteği de sağlasalar sorun çıkarıyor.
Flex_lcd.c kullanıyorum sorunsuz.
Ancak şöyle bir durum var , Flex_lcd kullanırken Fast_io yapmak sorun çıkarabiliyormuş.

http://www.ccsinfo.com/forum/viewtopic.php?t=24661

mr_knox

@pir-0 arkadaşım evet dediğin flex_lcd driver bende de vardı hem elimdekini , hem senin paylaştığını d portuna uyarlayıp denedim ama hiçbir faydası olmadı :( @pae arkadaşım belirttiğin ve linini paylaştığın konuyuda uyguladım standart_io() komutunu değişen malesef bişey olmadı :(
ama ilgileri,niz için çok çok teşekkür ediyorum.18 f seri ile lcd uygulaması yapan arkadaş yokmu hiç?
kutsal kitapları okuyup anlamayan dindar okuyup anlayan ateist olur.  ( Nikola Tesla )

pea

18F'in config/fuse ayarlarını doğru yaptığına emin misin?
Bana osilatör ayarı hatalı gibi geldi.

mr_knox

#11
#include <18f452.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay (clock=4000000)
ve
setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

mevcut olan ayarlar bunlar ters bişey gözünüye çarptımı?
kutsal kitapları okuyup anlamayan dindar okuyup anlayan ateist olur.  ( Nikola Tesla )

BAHAR

Lcd'yi sürmek için porta'yı mı kullanıyorsun? Kendini diğer port'larda dene belki porta'nın bazı ayarları ile ilgili bir problem yaşıyor olabilirsin.

mr_knox

Alıntı yapılan: BAHAR - 20 Ocak 2012, 17:37:11
Lcd'yi sürmek için porta'yı mı kullanıyorsun? Kendini diğer port'larda dene belki porta'nın bazı ayarları ile ilgili bir problem yaşıyor olabilirsin.

evet denedim ccs c programının driver ları genelde b portu için yazılmış ben hem b portu hemde d portu için denedim  ama sonuç alamadım malesef:( yazının başında da dediğim gibi 16f877a da çalışıyor ama 18f452 de çalışmıyor bi sorun varsa bu ikisinin arasındaki farklarda var gibi görünüyor ama nerede halaa bulamadım :(
kutsal kitapları okuyup anlamayan dindar okuyup anlayan ateist olur.  ( Nikola Tesla )

BAHAR

C kullanmıyorum fakat benzer problemi bende yaşamıştım ufak bir incelemeden sonra, 16F877A gibi bir denetleyiciden 18F452 denetleyicisine aynı kodlar ile geçtiğin zaman kodların başından ufak bir satırı değiştirerek yada kaldırarak çözmüştüm. Ama şuan o satır aklımda değil ve muhtemelen adcon yazmacı ile ilgili olabilir.