16F877A PortA ve PortD lcd sorunu

Başlatan bytex, 15 Ekim 2013, 13:50:57

bytex

Merhaba arkadaşlar,

Aldığım pic eğitim setinde 2x16 LCD bağalantıları RS, RW VE E PortA' da A0,A1 ve A2 uçlarına bağlı, data uçları ise PortD D4,D5,D6 ve D7 uçlarına bağlı, bi çok şey denememe rağmen lcd yi çalıştıramıyorum, isis c kodlarını aşağıya ekliyorum burada nasıl bir hata yapıyorumki lcd ye yazmayı başaramıyorum, yardımcı olabilirmisiniz ? LCD ye yazma kısmını Serdar Çicek' in kitabından olduğu gibi yazdım, baştaki lcd tanımlamalarınıda kitaptan ve nette bulduğum bi çok örneğe göre değişik denemeler yaptım ama hiç bir şekilde çalıştıramadım...

http://dosya.co/7vgzvuuy6adi/lcd.rar.html


Pic geliştirme kartının bilgilerinide aşağıya ekliyorum

http://dosya.co/dlpz8z67lhl3/PIC_DEVOLOPMENT_BOARD.rar.html

Recep METE

Serdar Çiçek'in kitabından aldığın kodlarda bir hata yok.Çünkü ben çalıştırıyorum.Ancak kodları sen yazdıysan bir yerde parantezi veya köşeli parantezi eksik unutmuş olabilirsin.Altaş yayıncılığın sitesinde kitapta yazılmış kodlar hazır olarak var.Oradan indirip kullan bir de öyle dene.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

serhat1990

İnternete upload ettiğin dosyaları foruma'da eklersen ( devre şeması ve kod ) daha hızlı çözüm bulabiliriz . LCD pinlerinin donanıma göre tanımlandığına eminmisin ?

İyi çalışmalar dilerim ...

Recep METE




#include <lcd.c>     (Kütüphanesinde lcd dosyası karşılıkları bu şekilde ayarlanmış.)
                                                                   ////
////  Example of pin access:                                               ////
////     #define LCD_ENABLE_PIN  PIN_E0                                    ////
////     #define LCD_RS_PIN      PIN_E1                                    ////
////     #define LCD_RW_PIN      PIN_E2                                    ////
////     #define LCD_DATA4       PIN_D4                                    ////
////     #define LCD_DATA5       PIN_D5                                    ////
////     #define LCD_DATA6       PIN_D6                                    ////
////     #define LCD_DATA7       PIN_D7                                    ////



Fakat senin yazdığın kodlarda;

#define LCD_ENABLE_PIN  PIN_A0                                   
#define LCD_RS_PIN      PIN_A1                                   
//#define LCD_RW_PIN      PIN_A2                                   
#define LCD_DATA4       PIN_D4                                   
#define LCD_DATA5       PIN_D5                                   
#define LCD_DATA6       PIN_D6                                   
#define LCD_DATA7       PIN_D7 
////     

Bu şekilde yazılmış.Zannedersem "rw,rs,enable" çakışması var.Bunun için kütüphane dosyasına girerek pinleri yeniden ayrla muhtemelen düzelecektir.                                                     
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

bytex

#4
kodaları eklediğim yerde isis dosyasıda var, daha kolay anlaşılabilir diye o şekilde eklemiştim, kodları aşağıya ekliyorum, bord üzerinde ölçü aletiylede pin doğrulaması yaptım, upload yaptığım dosyaların içinde bordun donanımlara göre pin numaralarını vermiş, tekrar tekrar kontrol ettim hata bulamadım, bu nedenle isiste denedim ama oradada çalıştıramadım

#include <16F877A.h>


#FUSES XT                      
#fuses NOWDT
#fuses NOPROTECT
#fuses NOBROWNOUT
#fuses NOLVP
#fuses NOPUT
#fuses NOWRT
#fuses NODEBUG
#fuses NOCPD
#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(d)

#define LCD_ENABLE_PIN  PIN_A0                                   
#define LCD_RS_PIN      PIN_A1                                    
//#define LCD_RW_PIN      PIN_A2                                    
#define LCD_DATA4       PIN_D4                                    
#define LCD_DATA5       PIN_D5                                    
#define LCD_DATA6       PIN_D6                                    
#define LCD_DATA7       PIN_D7  
#define use_porta_lcd TRUE         //D portu lcd için ayrılıyor                                 
#define use_portd_lcd TRUE         //D portu lcd için ayrılıyor
#include <lcd.c>                 //lcd ait fonksiyonlar programa eklenir

int x;
float y;
char z;

