Pic16f877a ile Nextion Ekran Kullanımı

Başlatan saybatli, 31 Aralık 2017, 01:49:06

saybatli

Merhaba Arkadaşlar;

Nextion marka TFT ekran aldım. Ekranı tasarlardım ekrandaki alanları pic'den gönderdiğim verileri aktarabiliyorum ama ekrandan gelen verilerini pic'de okuyamıyorum. En son uğraşmlarım sonucu sadece ilk 2 karakteri alabiliyorum. Eğer ekrandan 3 karakter gönderirsem int_rda kesmesi bir daha çalışmıyor ve hiç bir bilgi almıyor. hazırladığım kod aşağıdaki gibidir.

Amacım TFT ekrandan ayarladığım veriyi pic'e gönderip LCD ekranda göstermek. Deneyimi olan bir arkadaş yardımcı olabilir mi?

#include <16F877A.h> // Kullanacagimiz pic'in kutuphanesini ekliyoruz.
#DEVICE PASS_STRINGS=IN_RAM 
#FUSES NOWDT                    //Watch dog timer kapatiyoruz
#FUSES NOBROWNOUT               //Brownout Reset kapatıyoruz
#FUSES NOLVP                    //Dusuk voltaj programlama kapalı

#use delay(crystal=20000000) // Osilator frekansı ayarlanıyor.
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


#define LCD_RS_PIN PIN_B4
#define LCD_RW_PIN PIN_B5
#define LCD_ENABLE_PIN PIN_B6
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
 
#include <lcd.c> // lcd.c dosyası programa ekleniyor


char klavye[80];
char islem;




// -------------------------//
// -----------ss--------------//


void yazigonder(char adi[],char deger[])
{
printf("%s.txt=",adi);
putc(0x22);
printf("%s",deger);
putc(0x22);
putc(0xff);
putc(0xff);
putc(0xff);
}

void degergonder(char adi[],int deger)
{
printf("%s.val=",adi);
printf("%i",deger);
putc(0xff);
putc(0xff);
putc(0xff);
}

void sayfaac(int sf) {

putc(0x70);
putc(0x61);
putc(0x67);
putc(0x65);
putc(0x20);
printf("0x3%i",sf);
//putc(0x30);
putc(0xff);
putc(0xff);
putc(0xff);

}

#int_rda // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
printf(lcd_putc,"\f");
 disable_interrupts(int_rda); // int_rda kesmesini pasif yap
 output_high(pin_c5); // RC5 çıkışı lojik-1
 //gets(klavye); // String ifadeyi al ve "klavye" adlı dizi değişkenine aktar.

 islem = getc();
 printf(lcd_putc,"%c",islem);
 
 output_low(pin_c5); // RC5 çıkışı lojik-0

}


void main()
{

   setup_adc_ports(no_ANALOGs);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   enable_interrupts(GLOBAL);

lcd_init();
char islem;

int say = 0;
int yuzde = 1;
   while(1) {


  enable_interrupts(int_rda); 

char f[]="t0";
char d[]="test";
yazigonder(f,d);


f="g0";
d="Deneme";
yazigonder(f,d);


char v[]="n0";
char j[]="j0";

degergonder(v,yuzde);
degergonder(j,yuzde);

delay_ms(1000);
yuzde++;

   }


}


 

saybatli


a.zorba

Bilenler bilir . Biz maraşlilar için şehir olarak şubat ay' i bayram ,kurtuluş ,yaz in gelmesiydi. Şimdi karalar in yas in ayı oldu.

saybatli

Alıntı yapılan: a.zorba - 01 Ocak 2018, 17:46:19
arama yapmasını biliyormusun  ?
https://www.picproje.org/index.php?topic=65814.0

Arama yapmasını çok iyi biliyorum. o konuyu bir çok kez okudum orda pic'den ekrana veri göndermeyi anlatmış. Siz benim yazımı okumadan rastgele cevap vermişsiniz

Kabil ATICI

Daha basit bir yöntem uygulayabilirsin. Nextion ekran ile iletişim sorunu olduğunu düşünüyorsan, bilgisayar üzerinden veri göndermeyi dene. Gönderdiğin veriler sağlıklı bir şekilde ulaşırsa, Nextion ekrana geç.


Programda gördüğüm kadarı ile kesme içine LCD'ye gönderme dahil birçok işi yığmışsın ve de birde uart kesmeyi kapatıyorsun. Eh çalışması şansına.
Kesmede sadece gelen veriyi bir değişkene yükle ve fonksiyonu içinde bu değer senin default değerinden farklı ise LCD ekrana yazdır. istiyorsan bunu bir dizi ve dizi indisi ile takip edebilisin.



