Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Diğer => Konuyu başlatan: merve damar - 06 Ekim 2022, 10:16:17

Başlık: uart transmit hattında hata
Gönderen: merve damar - 06 Ekim 2022, 10:16:17
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ı?
Başlık: Ynt: uart transmit hattında hata
Gönderen: quarko - 06 Ekim 2022, 10:38:52
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.
Başlık: Ynt: uart transmit hattında hata
Gönderen: merve damar - 06 Ekim 2022, 10:42:35
Dizi şeklinde gönderiyorum, Hepsini de ayrı ayrı tanıttım .
Başlık: Ynt: uart transmit hattında hata
Gönderen: quarko - 06 Ekim 2022, 10:45:02
Gönderme kısmı tx interrupt ı veya dma ile mi çalışıyor.
Başlık: Ynt: uart transmit hattında hata
Gönderen: merve damar - 06 Ekim 2022, 10:56:49
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
Başlık: Ynt: uart transmit hattında hata
Gönderen: quarko - 06 Ekim 2022, 11:13:14
Eğer kritik değilse, gönderme işlemi başladığında diğer kesmeleri kapatıp deneyebilirsin.
Başlık: Ynt: uart transmit hattında hata
Gönderen: merve damar - 06 Ekim 2022, 11:27:23
diğer kesmelerden mi etkileniyordur?
Başlık: Ynt: uart transmit hattında hata
Gönderen: quarko - 06 Ekim 2022, 11:40:16
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.
Başlık: Ynt: uart transmit hattında hata
Gönderen: power20 - 06 Ekim 2022, 11:48:54
Rx pini 10k ile pull-up yapmak işe yarayabilir 
Başlık: Ynt: uart transmit hattında hata
Gönderen: merve damar - 06 Ekim 2022, 14:07:48
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
Başlık: Ynt: uart transmit hattında hata
Gönderen: JOKERAS - 06 Ekim 2022, 21:44:46
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.

Başlık: Ynt: uart transmit hattında hata
Gönderen: ziyaretci - 07 Ekim 2022, 01:04:02
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 (https://en.wikipedia.org/wiki/Circular_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.