Pic16f877a ile Nextion Ekran Kullanımı

Başlatan saybatli, 01 Ocak 2018, 01:26:24

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++;

   }


}


 

Burak


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


f="g0";
d="Deneme";


Bu satırlarda dikkatimi çeken birşey var .. karakter dizisini dinamik olarak bildirmişsin ilk evvela (ilk değer atayarak uzunluğunu derleyiciye ifade etmişsin) . Ardından dizi ismi pointer olarak kullanılmış çünkü string ataması yapılmak istenmiş lakin stringin statik uzunluğu taşmaya sebep olacak miktarda olduğundan bu bir hataya sebep olabilir olmasada başka başka adreslere veri yazmak durumunda kalınıyor olabilir .. .. Dizi uzunluklarının ilk uzunluklarını kendin belirle ve bunları miktar olarak büyük ve yeterli sayılardan seç örneğin ..;

char f[50]="t0";

Bunu hepsi için yapıp dene belki sorun bundan kaynaklıdır ..

Burak
Ω Gens Una Sumus Ω

saybatli

Alıntı yapılan: B - 02 Ocak 2018, 09:15:59

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


f="g0";
d="Deneme";


Bu satırlarda dikkatimi çeken birşey var .. karakter dizisini dinamik olarak bildirmişsin ilk evvela (ilk değer atayarak uzunluğunu derleyiciye ifade etmişsin) . Ardından dizi ismi pointer olarak kullanılmış çünkü string ataması yapılmak istenmiş lakin stringin statik uzunluğu taşmaya sebep olacak miktarda olduğundan bu bir hataya sebep olabilir olmasada başka başka adreslere veri yazmak durumunda kalınıyor olabilir .. .. Dizi uzunluklarının ilk uzunluklarını kendin belirle ve bunları miktar olarak büyük ve yeterli sayılardan seç örneğin ..;

char f[50]="t0";

Bunu hepsi için yapıp dene belki sorun bundan kaynaklıdır ..

Burak

O şekilde de olmadı ben sorunu farklı bir şekilde çözdüm. TFT  ekran gönderdiğim her verinin sadece ilk 2 karakterini aldım ne yaptıysam tam olarak alamadım. Daha sonra şöyle birşey fark ettim aynı veriyi peşpeşe gönderince ilk önce ilk 2 sonra tüm karakterlerin geldiğini gördüm. (Örnek olarak "deneme" yazısını "dedeneme" olarak geliyor) TFT ekrandan normal veriyi göndermeden önce boş karakter gönderip 0,5 sn sonra asıl veriyi gönderince sorunsuzca almak istediğim veriyi alıyorum. Gelen verinin sadece başındaki boşluğu silip kullanıyorum.  Şuan takıldığım nokta gelen string ifadeyi bir türlü karşılaştırmasını yapamadım.



char temp[10]="saat";
int sonuc;

sonuc = strcmp(temp,gelen_bilgi);

//


eşit olunca değerin 0 olması gerekiyor sonuc hep -1 olarak geliyor.

Burak

-1 geliyor ise bu demek oluyor ki temp , gelen_bilgi isimli veri katarından boyut olarak daha küçük (kısa) ...

Burak
Ω Gens Una Sumus Ω

saybatli

Alıntı yapılan: B - 03 Ocak 2018, 15:54:51
-1 geliyor ise bu demek oluyor ki temp , gelen_bilgi isimli veri katarından boyut olarak daha küçük (kısa) ...

Burak

2 string ifadeyi nasıl karşılaştırırım ? Şuan bir çok konu okuyorum ama istediğim gibi olmadı

Burak

Eğer gelen karakterlerin eşit olduğuna inanmana rağmen farklı boyutta birşey görüyorsan , onları bi ekrana bastırmayı ve gözlemlemeyi dene

Belkide karakterlerin sonlandırıcı (null terminator ) ile değilde '\n' gibi bir karakterle sonlandığı için boyutta farklılıklar oluşuyodur ..
Buna maalesef bu şekilde buradan fazla müdahale şansımız yok .. Ya Debug yapıp değişkenlerde biriken değerleri okuycaksın yada dediğim gibi yapacaksın .. Ama en azından karakterlerin boyutlarını okuyabilirsin ..


char arr[50]
int   i=0;

while(arr[i]) i++;
//i değeri senin dizinin içindeki karakter sayısını verecektir ..


Burak

Ω Gens Una Sumus Ω

saybatli

Alıntı yapılan: B - 03 Ocak 2018, 16:45:41
Eğer gelen karakterlerin eşit olduğuna inanmana rağmen farklı boyutta birşey görüyorsan , onları bi ekrana bastırmayı ve gözlemlemeyi dene

Belkide karakterlerin sonlandırıcı (null terminator ) ile değilde '\n' gibi bir karakterle sonlandığı için boyutta farklılıklar oluşuyodur ..
Buna maalesef bu şekilde buradan fazla müdahale şansımız yok .. Ya Debug yapıp değişkenlerde biriken değerleri okuycaksın yada dediğim gibi yapacaksın .. Ama en azından karakterlerin boyutlarını okuyabilirsin ..


char arr[50]
int   i=0;

while(arr[i]) i++;
//i değeri senin dizinin içindeki karakter sayısını verecektir ..


Burak

karakter sayısı değilde karakterleri karşılaştırabilir miyim ? Aşağıdaki gibi ve bir kaç farklı şekilde daha denedim.

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

......
}

Burak

#7
Bir önceki verdiğim kod sonucunda i'yi ne okudun ?
strcmp fonksiyonunu tekrar mı yazalım ? Bu gereksiz bir girişim olacaktır .. Adım adım ilerlemek gerekiyor ...

Fonksiyonun LIB dosyasındaki hali aşağıdaki fonksiyonun formatında ...

int my_strcmp(char *strg1, char *strg2)
{
    while( ( *strg1 != '\0' && *strg2 != '\0' ) && *strg1 == *strg2 )
    {
        strg1++;
        strg2++;
    }

    if(*strg1 == *strg2)
    {
        return 0; // strings are identical
    }

    else
    {
        return *strg1 - *strg2;
    }
}



Burak
Ω Gens Una Sumus Ω

Powered by EzPortal