LCD Kütühane Sorunu

Başlatan NaMcHo, 17 Ağustos 2010, 19:01:58

NaMcHo

Ana Kod
#include <htc.h>
#include "delay.h" 
#include "lcd216_benim.h" 

void main(void) 
{
TRISB=0x00; 
TRISC=0x00;
PORTB=0x00;
PORTC=0x00;
lcd_hazirla();
imlec(1,1);
lcd_yaz("NAMCHO"); 
imlec(2,1); 
lcd_yaz("xxxxxxxx"); 
while(1);
}


lcd216_benim.c
#include <pic.h>
#include "lcd216_benim.h"
#include "delay.h"


void lcd_yaz(const	char  s[])
{  
   DelayUs(250);DelayUs(250);
   int i=0;
   while(s!='\0')
   {
   lcd_karakter(s[i]); 
   i++; 
   }
}

void lcd_karakter(unsigned char veri)
{
   rw=0;
   rs=1;
   e=1;
   lcd_port=(veri&0xF0);
   e=0;
   DelayMs(2);
   
   e=1;
   lcd_port=(veri<<4);
   e=0;
   DelayMs(2);
}

void imlec(unsigned int satir, unsigned int sutun)
{
   if(satir==1)
   lcd_ayar(0x80 + (sutun-1));
   else if(satir==2)
   lcd_ayar(0x80 + (0x40 + (sutun-1)));
}

void lcd_hazirla(void)
{
   lcd_ayar(0x28);   //4bit 5x8 2satir
   DelayUs(250);DelayUs(250);
   lcd_ayar(0x06);       //her karakterden sonra sağa kay.
   DelayUs(250);DelayUs(250);
   lcd_ayar(0x08);      //dip kapalı,yanıp sönme yok ,imlec gizli.
   DelayUs(250);DelayUs(250);
   lcd_ayar(0x0C);      //Disp acık,yanıp sonmez,imlec gizli.
   DelayUs(250);DelayUs(250);
   lcd_ayar(0x02);
   DelayMs(2);
   lcd_ayar(0x01);
   DelayMs(2);
}

void lcd_ayar(unsigned int komut)
{
   rw=0;
   rs=0;
   e=1;
   lcd_port=(komut&0xF0);
   e=0;
   DelayMs(2);
   
   e=1;
   lcd_port=(komut<<4);
   e=0;
   DelayMs(2);
}

void lcd_temizle(void)
{
   lcd_ayar(0x01);
   DelayMs(2);
}


lcd216_benim.h
#define rs	RC0
#define rw	RC1
#define e	RC2

#define lcd_port	PORTB

extern void lcd_yaz(const	char  s[]);
extern void lcd_karakter(unsigned char veri);
extern void imlec(unsigned int satir, unsigned int sutun);
extern void lcd_hazirla(void);
extern void lcd_ayar(unsigned int komut);
extern void lcd_temizle(void);


Cof,Isis : http://hotfile.com/dl/62740234/2d90afc/Proje_LCD.rar.html
Similasyonu çalıştırdığımda B portunda hareketlilik oluyor fakat Uyarı olarak sürekli
-Stack overflow executing call instruction
-Stack underflow executing return instruction

Bunları alıyorum ve lcd ye herhangi bisey yazılmıyor.

Yaptığım ana hata nedir?

@Acemi2010 dediğinizi yaptım düzeldi, stackoverflow uyarısını artık almıyorum fakat dediğiniz gibi lcd yede birsey yazdırabilmiş değilim,lcd_hazirla fonksiyonundaki ölümcül hatalar nelerdir, neden dolayı ne yapmam gerekiyor?

acemi2010

#1
Merhaba;
Stack Overflow vermesinin nedeni bu
while(s!='\0')


Yerine bunu yazmalısın;
while (s[i])


Stack overflow'dan kurtulsan bile sanki bana lcd_hazirla dosyasında fonksiyonunda ölümcül hatalar varmış gibi geldi. Bu yüzden yine LCD'de birşey göremeyeceksin.

Timuçin

EDİT : yada while(s[ i ] !='\0') yazsan da çalışır.

NaMcHo

