16f877 ile lcd süremiyorum

Başlatan barisispir, 10 Ağustos 2015, 15:41:30

barisispir

merhaba...

pic16f877 ile saat,takvim uygulaması yapmak istiyorum.

kodu yazıp derliyorum herhangi bir hata almıyorum..Fakat isis 8 de simulasyon kısmında LCD ye yazdıramıyorum.. ölçüm geliyo ds1302 ile doğru da gösteriyo saat ve takvimi ama lcd ye aktarma da sorun yaşıyorum... Yardımcı olur musunuz?
teşekkürler

atomx

Devre şeması ve kod olmaz ise yorum yapacak arkadaslar medyumluk yapacaklar. Aklima geleni soyleyim lcd nin rw bacagini kontrol et. Koda gore gnd ye cekilebilir.
Hüseyin TECER

tekosis

kardeşim öncelikle bu konu hakkında açılmış başlıkları bir incele, fikir sahibi ol. eğer çözüm bulamaz isen program şema vs. dokümanlarını paylaş. bu şekilde yardımcı olunması zor.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

polleme

Geçmişte benzer bir sorun yaşamıştım, Proteus dizinlerinden birindeki LCD.C olarak hatırladığım bir dosyada problem olduğunu öğrendim, bu dosyayı değiştirince sorun çözülmüştü. Benzer bir problem olabilir.

barisispir




#include <16f877.h>     // Kullanılacak denetleyicinin başlık                 // dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#define use_portb_lcd TRUE   // LCD B portuna bağlı
#include <lcd.c>     // LCD.c dosyası programa ekleniyor
#include <DS1302.c>  // DS1302.c dosyası programa ekleniyor

byte saniye,dakika,saat,gun,ay,yil,haftanin_gunu; // byte türünde değişkenler tanımlanıyor

//******************* ANA PROGRAM FONKSİYONU *******************
void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   lcd_init();  // LCD başlangıç ayarları yapılıyor
   rtc_init();  // DS1302 başlangıç ayarları yapılıyor

   rtc_set_datetime(10,8,15,1,17,18); // Tarih ve Saat ayarları yapılıyor

   while(1)
   {
      rtc_get_time(saat,dakika,saniye);       // DS1302'den saat,dakika,saniye bilgileri alınıyor
      rtc_get_date(gun,ay,yil,haftanin_gunu); // DS1302'den gün,ay,yil ve günün isim bilgisi alınıyor
   

      switch(haftanin_gunu)  // DS1302'den sayısal olarak alınan haftanın günü bilgisine
      {                      // metin olarak karşılık atanıyor
         case 1: printf(lcd_putc,"PAZ"); break; // Eğer "1" ise LCD'ye PAZ yaz
         case 2: printf(lcd_putc,"PZT"); break; // Eğer "2" ise LCD'ye PZT yaz
         case 3: printf(lcd_putc,"SAL"); break; // Eğer "3" ise LCD'ye SAL yaz
         case 4: printf(lcd_putc,"CRS"); break; // Eğer "4" ise LCD'ye CRS yaz
         case 5: printf(lcd_putc,"PER"); break; // Eğer "5" ise LCD'ye PER yaz
         case 6: printf(lcd_putc,"CUM"); break; // Eğer "6" ise LCD'ye CUM yaz
         case 7: printf(lcd_putc,"CTS"); break; // Eğer "7" ise LCD'ye CTS yaz
      }
      printf(lcd_putc,"\nSaat:%02d:%02d:%02d",saat,dakika,saniye); // LCD'ye saat,dakika ve saniye değerlerini yaz
      printf(lcd_putc,"\fT:%02d/%02d/20%02d ",gun,ay,yil); //LCD'ye gün,ay,yıl bilgileri yazdırılıyor
      delay_ms(1000); // 1 sn gecikme veriliyor
   }
}



arkadaşlar kod bu..şemayı da ekledim .

xoom

"ölçüm geliyo ds1302 ile doğru da gösteriyo saat ve takvimi ama lcd ye aktarma da sorun yaşıyorum"
LCD'de görüyormusun görmüyormusun karar ver ?

RaMu

#6
Muhtemelen lcd.c dosyasındaki pinlerin atama ayarlarını yapmamışsındır.
Aşağıdaki yöntemi kullanabilirsin:
(Ayrıca ds1302.c deki pin atamalarınıda kontrol etmelisin.)
#define use_portb_lcd TRUE   // LCD B portuna bağlı
#include <lcd.c>     // LCD.c dosyası programa ekleniyor

satırlarını sil yerine
#include <flex_lcd_baris.c>

yaz,
sonra eğer program proje dosyanda lcd.c diye bir dosya varsa onuda silebilirsin.
Ve aşağıdaki lcd kütüphanesini, .c uzantılı bir dosya haline getirip proje dosyana kopyala.
//Buradaki ayar bendeki Deneme Kartina göredir, istenilirse baska Pinlere cevrilebilinir.
//buradaki ayar barışın devresine göredir :)
#define LCD_DB4   PIN_b4 
#define LCD_DB5   PIN_b3
#define LCD_DB6   PIN_b2 
#define LCD_DB7   PIN_b1 

