UART HABERLEŞME INTERRUPT SORUNU

Başlatan volkanunal, 23 Ekim 2017, 10:15:56

volkanunal

Sanırım şöyle bir durum oluşuyordu  , interrupt meydana geldiğinde flag 1 'e çekiliyordu benim mantığımda farklı bir veri olması gerekiyor ki if içerisine girsin  veriyi bassın ve flagı temizlesin ancak bu if içerisine giremediği için flag 1'e de kalıyor ve temizlenmediği için interrupta izin vermiyordu.
Primum nil nocere

JOKERAS




volkanunal,sizin işlemcinin pdf'ni inceliyorum gözlerim ağrıdı:)


FiFo(İlk giren İlk çıkar) Buffer var.
Fifodan sonra Shift register var.
Yani Fifoya yüklenen Paralel değeri/leri seri şekilde Shift edip dışarıya gönderiyor.


Burada bazı şartlar var.UTXBF ve TRMT.
UTXBF Fifo bufferın dolu olup olmadığını gösteriyor.
TRMT ise Shift edilen yani gönderilen Data varmı diye kontrol ediyor.


mesela 'A' karakterini yollayalım.


TXREG = 'A'; dediğimiz anda ISR isteği gelmiş İnterrupt bayrağı set olmuş demektir.
Interrupt açıksa Pc İnterrupt rutinine zıplayacak.
İnterrupt Bayrağını temizledik çıktık.'A' Fifo bufferda daha gitmedi bekliyor...
Peşinden 'B','C', 'D' yolladık.Buffer Full doldu.
Bundan sonra göndereceğiniz veriler uçar gider yalan olur.


Onun için Veri gönderimi yapmadan önce Fifo Buffer dolumu yer varmı diye kontrol etmek gerekiyor.
Bunu da UTXBF Regi yapıyor.


UTXBF 0'mı?Evet! Fifo'da hala boş yer var.
UTXBF 1'mi?Evet! Fifo dolmuş,Bloke durumda beklemek gerekiyor.


Fifodaki Verileri kızağa almadan önce veri kaydırması varmı yokmu?
Bunu da kontrol etmek gerekli.
Bunu kontrol eden Reg ise TRMT.


TRMT 1'se Kızak boş,0 ise Kızak dolu.Yani bir önceki veri hala shift ediliyor.
Fifodaki datalar,TRMT 0'a düştüğü her an  'A' 'B' 'C' 'D' şeklinde Kızağa,yani Shift registere düşer.


TXEN = 1; demeden önce
TRMT Registerini sorgulamak gerekiyor.


while(TRMT == 0)   //Shift işlemin bitmesi bekleniyor.
;                 //Sfiht bitti,kızak boş.


      TXEN = 1;    //Yeni Veri Kızağa düştü.Shift başladı.




while(UTXBF == 1); //Fifo Full,Boş yer yok,mecburen bekleyecek.     
     
      TXREG = Ch;  // Sıradaki gelsin Fifo'da boş yer var.


Bu kodlar bloke çalışır,zaten Donanımla çalışılıyorsa Bloke çalışmadan işin
içinden çıkmak zor.Ya bloke çalışmak yada Time Out sayıp karar vermek gerekir.


TXIE ile TXEN farklı Registerler.Kafa karıştırmasın!


Şimdi bunu niye böyle yapmış bu vatandaşlar.
Veri gönderim ve alımlarında hata olmasın,veya en az hata ile işi kurtarmak ve hızlı bir şekilde
yollamak için yapmış olabilirler.



Aslında bu iş için İnterrupt'a gerek yok,interrupt'sızda olur.
Sonuçta Donanım bu.Donanımı İnterrupt ile kontrol ederek işlemciyi meşgıl etmemişler.
Bu sayede işlemci gerekli gereksiz yere zaman harcamamış oluyor.
Bir kaç Flag kontrol edilerek Donamım kontrol edilmiş.
Aksi takdirde Aynı kontrolleri ana programda yapmak gerekecek ve bu da özellikle kod büyüdükçe
Zaman farkı oluşturacaktı.









volkanunal

Teşekkürler hocam :) zahmet ettirdim yordum sizi :) @JOKERAS
Primum nil nocere

JOKERAS