#2
Sorunu düzelttim ama birkaç sorum olucak
void lcd_hazirla() 
{  
lcd_ayar(2);
lcd_ayar(40);
lcd_ayar(12);
lcd_ayar(6); 
lcd_temizle();
}

Lcd ye gonderilecek ilk ayarları lcd_hazirla fonksiyonuna yazdım,-CCS C programlama kitabında 0x02 ile 0x03 ün imleci basa getirdigini yazıyor bende 0x03 üde denedim fakat lcd ye hicbir sey yazılmadı 0x02 yapınca lcd duzgun calısıyor bunun sebebi nedir?

-
void lcd_yaz(const char  s[]) 
{
lcd_busy();
int i=0;
while(s[i])
veri_yolla(s[i++]);
}


Birde burda const char s[], tanımlamasında neden const kullanılıyor?

Not : CCS C ile pic programlama kitabına sadece konu anlatımı icin takip ediyorum.

orhanc

@namcho istersen bende hitech de çalışan 4 bit lcd kütüphanesi var...
i'm doing nothing... Giddy Up  http://www.drorhan.com

NaMcHo

#4
Duzelttim kutuphanemi suan calısıyor,genelde kendim yapmaya calısıyorum,
en son sormak istediğim ise 0x02 komutu ile 0x03 komutunun imleci basa gonderdiği yazıyor CCS ile C programlama kitabında fakat lcd ye gonderilecek ilk ayarları yaparken 0x02 yerine 0x03 gonderdigimde lcd ye hic birsey yazılmıyor ama 0x02 de sorun olmuyor,demekki CCS C ile PIC programlama kitabının bir yanlısı var,eger bu 2 deger aynı değil ise 0x03 ne işe yarar diye sormak istemistim.

2.Sorum :
void lcd_yaz(const char  s[])
{
lcd_busy();
int i=0;
while(s[i])
veri_yolla(s[i++]);
}

Burda neden const olarak tanımlıyoruz s[] dizisini? const olarak tanımlamassak hata veriyor derleyici aslında vermemesi gerektiğini düşünüyorum.

@fxdev  evet senin kitabını takip ediyorum suan:)
ilk önce senin örneğini denemiştim çalıştığını gördüm sonra bazı yerlerinin ne işe yaradığını tam kavrayamadım kendim yeniden bir tane yazdım.Lcd ye gonderilecek ilk ayar mutlaka 0x02 olmalıymıs ben bunu sonlara dogru yazmısım hep sorun bundan ibaretmiş.



teknikelektronikci

selam fxdev
senin lcd kütüphanesini kullaniyorum fakat bir degiskenin icerigini lcd de gösteremyiorum bu konuda ne yapmam gerek ?

int pwm1;
int pwm2;

pwm1=10;
pwm2=20;

seklinde degiskenler tanimlayip bu pwm1 ve pwm2 yi göstermek istiyorum tesekkürler
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

teknikelektronikci

Alıntı yapılan: FxDev - 14 Mayıs 2011, 22:32:11
Alıntı yapılan: teknikelektronikci - 14 Mayıs 2011, 19:18:17
selam fxdev
senin lcd kütüphanesini kullaniyorum fakat bir degiskenin icerigini lcd de gösteremyiorum bu konuda ne yapmam gerek ?

int pwm1;
int pwm2;

pwm1=10;
pwm2=20;

seklinde degiskenler tanimlayip bu pwm1 ve pwm2 yi göstermek istiyorum tesekkürler

lcd_gotoxy(1,1);
lcd_yaz("PWM1:");veri_yolla(pwm1/10+48);veri_yolla(pwm1%10+48);
lcd_yaz(" PWM2:");veri_yolla(pwm2/10+48);veri_yolla(pwm2%10+48);

Başka bir çözüm istersen;

#include <string.h>
char pwm[20]="";

lcd_gotoxy(1,1);
sprintf(pwm,"PWM1: %02d PWM2: %02d",pwm1,pwm2);
lcd_yaz(pwm);

İkinci yöntem birinci yönteme göre baya bir yer kaplar onu da söylemek isterim.


tesekür ederim fxdev
bu 1. yöntemdeki % ve / isaretlerinin anlami ne ? niye böyle yapioruz birde bu sayi atiyorum 999 olunca %100 veya /100 mü yapacaz ?
tesekür ederim
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

teknikelektronikci

Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!