Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Microchip PIC => Konuyu başlatan: bulut_01 - 05 Ocak 2022, 23:42:19

Başlık: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 05 Ocak 2022, 23:42:19
iyi günler picproje ailesi günlerdir uğraştığım ama içinden çıkamadıgım bir durum var pic16f1829 ile yaptıgım motor sürücü devresi var bu devreyi uzakdan kumandası ile kontrol ediyorum problemim gelen datalardan sonra pic kilitlendiği.Ancak kilitlenme esnasında alt fonksiyonlar kesmeler ve timer çalışıyor ana döngü kilitleniyor.Debug yaptıgımda kilitlenme anında program counter durdugunu görüyorum.Program counter neden durur ana döngü neden kilitlenir bu konuda fikirleriniz nedir ? Debug ekran resimleri koydum bir kaçtane.

(https://i.ibb.co/qsLsvbV/IMG-20220104-225332.jpg) (https://ibb.co/qsLsvbV)


(https://i.ibb.co/K7L9XtN/IMG-20220104-225316.jpg) (https://ibb.co/K7L9XtN)
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: tunayk - 05 Ocak 2022, 23:54:27
Herşey çalışıp da ana döngü kilitlenmez. Program kodundaki bir mantık hatasından dolayı bir yerde çakılıyor, veya döngü dışına kaçıyor muhtemelen.
 Kodlarınızı tekrar gözden  geçirin. Devreyi ve kodu parça parça test edin.
Tanımladığınız değişken tipleri ve adreslerini kontrol edin.  Biri diğerini eziyor olabilir. Değişkende taşma olabilir.
16bit ve 32bit sayıların ışlem yapıldığı yerlere bakın. Derleyici 32bitlik sayıyı 16bit olarak işliyor olabilir. CCS te var böyle huylar :)
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 06 Ocak 2022, 00:02:55
İşin garip yanıda o hersey çalışıyor ana döngü çalışmıyor rda timerlar alt fonksiyon hepsini tek tek test ettim çalıştıgını biliyorum sadece ana döngüdeki kodlar çalışmıyor rda aldıgım dataları birleştiriyorun menchster kodu çözüyorum + keeloq çözüyorum çıkan veri dogruysa çıkıs veriyorum bu kilitlenme olayı kumandadan art art datalar geldiğinde farklı zaman aralıklarında kilitlenme oluyor 1 haftadır kafayı yedirtdi bana denemediğim yöntem kalmadı artık.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: sifirzero - 06 Ocak 2022, 00:09:11
Hocam ufak bir delay yeri bile hataya sebeb oluyor.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 06 Ocak 2022, 00:11:07
Programda delay yok hocam çok mecbur kalmadıgım durum haricinde delay kullanmam.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: tunayk - 06 Ocak 2022, 00:14:11
Alıntı yapılan: bulut_01 - 06 Ocak 2022, 00:02:55İşin garip yanıda o hersey çalışıyor ana döngü çalışmıyor rda timerlar alt fonksiyon hepsini tek tek test ettim çalıştıgını biliyorum sadece ana döngüdeki kodlar çalışmıyor rda aldıgım dataları birleştiriyorun menchster kodu çözüyorum + keeloq çözüyorum çıkan veri dogruysa çıkıs veriyorum bu kilitlenme olayı kumandadan art art datalar geldiğinde farklı zaman aralıklarında kilitlenme oluyor 1 haftadır kafayı yedirtdi bana denemediğim yöntem kalmadı artık.

O zaman çok büyük bir ihtimalle program bir flag in 1 veya 0 olmasını beklediği bir yerde takılıp kalıyor. Eğer interrupt ile çalışan fonksiyonlar varsa , flag beklerken başka bir yere gidiyor, döndüğünde ise flag kaçmış oluyor muhtemelen.  Art arda gelen haberleşme taleplerinds  tıkanıyorsa ışlem sıralaması hatalıdır.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 06 Ocak 2022, 00:25:16
Ana döngüde 2 tane kod var 1cisi motordan saydıgı puls sayısı ayarlanmıs sayıya geldiğinde motor durdurması ikinci kodda ise rda buffer dolmus ise ana döngüdeki flag 1 yapıyorum ordan alt fonksiyona yönleniyor kilitlenme anında ana döngü toggle yaptıgım led devamlı yandıgını veya söndüğünü görüyorum gelen data tıkanma söz konusu olamaz buffer dolunca degerlendirip hemen siliyorum farklı bir durum var çözemedim.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: ilyas KAYA - 06 Ocak 2022, 01:51:39
Rf ile çalışıyorsanız kesme yapmak mantıklı değil çünkü civarda surekli parazit sinyaller vardir.  Her parazit sinyalde kesmeye gider ve çıkmaz.

Rf modülü söküp aynı veriyi kablo ile göndermeyi deneyin muhtemelen sorun çözüldüğünu göreceksiniz.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: sezgin05 - 06 Ocak 2022, 09:59:33
Uzaktan kumandalı bir scorboard projesinde aynı sorunu yaşamıştım. Ne yaptıysam içinden çıkamadım. Bende RF kod çözme işini küçük bir pic (12F675) ile yapmıştım. Sorunsuz çalışıyor yıllardır.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: alikeskinkilic - 06 Ocak 2022, 10:47:15
muhtemelen biliyorsundur ama ASM ile çalışıyorsan "pic simulator ide" nin yeni sürümü var yeni nesil picleri asm kodlar üzerinden gayet başarılı simule ediyor takıldığı komutu muhtemelen orada gösterir yanlış hatırlamıyorsam 30 gün beleş .o olmassa proteusta hex yerine "cof" dosyası ile simule et bazen gözden kaçırdığın flag takılmalara sebep oluyor asm nin inceliklerinden olur öyle şeyler
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: ilyas KAYA - 06 Ocak 2022, 12:22:40
Alıntı yapılan: sezgin05 - 06 Ocak 2022, 09:59:33Uzaktan kumandalı bir scorboard projesinde aynı sorunu yaşamıştım. Ne yaptıysam içinden çıkamadım. Bende RF kod çözme işini küçük bir pic (12F675) ile yapmıştım. Sorunsuz çalışıyor yıllardır.

Aynen bende bu şekilde yapıyorum.
Zamanlama kritik değil se yine tek işlemci ile de yaparım.

Eğer kesmeye bir süre surekli giriyor ise kesmeden çıkartmak gerekiyor gibi bir mantık kurulabilir ama işlem için toplam süre hatası daha fazla oluyor. Kesme yerine tek döngüde kayıp zamanı hesapla yapmak daha kolay.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 06 Ocak 2022, 12:33:05
Bu meselenin kesme ile ilgisi yok tek mcu ile rf uygulamaları tonla var sorunu yeniden gözden geçirecegim.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: dnacikaya - 06 Ocak 2022, 14:53:19
Alıntı yapılan: bulut_01 - 06 Ocak 2022, 12:33:05Bu meselenin kesme ile ilgisi yok tek mcu ile rf uygulamaları tonla var sorunu yeniden gözden geçirecegim.
Motor çalışırken etkiliyor olabilir.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: F493 - 06 Ocak 2022, 17:48:20
Selam,

Eğer datayı Uart üzerinden alıyorsanız, Overrun Error, Framing Error , Parity Error vb hataları kontrol etmenizde fayda var. Bundan dolayı sonraki dataları alamaz hale gelirsiniz.

Esen kalın.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 06 Ocak 2022, 18:07:09
Alıntı yapılan: F493 - 06 Ocak 2022, 17:48:20Selam,

Eğer datayı Uart üzerinden alıyorsanız, Overrun Error, Framing Error , Parity Error vb hataları kontrol etmenizde fayda var. Bundan dolayı sonraki dataları alamaz hale gelirsiniz.

Esen kalın.
Sorunum ana döngü yani while altındaki kodların çalışmaması kilitlenmesi kesmelerde timer vs gibi kısımlarda sorun yok while altındaki kodlar çalışmaması.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bymrz - 06 Ocak 2022, 18:12:23
Merhaba,

Kesme içerisinde, başka yerde de kullandığınız bir fonksiyonu çağırdığınız oldu mu peki hiç?
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 06 Ocak 2022, 19:46:32
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
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 06 Ocak 2022, 23:38:38
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();
}
//
}
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: Z80 - 07 Ocak 2022, 03:02:56
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
         }       
    }


}


Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 07 Ocak 2022, 13:03:51
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ı.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: power20 - 07 Ocak 2022, 14:06:27
false/true  olan  bayrak bool olarak tanımlanması gerekmiyor mu?
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 07 Ocak 2022, 16:06:14
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;}
}
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: Z80 - 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.
Başlık: Ynt: Pic ana döngü kilitlenme durumu
Gönderen: bulut_01 - 07 Ocak 2022, 22:02:58
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