RCIF VE TXIF VE BUFFER ve işte sorunlar başlıyor

Başlatan izwirlee_35, 04 Kasım 2010, 16:30:21

Tagli

PIC'in o sırada yaptığı başka bir işlem yoksa gönderme kesmesi kullanmak gereksiz. Göndermenin bitip bitmediği TRMT bitine bakılarak, veya kesme kullanmadan TXIF bitine bakılarak da bulunabilir. Zaten kodun içinde TXIE = 0 ifadesini göremedim (main içindeki bölüm hariç, yani gndr'den sonra yok), ki bu durumda gndr fonksiyonunun işi bittikten sonra da gönderme kesmesi çalışmaya devam edecek ve sorun çıkaracaktır.
Gökçe Tağlıoğlu

izwirlee_35

if(TXIF)
         {
            if(tx[tx_adr]!='\0')
            {
            TXREG=tx[tx_adr];
            while(!TRMT);
            tx_adr++;
            }
            else {TXIE=0;}
         TXIF=0;   // bu satırda ki  işlem ile txıf kesmesi olştugunda veri txreg e aktarılıp ondan sonra trmt nin boş olması beklendikten sonra tx_adr yi bir artırıyorum eger tx dizisinin(her dizide oldugunu düşündügüm son karakter null u bekledim)null karakteri gelirsede kesmeyi disable yaptım ve kesme bayragını da 0 ladım burada bayragı sıfırlamam ile tekrar bilgi alınmasını sagladım. başka nerede olması gerek tagli hocam gnder den sonra txıe=1 deyince kesme enable olunca direk kesmeye  gidiyor(TXIF flag ı boştayken bir oldugu için)ve kesme sonunda da bayragı temizliyorum ve rutin aynen devam ediyor.
         }

keep learning . . .

Tagli

TXIE = 0 bölümü benim gözümden kaçmış. Yine de kafamın karıştığını söylemeliyim. Yapmaya çalıştığın şeyi tekrardan özetleyebilir misin? İki kod vermişsin, alıcı ve gönderici olmak üzere. Ancak ikisinde de hem alma hem gönderme işlemleri yapılıyor gibi. Alınan veya gönderilen veri nedir? Ve de bu verinin büyüklüğü nedir? Bu veri hangi şart sağlandığında gönderiliyor? Alınan verinin doğruluğunu nerede kontrol ediyorsun ve bunu kullanıcıya (yani kendine) nasıl gösteriyorsun? Bunları bilmeden sadece koda bakarak yorum yapmaya çalışmak zor oluyor.
Gökçe Tağlıoğlu

izwirlee_35

sayın tagli hocam ilginiz için teşekkürler şimdi aslında bn gsm modem ile pici haberleştirmeye çalışıyorum yalnız bunu  sağlıklı olarak saglayamayınca bu işe başvurdum açtım proteusu koydum 2 tane 628a 2 ser tane de led koydum gösterge amaçlı ve şunu yapmaya çalıştım.
1.pic AT diyecek 2.pic ise gelen AT ise OK diyecek. yapmaya çalıştıgım budur kısacası. yalnız bunu kesmelerle yapmamın nedeni ise bu programı daha geliştirecegim yani seri den bilgi gönderme işlemlerini sadece kesmelerde halledecegim ben ayrıyetten bilgi geldimi diye beklemeyecegim
1.pic için konuşuyorum AT göndermek istedigim zaman tx[] bufferıma bunu  bir alt programda yani gndr alt programında yukleyecegım  ve gndr programının sonunda ise TXIE yi bir yapıp TX kesmesinin içinde tx[] bufferının içinde olan bilgiyi TXREG e yukleyecegim ve gönderecegim.

2. pic ise gelen bilgiyi RCREG den alıp rx[] bufferıma atacak ben gelen bilgiyi alıp AT olup olamdıgına bakmak için karsılastırma yapmam gerekiyor bununda cmp() alt programımla yapıyorum ama oda düzgün sonuç vermiyor.

yapmaya çalıştıgım şey budur kısacası tagli hocam .
keep learning . . .

Tagli

Daha önce de önerdiğim gibi, sorunu arayacağın yeri daraltmak için küçük denemeler yapmalısın. Örneğin, tx ve rx'i 5'lik diziler olarak ayarla ve tx'in değerlerini programın başında 1, 2, 3, 4, 5 olarak ver. tx[0] = 1; gibi.

Gönderme kesmesinin içindeki kodun da şu şekilde olsun:
if (TXIF){
     TXREG = tx[tx_adr++];
     if (tx_adr == 5){
          TXIE = 0;
          tx_adr = 0;
     }
}


Gönderme işlemini başlatmak için yapman gereken tek şey TXIE = 1 yapmak, yani bu deneme için gndr() fonksiyonunu kullanma.

Alıcı ise şu şekilde olmalı:
if (RCIF){
     rx[rx_adr++] = RCREG;
}


Daha sonradan alıcı tarafta rx'in içindeki verilerin beklendiği gibi 1, 2, 3, 4, 5 olmadıklarını kontrol edebilirsin. Transferin tamamlanıp tamamlanmadığını anlamak için alıcı programda rx_adr değerine bakabilirsin. Bu değer 5 olmuşsa alım tamamlanmış demektir.

İlk mesajımda belirttiğim TRISB ayarını dediğim şekilde yapmayı unutma. Ve de programların başında tx_adr ve rx_adr değerleri 0 olmalı.
Gökçe Tağlıoğlu

izwirlee_35

keep learning . . .