CCS C 16f877 NEXTION TFT VERİ ALMA SORUNU

Başlatan halilçakmak, 23 Şubat 2023, 08:49:57

halilçakmak

Merhabalar,

ccsc c ile pıc16f877 nextion ekran ile haberleşmeye çalışıyorum.
kodu aşağıdaki gibi oluşturdum, pıcden nextion ekrana veri gönderebiliyorum fakat ekrandan pıc e veri gönderemiyorum.#int_rda kesmesi ile ilgili bir problem olduğunu düşünüyorum. rx tx yapısının ccs c dilinde nasıl olacağı konusunda desteğinizi rica ederim.

kod:
#include <16F877A.h> 
#device  ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(b)
#use fast_io(a)
#use fast_io(c)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)

int16 numara=0;
int32 bilgi;
int32 volt=0;
int32 set=650000;

#INT_AD
void ADC_Kesmesi()
{

}
#int_rda
void RDA_isr()
{

numara=getc();
if(numara==5)
set=100;
disable_interrupts(int_rda);
clear_interrupt(int_rda);
}

void main()
{

setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T1_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
setup_adc(adc_clock_div_32);
setup_adc_ports(ALL_ANALOG);
enable_interrupts(GLOBAL);
set_tris_b(0x00);
set_tris_c(0xFF);
set_tris_a(0xFF);




while(true)
{

set_adc_channel(0);
delay_us(20);
bilgi=read_adc();
volt=1000*bilgi;


set++;
printf("n0.val=%Lu",set);putc(0xff);putc(0xff);putc(0xff);delay_us(20);
printf("n1.val=%Lu",volt);putc(0xff);putc(0xff);putc(0xff);delay_us(20);


enable_interrupts(int_rda);
}
}

forsa1975

...

#use rs232(baud=9600, UART, bits=8, stop=1, parity=N, stream=NEXTION, errors)// LCD haberleşme portu donanımsal olarak rx tx pinleri tanımlı

#int_rda
void RDA_isr()
{
disable_interrupts(int_rda); // yeni kesme olmasın 
numara=getc();
if(numara==5)
set=100;

//clear_interrupt(int_rda);
enable_interrupts(int_rda);// kesme serbest
}

void main()
{
 
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T1_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
setup_adc(adc_clock_div_32);
setup_adc_ports(ALL_ANALOG);
enable_interrupts(int_rda);// kesme aktif
enable_interrupts(GLOBAL);
...


alikeskinkilic

eğer veri alıyorsanız ama anlamsız ise gönderirken kullandığınız ffffff formatını alırken de kullanmadığınızdandır.eğer hiç veri gelmiyorsa bir arıza veya ekrandan hiç çıkış vermediğiniz anlamına gelir.
Hep meraktan

halilçakmak

merhabalar mevcut durumda ,picden nextiona veri gönderebiliyorum. problemsiz çalışıyor almak istediğim zaman hiçbir veri gelmiyor. şunu denedim sadece nextiondan  pice veri gönderdiğimde de problem yok ama gönder al bir arada olduğunda nextiondan veri okuyamıyorum. nextion tarafına online olduğumda verinin gönderildiğini görüyorum yazdığım kodda absürt olan bir yapı varmı yada rx tx için şu şekilde olması gerekir yönünde yorumunuzu rica ederim saygılarımla.

forsa1975

kesme oluşuyormu?
kesme içinde led toggle yap emin olmak için.



Emou

Hocam nasıl bir veri geliyor Nextiondan? Editördeki simülatörden görebilirsiniz. Hatta gerçek ekranla deneme yapıyorsanız onun yerine usb uart dönüştürücü ile simülatör kullanabilirsiniz (ya da denetleyiciyi de proteus vb. ile bilgisayar tarafına çekebilirsiniz.). Eğer kendiniz özel bir şekilde göndermiyorsanız char 5 şeklindeki veri tek başına gelmez çünkü.

Biraz kör bir geliştirme süreci yaşıyorsunuz gibi geldi bana.

@forsa1975 arkadaşın dediği gibi kesmeyi de doğrulayın. Kesme içerisine girdiğini doğruladıktan sonra gönderilen verinin ve alınan verinin eşleştirilerek doğrulanması gerektiğini düşünüyorum. Debug yaparak çözülebilecek bir sorun gibi geldi bana.

halilçakmak

merhabalar,
sistemde gördüğünüz üzere 2 adet kesme kullanıyorum 1.si adc kesmesi 2.si INT_RDA kesmesi adc kesmesi oluşuyor ve içine yazılan komutlar işliyor. Ama rda kesmesi oluşmuyor ve numara=getc(); komutunu yazdığım anda adc okuma işlemi de durup donuyor. bu komutu sildiğimde adc den veriler nextiona gönderiliyor. nextion ekrana 1 adet buton tanımladım butona basıldığında (5) bilgisini gönderiyor bunu sorgulayıp sayıcıyı 100 değerini atamasını yapmaya çalıştım. daha öncede söylediğim gibi picden nextiona veri gönderme komutlarını silip sadece nextion daki butonu okuduğumda veriler geliyor. verdiğiniz yanıtlar için çok teşekkür ederim .emeğinize sağlık saygılarımla.

Emou

Hocam CCS C ile UART deneyimim pek olmadığından oraya pek iyi yorum yapamıyorum ama göndermek istediğiniz veriyi bilgisayardan terminal ile gönderebiliyor musunuz?

Ayrıca Nextion'dan sadece 5 string'ini nasıl gönderiyorsunuz? Aşağıdaki şekilde sadece 5 string şeklinde gönderilebilir. Simülatörden çıktıyı teyit edebilirsiniz.

prints "5",1

forsa1975

Düzeltiyorum:
Daha önce göndermiş olduğum kodda gözden kaçırdığım bir yer olmuş.

Eğer rs232 tanımını

#use rs232(baud=9600, UART, bits=8, stop=1, parity=N, stream=NEXTION, errors)// LCD haberleşme portu donanımsal olarak rx tx pinleri tanımlı

bu şekilde yaptıysanız

numara=getc(); şeklinde değil.

numara=fgetc(NEXTION);  yazmalısınız.

ADC kesme kullanmayın. Gecikme koyun adc komutundan sonra.