#define LCD_E     PIN_b0
#define LCD_RS    PIN_b1

//RW leri iptal etmiyoruz çünkü barış bağlamış
#define LCD_RW    PIN_b2 //Bendeki Deneme Kartinda LC_RW PIC'in GND Pinine bagli.Bu nedenle bu satiri iptal ediyoruz...
#define USE_LCD_RW   1   // Ayni sebepden bu satirida iptal ediyoruz !!    

//======================================== 

#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


Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

drozk

Şemada LCD'ye giden RB1 ve RB2 isimleri iki kere kullanılmış. Sanırım bu yüzden çalışmıyor. İsimleri düzeltip tekrar deneyin.

barisispir

"xoom" arkadaşım ds1302 entegresinde isis simulasyonunda saat takvim ölçüyo diyorum..entegre üzerinde görüyorum yani ölcümü ama lcd ye aktarma da sıkıntı yasıyorum yazdım dikkat edebildin mi bilemiyorum..nese..

yardımcı olan olmaya calısan diger arkadaşları tesekkur ederım cok sagolun dediklerinizi denicem..

barisispir

drozk arkdasım o hatayı farkettim değiştirdim fakat hata aynı onunla alakası yok yani..

RaMu

#10
Alıntı yapılan: barisispir - 10 Ağustos 2015, 20:41:23
"xoom" arkadaşım ds1302 entegresinde isis simulasyonunda saat takvim ölçüyo diyorum..entegre üzerinde görüyorum yani ölcümü ama lcd ye aktarma da sıkıntı yasıyorum yazdım dikkat edebildin mi bilemiyorum..nese..

yardımcı olan olmaya calısan diger arkadaşları tesekkur ederım cok sagolun dediklerinizi denicem..
Sakin olalım, burada birbirimize yardım etmek için yazıyoruz.

O gösterge birşey ifade etmez,
isisde sadece ds1302 yi çalışma alanına alıp
simulasyonu çalıştırdığımızda
ds1302 saat ve tarih değerlerini, isis simulasyonu bize gösterir.
Ayrıca bu saat tarih değerlerini bir şekilde okumak (misal pic ile)
ve herhangi bir gösterge üzerinde göstermek (lcd 7 segment display gibi)
tasarımı yapan kişiye kalmış.
Belkide sadece ds1302 yi kullanıp
gün içinde sabit bir saatte alarm çalınacak,
(misal ezan vakitleri için devre)
ve saat bilgiside gösterilmeyecek,
bu durumda projeyi tasarlayan devresini isis üzerinde denerken
acaba DS1302 şu an hangi tarih saati gösteriyor
işte bunu o ekstra isis göstergesinden öğrenebilir.

Veya tasarımı yapan, ds1302 den değeri doğru okuyup doğru gösterebiliyor mu
bunuda o ekstra göstergeden kontrol edebilir.

Çizdiğin son şemaya göre
benimde hatalı olarak vermiş bulunduğum
#define LCD_DB4   PIN_b4 
#define LCD_DB5   PIN_b3
#define LCD_DB6   PIN_b2 
#define LCD_DB7   PIN_b1 

#define LCD_E     PIN_b0
#define LCD_RS    PIN_b1

//RW leri iptal etmiyoruz çünkü barış bağlamış
#define LCD_RW    PIN_b2 //Bendeki Deneme Kartinda LC_RW PIC'in GND Pinine bagli.Bu nedenle bu satiri iptal ediyoruz...
#define USE_LCD_RW   1   // Ayni sebepden bu satirida iptal ediyoruz !!   

kısımlarındaki pin atamalarını düzeltmelisin,
eğer benim verdiğim lcd kütüphanesini kullanacaksan.

Halihazırda kullandığın lcd kütüphanesi
istediğin lcd pinini istediğin mcu pinine istediğin gibi bağlamana izin vermeyebilir,
benim verdiğim kütüphane esnek bağlantıya izin veren kütüphane.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

barisispir

merhaba, bahsettiğiniz lcd kütüphanesi oluşturdum. fakat bu sefer lcd de gösterdi ama yanlış gösteriyo?




eemuratozan

printf(lcd_putc,"\fSaat:%d:%d:%d\n",saat,dakika,saniye);
printf(lcd_putc,"T:%d/%d/20%d ",gun,ay,yil);


bir de bunlarla deneyin ne gibi bir değişiklik olacak bakalım ?
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

barisispir

malesef pek değişen bişey yook



eemuratozan

C portunu kullanıp kullanmıyacağını belirtmemişssin yani şunu ekle programın en başına #use fast_io(c)

program içinde de eğer ds1302 den veri alıosan set_tris_c(0xff); die belirtmen gerekir.

bir de bunları deneyelim bakalım ?
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.