Pic ana döngü kilitlenme durumu

Başlatan bulut_01, 05 Ocak 2022, 23:42:19

bymrz

Merhaba,

Kesme içerisinde, başka yerde de kullandığınız bir fonksiyonu çağırdığınız oldu mu peki hiç?

bulut_01

Alıntı yapılan: bymrz - 06 Ocak 2022, 18:12:23Merhaba,

Kesme içerisinde, başka yerde de kullandığınız bir fonksiyonu çağırdığınız oldu mu peki hiç?

Evet var
YENİLMEZ..

bulut_01

#17
problemin kaynagını buldum rda kesmesinde iki tane getc(); kullandıgımdan kilitleniyor program kod asagıdadır tek getc(); kullanarak nasıl bir algoritma olusturabilirim ? rda kesmesinde getc() fonksiyonu aynı anda 2 kez kullanmamak lazım.

#int_rda
void haberlesme()
{
if(getc() == 0x55){
//
value = receive_data();
for(s = 0; s < 4 ; s++){
cmd[s] = getc();
}
//
}
YENİLMEZ..

Z80

Interrupt içinde bir kere getc() kullanabilirsin. O yüzden bu şekilde bayrak kullanmalısın.


short  ok_55  = false;       // '55' bayrağı 
short  ok_cmd = false;       // dört byte data hazır bayrağı

#int_rda
void haberlesme()
{

if (getc() == 0x55)
   {
     ok_55 = true;    	
     return;	
   }
   
if (ok_55 == true)
   {    
     cmd[s] = getc();
     s++;
     
      if (s == 4)
         {
            s = 0;
            ok_55  = false;
            ok_cmd = true;    // main içinde bunu kontrol etmelisin ve işi bitince 'false' yapmalısın 
         }       
    }


}

bulut_01

Alıntı yapılan: pkelle - 07 Ocak 2022, 03:02:56Interrupt içinde bir kere getc() kullanabilirsin. O yüzden bu şekilde bayrak kullanmalısın.


short  ok_55  = false;      // '55' bayrağı 
short  ok_cmd = false;      // dört byte data hazır bayrağı

#int_rda
void haberlesme()
{

if (getc() == 0x55)
  {
    ok_55 = true;    
    return; 
  }
  
if (ok_55 == true)
  {    
    cmd[s] = getc();
    s++;
    
      if (s == 4)
        {
            s = 0;
            ok_55  = false;
            ok_cmd = true;    // main içinde bunu kontrol etmelisin ve işi bitince 'false' yapmalısın 
        }      
    }


}

hocam maglesef sizin bu örneginiz çalışmadı.
YENİLMEZ..

power20

false/true  olan  bayrak bool olarak tanımlanması gerekmiyor mu?

bulut_01

for dongusu ile olan kod çalısıyor bu seferde rda taşması oluyor.Farklı sekılde yazdıgım çalışmıyor.neyi atlıyorum ikinci kodda ?
çalışan ama taşma yapan kod
if(getc() == 0x55){
ok_cmd=1;
//
if(ok_cmd == 1){
value = receive_data();
for(s=0;s<4;s++){
cmd[s] = getc();}}

buda denediğim ama çalışmayan kod
if(getc() == 0x55){
ok_cmd=1;
//
if(ok_cmd == 1){
value = receive_data();
cmd[s] = getc();
s++;
if(s == 4){
ok_cmd=0;
s=0;}
}
YENİLMEZ..

Z80

İşlemci usart üstünden 1 byte aldığı zaman "RDA" interruptına dallanır yani her interruptda 1 byte okuyabilirsin. Sen for döngüsüyle aynı datayı 4 kere okuyorsun. Bu yanlış bir yöntem.

Interrupt içinde "for.... while..." gibi döngüler kullanmamalısın, başka bir fonksiyona dallanmamalısın.
İşini bitirip hemen çıkmalısın.

Daha önceki kodu denedim çalışıyor fakat "getc()" ile okurken data kaybedebiliyor.
Interrupt içinde getc() ile bir değişkene atıp onu üzerinde işlem yapmak daha sağlıklı.

// global değişkenler

short	ok_cmd = false;     // bool da olabilir.. 
short   ok_55  = false;
char    cmd[5];
int     s=0;
char    gelen;


/********* RS-232 RECEIVE INTERRUPT ********************/

#INT_RDA
void	RS232_receive ()
{
  gelen = getc();
  if (gelen == 0x55)
	  {
	    ok_55 = true;    
	    return; 
	  }
	  
	if (ok_55 == true)
	  {    
	    cmd[s] = gelen;
	    s++;
	    
	      if (s == 4)
	        {
	            s = 0;
	            ok_55  = false;
	            ok_cmd = true;  // main içinde bunu kontrol etmelisin ve işi bitince 'false' yapmalısın 
	        }      
	    }
}

void main() 
{	   	
while(true)
{
	if	(ok_cmd == true)
	{
		printf ("DATA: %s \r\n",cmd);
		ok_cmd = false;
	}
}

}
 
"ok_cmd" true olduğunda "cmd" dizisinde data hazır demektir.

bulut_01

Alıntı yapılan: pkelle - 07 Ocak 2022, 21:12:24İşlemci usart üstünden 1 byte aldığı zaman "RDA" interruptına dallanır yani her interruptda 1 byte okuyabilirsin. Sen for döngüsüyle aynı datayı 4 kere okuyorsun. Bu yanlış bir yöntem.

Interrupt içinde "for.... while..." gibi döngüler kullanmamalısın, başka bir fonksiyona dallanmamalısın.
İşini bitirip hemen çıkmalısın.

Daha önceki kodu denedim çalışıyor fakat "getc()" ile okurken data kaybedebiliyor.
Interrupt içinde getc() ile bir değişkene atıp onu üzerinde işlem yapmak daha sağlıklı.

// global değişkenler

short	ok_cmd = false;     // bool da olabilir.. 
short   ok_55  = false;
char    cmd[5];
int     s=0;
char    gelen;


/********* RS-232 RECEIVE INTERRUPT ********************/

#INT_RDA
void	RS232_receive ()
{
  gelen = getc();
  if (gelen == 0x55)
	  {
	    ok_55 = true;    
	    return; 
	  }
	  
	if (ok_55 == true)
	  {    
	    cmd[s] = gelen;
	    s++;
	    
	      if (s == 4)
	        {
	            s = 0;
	            ok_55  = false;
	            ok_cmd = true;  // main içinde bunu kontrol etmelisin ve işi bitince 'false' yapmalısın 
	        }      
	    }
}

void main() 
{	   	
while(true)
{
	if	(ok_cmd == true)
	{
		printf ("DATA: %s \r\n",cmd);
		ok_cmd = false;
	}
}

}
 
"ok_cmd" true olduğunda "cmd" dizisinde data hazır demektir.


Hocam sizin bu örnek benim uygulamada çalışmıyor gelen her data menchster alt fonksiyon çözüyorum sonra keeloq olarak çözüyorum for ile calışsan kod sizinkinde çalışmıyor menchster alt fonksiyonu görmediğiniz için çalışıyor olarak var sayıyosunuz
YENİLMEZ..