Elektrotekno.com Ana Sayfa || Programlanabilir Cihaz ve Elemanlar || Microchip Pic Serisi


Pic de LCD 'ye yazı yazdırırken Fonksiyona String Geçirme Hatası

Kayıt: 07 Şub 2008
Mesajlar: 47

Offline
EXELANS
Tarih: 08 08 2011 17:13

18f4520 ile kendi kutuphanem ile LCD'ye birşeyler yazdırıyorum.

Display_Yaz(); fonksiyonu ile gonderdigimde ekranda sacma sapan yazılar cıkarken. Bir sonraki satırda strcpy fonksiyonu ile direk yaptıgımda hatasız ekranda gorunuyor.

CCS C de fonsksiyonlara string gecirme nasıl yapılıyor burada hata ne olabilir.

Kod



char buffer[25];

void Display_Yaz(char * message)
{
   strcpy (buffer,(  char  *)message);
   
   LCD_Display();
   
}



void main (void)
{   

   Display_Yaz((char*)"EKRANDA HATALI GORUNUYOR");
   
   strcpy (buffer,( char  *)"NORMAL CALISIYOR");
   
   LCD_Display();
   
 
}




Reklamlar
Kayıt: 07 Şub 2008
Mesajlar: 47

Offline
EXELANS
Tarih: 09 08 2011 08:33

Fonksiyonu biraz değiştirdim Aşağıdaki gibi yaptım çalışıyor. ama sebebi ne olabilir aynı kodu Dev-CPP derleyicisinde falan yazıp ekrana bastırıyorum çalışıyor C derleyicilerinde deniyorum çalışıyor.
CCS C de çalışmıyor.
Kod



char dizi[10] ={"DENEME"};

void Display_Yaz(char *message)
{
   strcpy (buffer,(  char  *)message);
    LCD_Display();
}

void main(void)
{
   Display_Yaz(&dizi[0]);


   strcpy (buffer,( char  *)"NORMAL CALISIYOR");     
   LCD_Display();
}



CCS'nin Help dosyalarını bu durumla ilgili olarak karıştırırken bir yazı il karşılaştım.

Kod


How do I make a pointer to a function?
The compiler does not permit pointers to functions so that the compiler can know at compile time the complete call tree. This is used to allocate memory for full RAM re-use. Functions that could not be in execution at the same time will use the same RAM locations. In addition since there is no data stack in the PIC®, function parameters are passed in a special way that requires knowledge at compile time of what function is being called. Calling a function via a pointer will prevent knowing both of these things at compile time. Users sometimes will want function pointers to create a state machine. The following is an example of how to do this without pointers:
enum tasks {taskA, taskB, taskC};
run_task(tasks task_to_run) {
switch(task_to_run) {
case taskA : taskA_main(); break;
case taskB : taskB_main(); break;
case taskC : taskC_main(); break;
}
}


Buradan CCS'nin pointer kullanımına izin vermediği anlaşılıyor ve bunun yerine fonksiyon yazın deniliyor. ilginç gerçekten..
Başa dön
Kayıt: 12 May 2009
Mesajlar: 9
Konum: Eskisehir
Offline
altanonat
Tarih: 09 08 2011 09:14

EXELANS yazmış
Fonksiyonu biraz değiştirdim Aşağıdaki gibi yaptım çalışıyor. ama sebebi ne olabilir aynı kodu Dev-CPP derleyicisinde falan yazıp ekrana bastırıyorum çalışıyor C derleyicilerinde deniyorum çalışıyor.
CCS C de çalışmıyor.
Kod



char dizi[10] ={"DENEME"};

void Display_Yaz(char *message)
{
   strcpy (buffer,(  char  *)message);
    LCD_Display();
}

void main(void)
{
   Display_Yaz(&dizi[0]);


   strcpy (buffer,( char  *)"NORMAL CALISIYOR");     
   LCD_Display();
}



CCS'nin Help dosyalarını bu durumla ilgili olarak karıştırırken bir yazı il karşılaştım.

Kod


How do I make a pointer to a function?
The compiler does not permit pointers to functions so that the compiler can know at compile time the complete call tree. This is used to allocate memory for full RAM re-use. Functions that could not be in execution at the same time will use the same RAM locations. In addition since there is no data stack in the PIC®, function parameters are passed in a special way that requires knowledge at compile time of what function is being called. Calling a function via a pointer will prevent knowing both of these things at compile time. Users sometimes will want function pointers to create a state machine. The following is an example of how to do this without pointers:
enum tasks {taskA, taskB, taskC};
run_task(tasks task_to_run) {
switch(task_to_run) {
case taskA : taskA_main(); break;
case taskB : taskB_main(); break;
case taskC : taskC_main(); break;
}
}


Buradan CCS'nin pointer kullanımına izin vermediği anlaşılıyor ve bunun yerine fonksiyon yazın deniliyor. ilginç gerçekten..


Ben LCD'de birşey yazdıracağım zaman stringi char array olarak tanımlayıp yazdırıyordum. Bir sorunla karşılaşmamıştım. Bunun dışında LCD kütüphanesini kendinizin yazdığını söylemişsiniz. Oraya dönüp LCD_Display fonksiyonunu bir gözden geçirmenizi öneririm.

