PIC ile Dijital Saat ve Termometre

arkadaşlar ben PIC16F877 Entegresiyle digital lcd ekrandasaat,tarih ve sıcaklık gösteren bir proje yapıyorum...proteusda çalışan aşağıdaki kodum benim baskı devremde saat ve tarhite sorun yaratıyor ama sıcaklığı gösteriyor...saat ve tarih proteusda düzgün bie şekilde gösterirken simulasyon yaptığım zaman...baskı devrede saat: 00:00:00 'dan başlıyor ve tek tek artıyor..tarih ise 01/01/2010 dan başlıyor...elektriği kesince ve tekrardan elektrik verince baskı devreye tekrar saat ve tarih yukarıda yazdığım gibi baştan başlıyor...ben saat ve tarihh entegresine bağladığım 32.768 hz lik crystalimi oscilloscope ile ölçtüm onda signal var başka neyden kaynaklanabilir, bunun nedeni ne olabilir,bana yardımcı olursanız çok sevinirim..
Kod:
#define backlight PORTC.F0
#define sistemled portb.f1
#define outled    portc.f2
//buttons definitions
#define   btnEnter porte.f2
#define   btnEsc   porta.f2
#define   btnUp    porte.f0
#define   btnDown  porta.f4
#define   btnLeft  porta.f5
#define   btnRight porte.f1
unsigned short sec;
unsigned short minute;
unsigned short hour;
unsigned short day;
unsigned short date;
unsigned short month;
unsigned short year;
////////////////
 unsigned long temperature=0;
 unsigned int sicaklik=0;
 unsigned int isi=0;
 unsigned char isidegeri[6];
 unsigned char setdegeri[6];
 unsigned int isideger=0;
 unsigned int setdeger=0;
 unsigned char offset=20;
 unsigned char mode=0;
 //////////////
void initial_time();
void   read_time();
void       setting_time();
void    display_time();
void Transform_Time();
void sicaklikoku(unsigned char kanal,unsigned char* dizi);
void timemode();
void temperaturemode();
void main(){

initial_time();

while(1)
{
      while(1){
        switch (mode){
           case 1:  timemode(); mode=2;break;
           case 2:  temperaturemode(); mode=1;break;
           default:   mode=1; break;
        }
     }
}
}
void read_time()
{
  I2C_Start();               // Issue start signal
  I2C_Wr(0xA0);           // Address PCF8583, see PCF8583 datasheet
  I2C_Wr(2);              // Start from address 2
  I2C_Repeated_Start();               // Issue repeated start signal
  I2C_Wr(0xA1);           // Address PCF8583 for reading R/W=1

  sec= I2C_Rd(1);       // Read seconds byte
  minute= I2C_Rd(1);       // Read minutes byte
  hour   = I2C_Rd(1);       // Read hours byte
  day     = I2C_Rd(1);       // Read year/day byte
  month   = I2C_Rd(0);       // Read weekday/month byte
            I2C_Stop();        // Issue stop signal

}
void Transform_Time() {
  sec =  ((sec & 0xF0) >> 4)*10 + (sec & 0x0F);  // Transform seconds
  min=  ((minute & 0xF0) >> 4)*10 + (minute & 0x0F);  // Transform months
  hour   =  ((hour & 0xF0)  >> 4)*10  + (hour & 0x0F);    // Transform hours
  year     =   (day & 0xC0) >> 6;                            // Transform year
  day      =  ((day & 0x30) >> 4)*10    + (day & 0x0F);       // Transform day
  month    =  ((month & 0x10)  >> 4)*10 + (month & 0x0F);     // Transform month
}
void Display_Time() {

   Lcd_Out(1, 1,"Date:");
   Lcd_Chr(1, 6, (day / 10)   + 48);    // Print tens digit of day variable
   Lcd_Chr(1, 7, (day % 10)   + 48);    // Print oness digit of day variable
   Lcd_Chr(1, 8,47);
   Lcd_Chr(1, 9, (month / 10) + 48);
   Lcd_Chr(1,10, (month % 10) + 48);
   Lcd_Chr(1, 11,47);
   Lcd_Out(1,12,"2010");
   Lcd_Out(2, 1,"Time:");
   Lcd_Chr(2, 6, (hour / 10)   + 48);
   Lcd_Chr(2, 7, (hour % 10)   + 48);
   Lcd_Chr(2, 8,':');
   Lcd_Chr(2, 9, (minute / 10) + 48);
   Lcd_Chr(2,10, (minute % 10) + 48);
   Lcd_Chr(2,11,':');
   Lcd_Chr(2,12, (sec / 10) + 48);
   Lcd_Chr(2,13, (sec % 10) + 48);
}
void initial_time()
{
I2C_Init(100000); //DS1307 I2C is running at 100KHz
Lcd_Init(&PORTD); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
}
void timemode(){
    tekrar1:
       read_time();
       Transform_Time();
       Display_Time();
       Delay_ms(10);
      if(!btnEnter)             goto tekrar1;

}
void temperaturemode(){
unsigned char temp=0;
     Lcd_Cmd(LCD_CLEAR);                // Clear display
     Lcd_Cmd(LCD_CURSOR_OFF);           // Cursor off
     Lcd_Out(1,1,"Set : ");
     Lcd_Out(2,1,"Temp: ");
 tekrar:
     isideger=setdeger=0;
  //  sicaklikoku(0,isidegeri);
  // sicaklikoku(1,setdegeri);
     if(outled==1)if(isideger<=(setdeger-(unsigned int)offset))outled=0;
     if(outled==0) {if(isideger>=setdeger)outled=1;}

     Lcd_Out(1,7,setdegeri);
     Lcd_Out(2,7,isidegeri);
   if(!btnEnter) goto tekrar;   //enter tuşuna basılana kadar işlemi tekrarla

}

