Dizinin ilk elemanını Lcd ye basamıyorum

Başlatan atillaa, 15 Ekim 2013, 20:52:31

atillaa

merhaba arkadaşlar projemde lcd'ye saat ve tarihi basmaya çalışıyorum. Tarihi doğru bir şekilde görüyorum ancak Saat lcd'de görünmüyor. Saat dizisinin elemanlarını tek tek bastığımda ise sadece ilk elemanı basmıyor. Neden kaynaklanabilir bu durum ?

fatih6761

139. satırda noktalı virgül koymayı unutmuşsunuz. Şaka bir yana hocam, kimsenin bu kadar az bilgiyle yardımcı olmasını beklemeyin. Hangi RTC entegresi, hangi iletişim protokolü, hangi mikrodenetleyici, hangi lcd ?

mistek

boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

atillaa

#3
Uygulamamda pic 16f690  ile ds1307 entegresi arasında I2C haberleşmesi yapıyorum daha sonra gelen Tarih ve Saat bilgisini ekrana basıyorum. I2C debugger ekranından veriler doğru geliyor.Sadece Saat dizisinin ilk elemanı ekrana basılmıyor. Lcd 2*16
zamanı okumak için kullandığım fonksiyon
void saat_oku(unsigned char *Tarih,unsigned char *Saat)
{ 
   char temp; 
   i2c_Start(); 
   i2c_SendByte(0xd0); 
   i2c_SendByte(0x00); 
   i2c_Start(); 
   i2c_SendByte(0xd1); 
 						  	//saniyeyi oku 
   temp=i2c_GetByte(0); 
   saniye=0x0f & temp; 
   saniye10=(temp>>4) & 0x7; 
                           //dakikayı oku. 
   temp=i2c_GetByte(0); 
   dakika= temp & 0x0f; 
   dakika10=temp >>4; 
 						  	//saati oku. 
   temp=i2c_GetByte(0); 
   saat=temp & 0x0f;    
   if(temp &0x40)			//12 saatmodunda mı 
   { 
      saatmodu=1; 
      saat10=(temp>>4) & 0x01; 
      pm=(temp>>5) &0x01;  
	  
   } 
   else 
   { 
      saatmodu=0; 
      saat10=(temp>>4) & 0x03; 
   }       
   
   			
					 		//haftanın gününü oku 
   haftaningunu=i2c_GetByte(0); 
  						 		//gunu oku 
   temp=i2c_GetByte(0); 
   gun=temp &0x0f; 
   gun10=temp>>4; 
  						 		//ayi oku. 
   temp=i2c_GetByte(0); 
   ay=temp & 0x0f; 
   ay10=temp>>4; 
  						 		//yılı oku. 
   temp=i2c_GetByte(1); 
   yil=temp & 0x0f; 
   yil10=temp>>4; 
   i2c_Stop();
   
    Saat[0]=saat10+'0';
	Saat[1]=saat+'0';
    Saat[2]=':';
	Saat[3]=dakika10+'0';
    Saat[4]=dakika+'0';
    Saat[5]=':';
	Saat[6]=saniye10+'0'; 
    Saat[7]=saniye+'0';

    Tarih[0]=gun10+'0';
    Tarih[1]=gun+'0';
    Tarih[2]='/';
    Tarih[3]=ay10+'0';
    Tarih[4]=ay+'0';
    Tarih[5]='/';
    Tarih[6]='2';
    Tarih[7]='0';
    Tarih[8]=yil10+'0';
    Tarih[9]=yil+'0';
    Tarih[10]='\0';
  
}


void main(void)
{
unsigned char Saat[10];
unsigned char Tarih[10];
//unsigned char saniye;

TRISC=0x00;
PORTC=0x00;
TRISB=0x00;
PORTB=0x00;
ANSEL = 0;
ANSELH = 0;
//ayarla(13,10,15,3,18,25,00);
lcd_init();/*
lcd_yaz("1.Saat Ayarla");
lcd_gotoxy(2,1);
lcd_yaz("2.Zaman Kurulumu");*/
saat_oku(Tarih,Saat);
lcd_yaz(Tarih);
lcd_gotoxy(2,1);
//lcd_yaz(Saat);
while(1)
{
//saniye=ds1307GetSec();

//lcd_yaz(Tarih);
//

veri_yolla(Saat[0]);
}
}