Başa dön
Kayıt: 07 Şub 2008
Mesajlar: 47

Offline
EXELANS
Tarih: 09 08 2011 10:36

Benim Yazmış olduğum kütühane yerine printf komutunu da denedim seri porta bastım yine hiç bir şey gelmiyor.
İkinci kodda bende dizi içerisine yazılacakları kaydettikten sonra gonderince benim fonksiyonumda çalışıyor printf de yani sorun CCS'nin pointer alması ile ilgili gibi gözüküyor.
Başa dön
Kayıt: 12 May 2009
Mesajlar: 9
Konum: Eskisehir
Offline
altanonat
Tarih: 09 08 2011 10:40

http://www.ccsinfo.com/faq.php?page=printf_to_string

Şu linki bir inceleyin belki işinize yarayabilir. Burada float bir sayının stringe nasıl yazdırıldığı anlatılmış.
Başa dön
Kayıt: 25 Hzr 2008
Mesajlar: 18

Offline
vertigo
Tarih: 10 08 2011 00:57

Öncelikle ilk yazdığınız kodda bir hata yok, gcc-4.4.3 ile derlenip calışıyor, burada sorun büyük ihtimalle
sizin kullanmış olduğunuz compiler'da ya da PIC mimarisinin tuhaflıklarından kaynaklanmakta.
Öneri olarak şunu da belirteyim zaten char array olarak fonksiyona geçtiğiniz bir parametreyi daha sonra
yeniden (char *)'a cast etmenize gerek yok.

Compiler'ınızın dökümantasyonunda belirtilen durum ise pointer kullanamayacağınız değil, function pointer
kullanamayacağınız bknz. http://c-faq.com/~scs/cclass/int/sx10a.html
Burada gerçekten garip olan PIC mimarisinde data stack diye birşey olmaması, PIC'de stack kavramının
sadece fonksiyonun return adresini tutan basit bir registerdan ibaret olması. Şurada bununla ilgili bilgiler
verilmiş buradan da anlaşılan microchip firması sanırım profesyonel bir mimari geliştirmek için biraz daha
uğraşmalı.
http://en.wikibooks.org/wiki/Embedded_S..._PIC_Stack
Başa dön
Kayıt: 07 Şub 2008
Mesajlar: 47

Offline
EXELANS
Tarih: 10 08 2011 18:13

vertigo ve altanonat ikinize de verdiğiniz cavaplar için taşekkür ederim her ikiside farklı yöntemler olarak kullanılabilir. Benim anlamadığım aynı kodu mplab C18 ile de derleyip pic e attım ve çalışıyor. Burada CCS derleyicisinin diğerlerinden farklı şekilde kodu yorumlaması söz konusu. CCS'nin C mantığına aykırı bu yöntemi kabul etmemesi şaşırtıcı gerçekten.

Bir not olarak yazayım (char*) cast etme işlemlerini aslında CCS de pek yaptığım söylenemez, ama kodu Mplab c18 de de yazdığım için orada bunları gerekli gereksiz her yerde kullanıyorum kullanmazsam hata veriyor.

Kod


////MPLAB C18 kodu
char buffer[10];
LCD_Yaz(char * message)
{
   strcpypgm2ram(buffer,(const rom char far *)message) ;
   Display_String();
}
}
void main (void)
{
      LCD_Yaz((char*)"MESAJ") ;
}


(Bu kod Mplab da sorunsuz çalışıyor.)
Başa dön



Pic de LCD 'ye yazı yazdırırken Fonksiyona String Geçirme Hatası


Benzer Konular
- PIC16F84 İle Yapılan Klavye Kontrollü Kayan Yazı Devresi + Çift Tabaka PCB Şema
- Wattmetre hatası
- rgb ledlerle havaya yazı

- ledcom kayan yazı

- Onur Bilke Abimizin Kayan Yazı devresinde kayan yazıda donma problemi
- havaya yazı
- PIC18F8723 Ana fonksiyona girene kadarki gecikme
- ATmega16 ile 8 Satır 16 Sütun Dotmatrix Kayan Yazı
- 48 sütun kayan yazı pic18f452

- smps, Hybrid sürücü hatası

- Matris LED Display İle Kayan Yazı Uygulaması

Sitemize üyelik ve içeriğin indirilmesi tamamen ücretsizdir. Sitemizde paylaşılan tüm dokümanlar (Tezler, makaleler, ders notları, sınav soru cevaplar, projeler) paylaşımcıların bireysel çalışmaları olup telif hakları kendilerine aittir ya da açık bir şekilde kamusal alana yerleştirilmiş dokümanların birer kopyalarıdır. Kişilerin bireysel çalışmalarını sitemizde yüklemesinde, sitemizde paylaşıma teşvik eden puanlama sisteminin de etkisi büyüktür. Bunlara rağmen hala size ait olan ve burada bulunmasına izin vermediğiniz dokümanlar varsa iletişim bölümünden yöneticilere bildirmeniz durumunda derhal silineceklerdir.
Powered by phpBB | Translated by phpBB Turkiye | Ads by Google Adsense | Design by Crazy Bat based