ambar7

fide

Merhaba.
Kabil Atıcı doğru tespitte bulunmuş.
Özellikle seriportla pic iletişimde yapılacak her deneme önce usb seri çevirici ile yapılımalıdır. /r/n vb görünmeyen karakterler ortalığı karıştırabilir. Usb seri takip sizin işinizi çözecektir.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

saybatli

Alıntı yapılan: Kabil ATICI - 01 Ocak 2018, 18:52:58
Daha basit bir yöntem uygulayabilirsin. Nextion ekran ile iletişim sorunu olduğunu düşünüyorsan, bilgisayar üzerinden veri göndermeyi dene. Gönderdiğin veriler sağlıklı bir şekilde ulaşırsa, Nextion ekrana geç.


Programda gördüğüm kadarı ile kesme içine LCD'ye gönderme dahil birçok işi yığmışsın ve de birde uart kesmeyi kapatıyorsun. Eh çalışması şansına.
Kesmede sadece gelen veriyi bir değişkene yükle ve fonksiyonu içinde bu değer senin default değerinden farklı ise LCD ekrana yazdır. istiyorsan bunu bir dizi ve dizi indisi ile takip edebilisin.

PİC ile pc haberleşmesini aşağıdaki gibi kodla yaptım. Aynı haberleşmeyi ekran ile yapmaya çalıştığımda devamlı kesmede kalıyor. Sanırım enter tuşu yollamam gerekiyor ama ekrandan  enter komutu nasıl gönderilir bulamadım. O yüzden haberleşme için zaman aşımı olarak 5 sn ekledim. ama yine sadece ilk 2 karakter aldım. Sonra şunu farkettim peşpeşe 2 defa aynı bilgi gönderince önce ilk 2 karakter sonra tamamı şeklinde veri geliyor örnek olarak "deneme" yazınısı gönderiyorum "dedeneme" olarak geliyor. Hala tam olarak istediğim olmadı.

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,ERRORS,timeout=5000)

void serihaberlesme_kesmesi ()
{
char f[]="t0";
char d[]="aktif";
yazigonder(f,d);
 output_high(pin_c5); // RC5 çıkışı lojik-1
 gets(klavye); // String ifadeyi al ve "klavye" adlı dizi değişkenine aktar.
 output_low(pin_c5); // RC5 çıkışı lojik-0
}

fide

Merhaba. Kesme içinde verigönderme işlmi yapma.


Global bir dğişken tanımla.
Mesela rda_aktif=0; olsun.
İnt içinde bunu rda_aktif=1; yap.
While içinde de
if ( rda_aktif==1) şeklindeki kontrolün içine kodunu yaz. Sonra rda_aktif=0; ile bir sonraki ksme işlemine hazır ol.


Ekrandan yazdığın texti içine \r eklemeyi dene.
Yada texti uzunluğunu bilmiyorum ama şunu deneyebilirsin
Char text[10];
Rda içine
getc( text[0]);
getc( text[1]);
getc( text[2]);
getc( text[3]);

İl 4 byte veri gönder.
Sonra yukardaki aynı yöntemle rda jesmeyi kontrol et.
Kolay gelsin.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

saybatli

Alıntı yapılan: fide - 02 Ocak 2018, 01:44:44
Merhaba. Kesme içinde verigönderme işlmi yapma.


Global bir dğişken tanımla.
Mesela rda_aktif=0; olsun.
İnt içinde bunu rda_aktif=1; yap.
While içinde de
if ( rda_aktif==1) şeklindeki kontrolün içine kodunu yaz. Sonra rda_aktif=0; ile bir sonraki ksme işlemine hazır ol.


Ekrandan yazdığın texti içine \r eklemeyi dene.
Yada texti uzunluğunu bilmiyorum ama şunu deneyebilirsin
Char text[10];
Rda içine
getc( text[0]);
getc( text[1]);
getc( text[2]);
getc( text[3]);

İl 4 byte veri gönder.
Sonra yukardaki aynı yöntemle rda jesmeyi kontrol et.
Kolay gelsin.

teşekkür ederim yardımlarınız için sorunumu şu şekilde çözdüm. öncden boş bir karakter yollayım 0,5 sn sonra asıl veriyi yollayınca veri tam olarak geldi. Geldikten sonra başındaki boşluğu temizleyip kullanabiliyorum. Şuan takıldığım nokta 2 string ifadesini karşılaştıramıyorum. Aşağıdaki gibi birşey yapmak istiyorum ama düzgün olarak çalıştıramadım. deneme bilgisi gelince şu işlemi yap gibi.