Lcd kütüphanesini hazır aldım Fırat Deveci'den
#include  <pic.h>
#include  "lcd.h"  // lcd.h dosyası tanımlanıp, değerler alınıyor
#include  "delay.h"  // Gecikme fonksiyonu tanımlanıyor

void lcd_busy(void)
{
DelayUs(250);
}
void lcd_komut(unsigned char c)  // Komut gönderme fonksiyonu
{
rw=0;     // LCD'ye yazma yapılacak
rs=0;     // LCD'ye komut gönderilecek
e=1;      // DüGen kenar tetikleme olduğu için E önce 1
lcd_port = ( c & 0xF0 ); // Yüksek değerlikli bitler gönderiliyor
e=0;      // E, 0 yapılıyor
lcd_busy();    //Belirli süre bekleniyor
e=1;      // E, 1 yapılıyor
lcd_port = ( (c & 0x0F)<<4 );  // DüGük değerlikli bitler 
e=0;      // E, 0 yapılıyor
lcd_busy();    // Belirli bir süre bekleniyor
}
void veri_yolla(unsigned char c) 
{
rw=0;
rs=1;  // Komut yolladan tek farkı, RS'nin 1 olması 
//FxDev.org  Sayfa 43
e=1;
lcd_port = ( c & 0xF0 );
e=0;
lcd_busy();
e=1;
lcd_port = ( (c & 0x0F)<<4 );
e=0;
lcd_busy();
}
void lcd_clear(void)    // LCD siliniyor
{
lcd_komut(0x1);
DelayMs(2);
}
void lcd_yaz(const char * s)  // LCD'ye string ifade gönderiliyor
{
lcd_busy();
while(*s)
veri_yolla(*s++);
}
void lcd_gotoxy(unsigned char x,unsigned char y) //LCD'nin belli
//bölgesine gidiliyor
{
if(x==1)
lcd_komut(0x80+((y-1)%16));
else
lcd_komut(0xC0+((y-1)%16));
}
void lcd_init()    // LCD ilk yükleme ayarları yapılıyor
{
rs = 0;
e = 0;
rw = 0;
DelayMs(15);
e=1;
lcd_komut(0x02);
DelayMs(2);
lcd_komut(CiftSatir4Bit);
lcd_komut(SagaYaz);
lcd_komut(ImlecGizle);
lcd_clear();
lcd_komut(BirinciSatir);
}

fatih6761

Hocam veri_yolla(Saat[0]) yaptığınıza ekrana hiçbirşey gelmiyor mu?

atillaa

evet hocam hiçbir şey gelmiyor. Mesela Saat[0] yerine Saat[8] yazıyorum onu lcd ye bastığımda görmem gereken değer görünüyor. :o

Klein

Saat[0]=saat10+'0';
yerine
Saat[0]=dakika+'0';
yazdığında değer görebiliyor musun?

atillaa

Alıntı yapılan: Klein - 15 Ekim 2013, 23:05:04
Saat[0]=saat10+'0';
yerine
Saat[0]=dakika+'0';
yazdığında değer görebiliyor musun?
yok hocam o şekilde de değer gelmiyor. İlk elemandan hiç değer okunmuyor. İsis deli etti beni demin doğru değeri gösterdi bir kere durdurdum tekrar çalıştırdım yine gitti

Klein

okuyamaman çok normal
Tarih dizisini 10 eleman yapmışsın.
11. eleman \0 atmışsın. 11. eleman da saat dizisinin ilk elemanı.

atillaa

Alıntı yapılan: Klein - 15 Ekim 2013, 23:15:44
okuyamaman çok normal
Tarih dizisini 10 eleman yapmışsın.
11. eleman \0 atmışsın. 11. eleman da saat dizisinin ilk elemanı.
Haklısınız hocam Tarih dizisini 11 eleman tanımlayınca düzeldi.