strcmp sorunu 16f877a ve 18F4520

Başlatan Abdullahtekin, 27 Ekim 2017, 21:23:38

Abdullahtekin

//#include <16F877A.h>
#include <18F4520.h>
#device ADC=10

#FUSES HS   
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    


#use delay(crystal=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)


char komut[80];
int role0on[]={"led0on"};
int role0off[]={"led0off"};
int k=1;

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#INT_RDA
void  RDA_isr(void) 
{
   disable_interrupts(int_rda);
   gets(komut); 
   k=1;
   
   k=strcmp(komut,role0on);
   if(k==0)
      {
         
         printf("\n\r Led aktif \n\r "); 
         
      }
      
   k=strcmp(komut,role0off);
   if(k==0)
      {
        
         printf("\n\r Led pasif \n\r "); 
         
      }
      
   printf("\n\r kesme \n\r ");    
      
}

void main()
{

   /*setup_psp(PSP_DISABLED); // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
   setup_adc(ADC_OFF); // ADC birimi devre dışı
   setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
*/
   

   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
      enable_interrupts(INT_RDA);

   }

}


Arkadaşlar bir konuda yardıma ihtiyacım var. 877A sorunsuz çalışıyor fakat aynı kodlar 4520'de  kesmeye giriyor fakat strcmp çalışmıyor. Nerede hata yapıyorum, neden çalışmıyor anlayamadım.

vitruvius

strcmp()'un calismadigini neye dayanarak soyluyorsun?

Kesme icinde iki yerde de strcmp()'u cagirmadan bir satir once printf ya da breakpoint koyarak "komut", "role0on" ve "role0off" degiskenlerinin degerlerini soyler misin?

Abdullahtekin

Dedigim gibi ayni kod 877A 'da calisip 4520 de calismiyor.

vitruvius

Bu strcmp()'un calismadigi anlamina gelmez. strcmp()'un bekledigin gibi bir deger dondurmedigi anlamina gelebilir. O yuzden debug yapip bakmak lazim.

Dedigim degiskenlerin strcmp()'dan onceki, "k"nin de strcmp()'dan sonraki degerine debug yaparak bakip soyler misin?

vitruvius

Ayrica 877A icin yaptigin donanim ayarlarinin aynisi ile 4520'yi sorunsuz calistirabileceginden emin misin?

Abdullahtekin


Alıntı yapılan: vitruvius - 27 Ekim 2017, 22:11:39
Bu strcmp()'un calismadigi anlamina gelmez. strcmp()'un bekledigin gibi bir deger dondurmedigi anlamina gelebilir. O yuzden debug yapip bakmak lazim.

Dedigim degiskenlerin strcmp()'dan onceki, "k"nin de strcmp()'dan sonraki degerine debug yaparak bakip soyler misin?


Doğrudur. k değişkeni sıfır değeri almıyor. Sürekli 1.

vitruvius


Abdullahtekin

#7
Alıntı yapılan: vitruvius - 27 Ekim 2017, 23:26:53
"komut"un degeri ne?


komut değişkeninin içeriğini geri çağırdığımda benim gönderdiğim değer ile birebir aynı. Ama şunu farkettim, gönderdiğim komuta göre k değeri +1 ve -1 değeri alıyor. Ama hiç sıfır değeri almıyor. (k değişkenini unsigned olarak değiştirdim)

vitruvius

k'yi unsigned olarak tanimlamamalisin. strcmp()'in tanimlamasini okudun mu? int deger dondurur. Ayrica arguman olarak da char array alir.

Farkli "komut" degerleri icin verdigin "komut" degerini ve "k"nin aldigi degeri yazar misin? (k hangi "komut" degerlerinde negatif ve pozitif bir deger aliyor onlari yazsan yeterli)

Abdullahtekin

Strcmp fonk. Geri donus degerleri string.h icerisinde belirtilmis.
Burada benim icin asil sorun 877 de calisan kod neden 4520 de calismiyor. 4520 de demekki birseyler farkli, demekki biryerlerde eksik/ yanlis birsey var. Su an strcmp fonk +1 ve -1 degerleri uretiyor ve sifir degeri uretmiyor. Daha baska ne yapilabilir.?

Yuunus


fide


Merhaba.
Öncelikle şu gözüme çarptı.Role0on ve role0off değişkenlerini ibt tanımlayıp string atama yapmışsın.
Ve strcmp ile string ve int karşılaştırmadı yapıyorsun.


Seriporttan gelen veri içinde /r /n olabilir. Seriporttan ne geldiğinin önemi büyük. -1 alman karşılaştırılanlardan birinin daha kısa olduğu anlamına gelir. 1 ise eşit olmadığı.


Diğer bir konu efektif kod yazmak istiyorsan interrupt rutinini gets komutunda bitir. Burada 1 bitlik bir drğişkeni set et. Main içinde de bu değişkenin 1 olup olmadığını test et. Eğer 1 ise katşolaştırmaları yap, sey ettiğin değişkeni sıfırla. Strcmp, strcpy gibi string işlemleri yavaş yapılır ve beklemeye sebep olur. İnterrupt içinde beklemeye sebep olacak işlem yapılmaz.


Tahminin senin kodun 16f877de de çalışmıyor. 4520de çalışmamadı süpriz olmaz.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

Abdullahtekin

877 de calisan bir uygulamaydi. Farkli uzunlukta komutlar var ve bunlar 877 de sorunsuz calisiyor. Ayni string ve int karsilastirmayi orada da yapiyorum.

Simdi,  877 de calismasi mi imkansiz ? , 4520 de çalişmamasi mi. ?

fide

Merhaba.
Sadece kendimi mikroişlemci yerine koyup düşünmeye çalışıyorum. İnt tanımlama ve string atama var. Bu hataya sebep olur gibi geldi. Seri portla ve gelen verileri işlemekle yoğun şekilde uğraştım. Belirli ve belirsiz uzunluktaki stringlerin okunması işlenmesi ile yüzlerce satır  kod yazdım. Benim düşüncem stabil çalışmayacağı yönünde.
if(k==0)     
 {                  printf("\n\r Led aktif \n\r ");                }   
      k=strcmp(komut,role0off); 
  if(k==0)      
{                 printf("\n\r Led pasif \n\r ");          
      }

interrupta her girince kesme yazar çıkar.
Led aktif pasif yazmaz diyorum.


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

Abdullahtekin

Kesme icinde cok zaman harcariz, kesme icinde harici is yapariz, kod mantigina uygun degil vs. Bunlarda haklisiniz. Benim icin suan bunlar teferruat. Ben daha cok sizden sunu bekliyorum.
4520 nin farki ne ki, 877 de calisan kod 4520 ye gelince tökezliyor. 4520 su yönden 877 den farkli o sebeple calismiyor vs?