Örnek :
if (gelen_bilgi == "deneme") {

......
}
İletiyi düzenle

fide

Merhaba.
Karşılaştırmayı strcmp ile yaparsın.
eşitse 0 verir eşit değilse 0 dan farklı sayı geri döner.

Örn:
include <string.h>

unsigned int esitmi;
char deg1[];
char deg2[];


            strcpy(deg1,"abc");
            strcpy(deg2,"abc");
            
            esitmi=strcmp(deg1,deg2);
            
            if (esitmi==0)   
            {
                  fprintf(comm_dbg,"SubTerminal eslesme\r\n");
}

Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

baran123

@fide oldukça iyi açıklamış.Sana tavsiyem bu ekran ile yoğun olarak çalışacak isen durum makinesi yöntemi yapman.
Hem bu şekilde kendine uygun bir kütüphane yazmış olursun.
Çok daha verimli olur.


ziyaretci

#11
Konu çözülmüş ama belki birilerinin ihtiyacını giderir.



Şuanda tam hatırlamıyorum biraz ara vermiştim ama aşağıda deney yaptığım kod parçacığı var. Ekrandan gönderdiğin veriler belli bir çerçeve bloğu ile gönderiliyor diye biliyorum yani keşfetmiştim. Aşağıda 7 baytı almışım 2. bayttan okumuşum ilk değeri. İlk iki değer veri gönderdiğin nesnenin id'sidi galiba. Yinede bir kontrol etmek lazım. Ben arayüz programının simülatöründen yararlanmıştım tabi api kodlar nextion sitesinde mevcut bir incele.

Simülatörde alt tarafta giden verilerin bloğunu gösteriyor.

int tampon[7] = {0};
int i=0,j=0;
#int_rda
void kesme()
{
disable_interrupts(int_rda);
for(j=0;j<7;j++)
{
tampon[j] = getchar();
}
if(tampon[2]==19)
{
output_toggle(pin_a0);
printf("t0.txt=\"A%u\"ÿÿÿ",i);
}
ELSE
if(tampon[2]==20)
{
output_toggle(pin_a0);
printf("t0.txt=\"B%u\"ÿÿÿ",i);;

}

TAMPON[2]=0; 
enable_interrupts(int_rda);
}



Ek olarak;
Birdaha hiçbir veri almamasının nedeni tampondaki verilerin hepsini almamış olmandan kaynaklanabilir. Ekrandan gelen veri bloğunun boyutunu bir incele derim ben. Ardışık kaç byte geliyor ise ona göre alıcıyı ayarla.

saybatli

Alıntı yapılan: erkantr67 - 22 Ocak 2018, 03:04:18
Konu çözülmüş ama belki birilerinin ihtiyacını giderir.



Şuanda tam hatırlamıyorum biraz ara vermiştim ama aşağıda deney yaptığım kod parçacığı var. Ekrandan gönderdiğin veriler belli bir çerçeve bloğu ile gönderiliyor diye biliyorum yani keşfetmiştim. Aşağıda 7 baytı almışım 2. bayttan okumuşum ilk değeri. İlk iki değer veri gönderdiğin nesnenin id'sidi galiba. Yinede bir kontrol etmek lazım. Ben arayüz programının simülatöründen yararlanmıştım tabi api kodlar nextion sitesinde mevcut bir incele.

Simülatörde alt tarafta giden verilerin bloğunu gösteriyor.

int tampon[7] = {0};
int i=0,j=0;
#int_rda
void kesme()
{
disable_interrupts(int_rda);
for(j=0;j<7;j++)
{
tampon[j] = getchar();
}
if(tampon[2]==19)
{
output_toggle(pin_a0);
printf("t0.txt=\"A%u\"ÿÿÿ",i);
}
ELSE
if(tampon[2]==20)
{
output_toggle(pin_a0);
printf("t0.txt=\"B%u\"ÿÿÿ",i);;

}

TAMPON[2]=0; 
enable_interrupts(int_rda);
}



Ek olarak;
Birdaha hiçbir veri almamasının nedeni tampondaki verilerin hepsini almamış olmandan kaynaklanabilir. Ekrandan gelen veri bloğunun boyutunu bir incele derim ben. Ardışık kaç byte geliyor ise ona göre alıcıyı ayarla.

Bu da işe yarayabilir ben farklı bir yolla çözdüm tam olarak bitince burada paylaşacağım