void sicaklikoku(unsigned char kanal,unsigned char* dizi){
       unsigned char i;
        sicaklik=ADC_Read(kanal);
         for(i=0;i<10;i++)
         {
              sicaklik+=ADC_Read(kanal);
              sicaklik=sicaklik/2;
         }
        if(kanal==0) {temperature = (long)sicaklik*1000;}
        else if(kanal==1){ temperature = (long)sicaklik*100;}
        temperature=(temperature/1023)*5;
        sicaklik = (unsigned int)temperature;
        if(kanal==0)isideger=sicaklik;else setdeger=sicaklik;
       // sicaklik = 4999;
        isi = sicaklik/1000;
        if(isi==0) dizi[0]=32;else dizi[0]=48+isi;

        isi = sicaklik-(isi*1000);
        isi = isi/100;
        if(isi==0){ if(dizi[0]==32)dizi[1]=32;else dizi[1]=48;}
        else if(isi>0){dizi[1]=48+isi;}

        sicaklik = sicaklik%100;
        isi = sicaklik/10;
        dizi[2]=48+isi;dizi[3]='.';

        isi=sicaklik%10;
        dizi[4]=48+isi;dizi[5]=0;

     }//
 
Moderatör tarafında düzenlendi:
Eğer proteusta dsn simülasyonu çalışıyorsa, emin ol ki yazılımda sorun yok. Sen eleman değerlerini tekrar kontrol et ve en önemlisi de pic'e programı yeniden yükle. Pic beslemesini +5 volt regüleden ver ve eğer regüle yoksa, küçük bir regüle devresi var bende, sana adresi vereyim oradan bakarak yapabilirsin. mesutcakir_28@hotmail adresi space alanında ortak paylaşıma bazı devreler sundum, oradan şifreli kilit uygulamasını bul ve orada ayrı bir devre halinde besleme kaynağı göreceksin, o devreyi ölçütlere göre yapıp kullanabilirsin...
eğer sorun devam ederse buraya yaz, yazılımı gözden geçiririz...
kolay gelsin...
 
sıcaklık ölçümü için kurduğunuz fonksiyonu değiştirebilrisiniz, sorun bu şekilde çözülemdiyse muhtemelen lm35 in bacaklarında bir sorun vardır, lm 35 e bağlanan dirençlerin değeri de bu konuda önemlidir, ben daha önce deneme yanılma ile doğru sonuçları bulumştm :)))
 
Saat entegresinin ikinci besleme girişine 3volt civarında bir pil bağlayın.Böylece voltaj kesilse bile kaldığı yerden devam edecektir.
 
Elimizde çok fazla dijital saat var saat göstergesi 5 saniye gösteriyor sonra tarihe geçiyor tuşa basmazsak tarihte kalıyo bunu tam tersine çevirmek için ne yapmamız gerekiyor yardımcı olabilirmisiniz
 
Bu saat pic ile yapılmış ise ( büyük ihtimal ) yazılımını tekrar yazmak yada kaynak dosyası elinizde ise düzenlemek gerekiyor.
 
Bana başta 30 adet daha sonra 300e yakın 13 e 6.5 boyutunda dijital saat lazım bu konuda yardımcı olabilecek birisi varmı bana
 
P10 paneller ile ve surucu kartlari ile yapsaniz nasil olur ? cok guzel projeler var. tarih sicaklik saat gosterebilirsiniz.

adetli temin daha kolay olur dusuncesindeyim.
 

Forum istatistikleri

Konular
128,185
Mesajlar
915,695
Kullanıcılar
449,956
Son üye
CharmanDear

Yeni konular

Geri
Üst