void main()
{
   
   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);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_d(0x00);
   set_tris_a(0x00);
   
  lcd_init();
  x=10;
  y=32.6;
  
  while (1)
  {
  lcd_send_byte(0,0x0d);
  printf(lcd_putc, "\f   ccs c");
  delay_ms(1000);
  printf(lcd_putc, "\n Derleyicisi");
  
  delay_ms(1000);
  lcd_gotoxy(1,2);
  printf(lcd_putc,"\fx Degeri=%d",x);
  
  delay_ms(1000);
  printf(lcd_putc,"\fDIRENC");
   
  delay_ms(1000);
  z=lcd_getc(3,1);
  
  printf(lcd_putc, "\f%c",z);
  delay_ms(2000);
  }
   // TODO: USER CODE!!

}



mesaj birleştirme:: 15 Ekim 2013, 14:34:46

Alıntı yapılan: semfero - 15 Ekim 2013, 14:25:52


#include <lcd.c>     (Kütüphanesinde lcd dosyası karşılıkları bu şekilde ayarlanmış.)
                                                                   ////
////  Example of pin access:                                               ////
////     #define LCD_ENABLE_PIN  PIN_E0                                    ////
////     #define LCD_RS_PIN      PIN_E1                                    ////
////     #define LCD_RW_PIN      PIN_E2                                    ////
////     #define LCD_DATA4       PIN_D4                                    ////
////     #define LCD_DATA5       PIN_D5                                    ////
////     #define LCD_DATA6       PIN_D6                                    ////
////     #define LCD_DATA7       PIN_D7                                    ////



Fakat senin yazdığın kodlarda;

#define LCD_ENABLE_PIN  PIN_A0                                   
#define LCD_RS_PIN      PIN_A1                                   
//#define LCD_RW_PIN      PIN_A2                                   
#define LCD_DATA4       PIN_D4                                   
#define LCD_DATA5       PIN_D5                                   
#define LCD_DATA6       PIN_D6                                   
#define LCD_DATA7       PIN_D7 
////     

Bu şekilde yazılmış.Zannedersem "rw,rs,enable" çakışması var.Bunun için kütüphane dosyasına girerek pinleri yeniden ayrla muhtemelen düzelecektir.                                                     

ama lcd kütüphanesindeki bu kodlar örnek olarak yazıldığını görüyorum, yani sadece açıklama olarak, komut olarak bu şekilde göremedim, kitapta lcd dosyasından önce bu pinler belirtilirse geçerli olur yazıyordu, bende lcd dosyasından önce bu tanımları yaptım, ama yine sorunun nerden kaynaklandığını bulamaıyorum

serhat1990

CCS C kendi kütüphanesinde RS pini kullanılacak şekilde yazılmıştı yanlış hatırlamıyorsam . o yüzden kullandığınız kütüphanede bu pin kullanılıyor ise bu pini bağlamanız gerekiyor . Yada bu pinin kullanımını pasif ederek bu pini şaseye çekmeniz gerekiyor. Kullanılıp kullanılmadığını kütüphaneyi inceleyerek veya RS için mcu'da boşta bir pin tanımlayarak RS pinini belirttiğiniz pine bağlayabilirsiniz .

İyi çalışmalar , saygılarımla ...

robomaster

Değerli kardeşim çalışan bir kod çalışmıyorsa ve bu LCD problemi ise sorun gecikme rutinlerinden kaynaklanır çoğunlukla.
Örneğin 4mhz de çalışan bir işlemcide yazılan kod 20mhz de çalıştırılmaya kalkılırsa ve eğer gecikme rutinleri de bu gözeterek yazaılmamışsa Lcd ihtiyaç duyduğu sürelerin altında tepki veremiyor.
yani her delay(100ms) 100 ms denk gelmiyor.
Alfanümerik LCD ler için bu süreler bellidir.
Ben de çalışan bir LCD uygulaması için yeniden alt rutinleri düzenlemek zorunda kalmıştım.
Selamlar

RaMu

#7
Kodların çalışıyor sanırım biraz oynadım üzerinde ama sonra geri eski hallerine getirdim
eğer tam eski haline getirebildiysem tabi,
bu haliylede çalıştı,
aslında isis dosyasını açarsan problemli olduğu gözüküyor,
gönderdiğin proteus simulasyonunu sil at gitsin
zaten porta bağlantısıda yanlış bu söylenmiş,
senin kodlara göre yeni bir proeus8 simulasyonu baştan açıp bağlantı yaptım
benim oluşturduğum yeni dosya ile gönderdiğin kodlar çalışıyor
yani problem proteus hatasından kaynaklanıyor
belkide proteus7 den dosyayı alıp direk proteus8 e import etmişsindir
problem bundan kaynaklanmış olabilir böyle birşey benimde başıma gelmişti
dediğim gibi sıfırdan bir proteus simulasyonu yap ve dene göreceksin :)

Kodların derlenebilir çalışan hali böyle (benim denediğim hali)
#include <16F877A.h>
//#device adc=8

