uart transmit hattında hata

Başlatan merve damar, 06 Ekim 2022, 10:16:17

merve damar

Merhabalar,
İşlemcim ve modulum uart ile haberleşiyorlar. Testlerini yapıyorum 2 hattı da sürekli okuyorum. Çok nadirde olsa transmit hattı istenilen kodları göndermeyi kesiyor ve sürekli rastgele sayılar gonderiyor. Sadece enerjiyi kestiğimde düzeliyor. Sizde bu neden olabilir? böyle bir durumla karşılaşan var mı?

quarko

Yazılımsal bir hata var gibi görünüyor. İstenilen veriyi gönderme kısmının hemen önüne breakpoint koyup, gönderdiğin dataları tuttuğun buffer ı inceleyebilirsin.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

merve damar

Dizi şeklinde gönderiyorum, Hepsini de ayrı ayrı tanıttım .

quarko

Gönderme kısmı tx interrupt ı veya dma ile mi çalışıyor.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

merve damar

Yok receive interrupt kullanıyorum.
void Send_Data_To_UART0 (UINT8 c)
{
    TI = 0;
    SBUF = c;
    while(TI==0);
}
void uart_send_string(char * str, int len)
{
while (len--)
{
Send_Data_To_UART0(*str++);

}



böyle bi dizi koduyla

quarko

Eğer kritik değilse, gönderme işlemi başladığında diğer kesmeleri kapatıp deneyebilirsin.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

merve damar

diğer kesmelerden mi etkileniyordur?

quarko

Olabilir. Nasıl bir yazılım algoritması kullanıyorsun bilmiyorum ama sıkıntı olabilir. Datayı gönderirken kullandığın değişkenleri kontrol et. Taşma olabilir. String leri tuttuğun dizileri global olarak tanımla bakalım ne olacak.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

power20

Rx pini 10k ile pull-up yapmak işe yarayabilir 

merve damar

sürekli olmuyo tespit edemiyorum reset kodu ekledim her 15 saniyede 1 modulden bi kod alıyorum, o kod gelmediğinde resetlesin dedim. resetlendiğinde de sorun çözülüyor

JOKERAS

Dataları olduğu gibi ham şekilde gönderirseniz ve alırsanız her türlü olumsuzluktan etkilenir.
Kendiniz bir Protokol- Frame oluşturun,Frame'in başı sonu uzunluğu belli olsun.
Birde Check Sum gibi bir Algoritmadan geçirirseniz Hatasız veri Tranceiver
yaparsınız.

Aksi halde...
Senkron uyumsuzlukları,dış etkenler,parazitler, muhtelif Donanım kesmeleri vs,
her hata sizin Katarınızın-Stringinizin bozulmasına Sebep olur.

TX ve Rx için Donanım kullanıyorsanız,önce bit düzeyinde Hata kontrolleri yapın.
TRMT, OERR, FEER vs gibi.

Muhtemelen Asenkron çalışıyorsunuz.Asenk olunca Baud hızınız TX veya RX mutlaka
uyumsuz olacak.Aynı değerleri init etseniz bile +/- kaymalar olacaktır.
Bunun için RX Donanımınızda muhtemelen FERR(Frame Error), OERR(Over Run Error)
bayrakları vardır.
Önce en alt katman Bit katmanı olan donanımda bu Hataları arayın.

OERR genelde Baud uyumsuzluklarının doğurduğu Bit hatalarında ortaya çıkar.
FERR ise genelde Dış etkenler,Datanın boulması,herhangi bir Kesme önceliğinin
araya girmesi,Parazit vs gibi durumlarda olur.
Onun için Alt Donanım katmanında bunları Dedekte etmeli ona göre yazılımınızı tasarlamanız gerekir.

Sonra bir üst katman Yazılım katmanı.Yani Data işleme.Gelen dataları ister Byte Byte,ister
String olarak bir yere Keş edersiniz.Bunun bir çok yöntemi olabilir bu size kalmış.
Sonra Stringinizi-Dataları Kontrol edersiniz.Bunu nasıl yapacaksınız?

Bunun için genellikle yol şu şekilde olur.Frame göndermek.Yani Göndereceğiniz verinin Başı,Sonu,Datası,hatası uzunluğu vs belli olan bir Frame.

Örneğin Frame'iniz STX ile başlar ETX ile biter.

Frame --> STX, LEN, DATA....., SUM, ETX.
TX hattından böyle bir Frame gönderdiğinizde RX hattınız İllaki STX Karakterini
almak zorunda kalacak.Sonra LEN yani gönderilen Verinin uzunluğu, sonra Esas olan DATAlar.
Sonra SUM hata kontrolleri ve sonunda ETX.

TX ile gönderdiğiniz RX ile aldığınız Algortimalar birbirinin karşılıkları olacak.
Her iki Algortimanın uyumu hatasız veri transferi demek.

Bunun için,size fikir vermesi açısından Muhtelif haberleşme Protokollerini inceleyin.
Sayısız Protokol var.Hem o protokolleri, veya tamamen sizin yazacağınız size özel bir
Protkol bile yaparsınız.


ziyaretci

#11
Resete kadar sürekli yaşanan bozunumun en büyük sebebi aşağıdaki olasılıklardır.
-Osilatörün stabil olup olmadığını kontrol edin(register üzerinden).
-PLL aktif ise stabil olup olmadığını kontrol edin(register üzerinden).
-Ek A: Kodsal birşeyler

Devre şeması, MCU, kod vb. bilgilerin paylaşılmamasına(özel bir durum) yaslanaraktan, yukarıdaki olasılıkları oluşturabilecek birkaç etken paylaşabilirim.
-Harici osilatörün kalitesi, ısıl kompanzasyonu,
-MCU çalışma frekansının kurtarmayacağı ya da hata olasılığını arttıracağı fantezi baud rate değeri seçimi(datasheet'te hata oranlarının yazması lazım),
-Ground plane problemleri
-Otomatik baud rate ayarlama özelliğinin açılmış olması(Tune işlemi),
-Kodda meydana gelen açık durum: düzgün hazırlanmayan haberleşme formatının başlattığı zircirleme reaksiyon sonucu alıcı taraftaki RX kesmesinin olaya bir türlü kendini verememesi hali(Öncelik(Priority), senkronizasyonun kaçmasına neden olan birşeyler).**( @JOKERAS ) bkz. ring buffer

Ek deneyimim(PIC):
-MCU dahili eeprom'a data yazarken komple kendini bypass ediyor. En öncelikli kesmelerden tutun herhangi birine kadar. Hiç biri çalışmıyor. Bu durum süreklilik(bahsettiğiniz) arz etmez ama bir köşede dursun.