#FUSES XT                      
#fuses NOWDT
#fuses NOPROTECT
#fuses NOBROWNOUT
#fuses NOLVP
#fuses NOPUT
#fuses NOWRT
#fuses NODEBUG
#fuses NOCPD
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(d)
#define LCD_ENABLE_PIN  PIN_A0                                   
#define LCD_RS_PIN      PIN_A1                                    
#define LCD_RW_PIN      PIN_A2                                    
#define LCD_DATA4       PIN_D4                                    
#define LCD_DATA5       PIN_D5                                    
#define LCD_DATA6       PIN_D6                                    
#define LCD_DATA7       PIN_D7  
//#define use_porta_lcd TRUE         //D portu lcd için ayrılıyor                                 
#define use_portd_lcd TRUE         //D portu lcd için ayrılıyor
#include <lcd.c>                 //lcd ait fonksiyonlar programa eklenir

int x;
float y;
char z;

void main()
{

   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);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   //set_tris_d(0x00);
   //set_tris_a(0x00);
   
  /* 
   
   while(1)
   {
   output_high(pin_b0);
   delay_ms(300);
      output_low(pin_b0);
   delay_ms(300);
   }
  */ 
   
   
   
   
   
   
   
   
   
   
  lcd_init();
  x=10;
  y=32.6;
  
  while (1)
  {
  lcd_send_byte(0,0x0d);
  printf(lcd_putc, "\f   ccs c");
  delay_ms(1000);
  printf(lcd_putc, "\n Derleyicisi");
  
  delay_ms(1000);
  lcd_gotoxy(1,2);
  printf(lcd_putc,"\fx Degeri=%d",x);
  
  delay_ms(1000);
  printf(lcd_putc,"\fDIRENC");
   
  delay_ms(1000);
  z=lcd_getc(3,1);
  
  printf(lcd_putc, "\f%c",z);
  delay_ms(2000);
  }
   // TODO: USER CODE!!

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

bytex

konuda yardımcı olan arkadaşlar ve abilerim, sorun ccs compilerden çıktı, eski sürüm ccs c derleyicilerinde sadece port b ve port d kullanılabiliyormuş, yani alltaki gibi lcd port tanımlama eski sürüm derleyicilerde olmuyormuş, ben ise 4.068 versiyonunda derlemeye çalışıp duruyordum, 4.104 sürüme geçip derleme yaptığımda düzeldi ama 2 günden fazla süredir kafayı yedirdi bana.... son sürüm 4.068 midir bunun üzeride varmıdır acaba ? Sitesinde sürüm versiyonu ile alakalı bilgi verilmemiş...bu arada forumdaki herkesin bayramı mübarek olsun, insan kafayı bişey takınca herşeyi unutuyor.

#define LCD_ENABLE_PIN  PIN_A2                                   
#define LCD_RS_PIN      PIN_A0                                    
#define LCD_RW_PIN      PIN_A1                                    
#define LCD_DATA4       PIN_D4                                    
#define LCD_DATA5       PIN_D5                                    
#define LCD_DATA6       PIN_D6                                    
#define LCD_DATA7       PIN_D7


vatandas30

konu bayağı eski ama aynı bağlantıyı bende 16f628 de yaptım. rs,rw ve enable uçları a portunda, diğer 4 uç b portuna bağlı.
isiste simülasyonda çalıştı ama gerçekte çalışmadı. ccs c versiyon 5.012

sifirzero

Baglanti kodlari paylaşirsan yardimci olabiliriz inşAllah
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

vatandas30

deneme amaçlı sadece lcd bağlı. ccs c proje wizarddan yaptım. daha önce çok kez lcd li proje yaptım. bir de proje wizarddan deneyeyim dedim. external lcd kısmında bütün port pinleri var. bende rs, rw ve e uçlarını porta , data uçlarını portb seçtim hata vermedi. basit bir yazı yazdırdım. simülasyonda çalıştı. sonradan breadboardda denedim çalışmadı.

RaMu

Bende çok lcd li proje yapmıştım,
tecrübe sonrası led yak söndürden farkı yok gibi gelse de
her zaman hata yapılabiliyor.
Örnek:
https://www.picproje.org/index.php?topic=52180.0
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

vatandas30

üstadım. portb ye bağlı olarak çalıştırdım breadboardda. Daha önce birkaç yerde okumuştum portb veya varsa portd harici bağlanamaz diye. şimdiye kadarki projelerimde bende hep böyle bağlamıştım. proje wizardda gözüme çarptı, bütün pinler port farketmeksizin ayarlanabiliyor.
ben de merakımdan aynı bağlantıyı sökmeden sadece 3 pini değiştirdim, porta olacak şekilde. 20 kere de kontrol ettim. zaten lcd den başka birşey bağlı değildi.