ACK Sinyali Gelmiyor

Başlatan karacan451, 27 Eylül 2015, 12:55:41

karacan451

 2.5 Haftadır yazılımla I2C prokolü  yazamaya çalışıyorum kısmen başarılı oldum.Sadece HIGH  ve LOW ve süre komutları kullanarak

$D0 , $00, $00 bilgisini gönderiyorum  ds1307 de saniye 00 olacağına 13 oluyor. O komutları kullanarak ack sinyali gelmiyor.Bu sinyal
gelmediği için gönderdiğim bilgiler cihaza düzgün gitmiyor.

Aşağıdaki fotolar PIC'in kendi yazılımı kullanarak  çektim.







Sarı çizgiler clock sinyali.

Mavi çizgiler data sinyali.

Beyaz nokta ise ack sinyali

O ack sinyali nasıl gelecek yardım eder misiniz?

Burak

Ω Gens Una Sumus Ω

ete

I2C nin DATA bacağı haberleşme esnasında hem çıkış hemde giriş olarak kullanılır. Bilgiyi verirken bu pin çıkış olarak ayarlanıp Data verilir ve ACK beklendiği anda ilgili DATA bacağı hemen giriş olarak ayarlanıp ACK sinyalinin gelip gelmediği test edilir. Muhtemelen bu değişikliği yapmadığın için ACK sinyali boşuna bekliyorsun.
Kod vermediğin için bunu bizim anlamamız çok zor. Bu yüzden Burak kod nerede diye soruyor. Kod'a bakıp ne yaptığını anlamak için.

Ete

karacan451

Dosyalar eklendi

dakiya adresine 26 dakkiya yoluyom ds1307 saate 26 yazıyor .
Galiba ack yüzünden oluyor

ete

Ne program yazma kuralı neden I2C protokol şartlarına uymadığını görüyorum.
Programı belki deneme veya vakit geçirme amacı ile yazdın o yüzden eksiklerini göz ardı ediyorsundur diye düşünüyorum. Ama I2C protoklüne uymaz ise nasıl haberleşeceksin. ben olsam önce protokolü bir araştırır haberleşme nasıl başlatlıyor nasıl sona erdiriliyor öğrenirdim.
Aşağıdaki linki bir incele istersen.

http://gokhanbeken.com/i2c-protokolu

Ete

karacan451

#5
Alıntı YapI2C nin DATA bacağı haberleşme esnasında hem çıkış hemde giriş olarak kullanılır. Bilgiyi verirken bu pin çıkış olarak ayarlanıp Data verilir ve ACK beklendiği anda ilgili DATA bacağı hemen giriş olarak ayarlanıp ACK sinyalinin gelip gelmediği test edilir. Muhtemelen bu değişikliği yapmadığın için ACK sinyali boşuna bekliyorsun.
Kod vermediğin için bunu bizim anlamamız çok zor. Bu yüzden Burak kod nerede diye soruyor. Kod'a bakıp ne yaptığını anlamak için.

''*********************************************************

Hocam yukarıdaki dediklerinizi yaptım sonunda ACK Sinyali geldi.

Hocam zaten 2.5 haftadır araştırdım hatta PIC'in gönderdiği sinyali birebir kopyasını yaptım ama ack sinyalli gelmedi.
Bide bana verdiğiniz linki  incelemeye başladım tekrar yazmaya başlıyacam.

ete

Merakımdan soruyorum. Hazır bu işi yapan I2CREAD ve I2CWRITE komutları var iken neden bu yola başvuruyorsun.
Bu işi yapmak sana pek bir şey kazandırmayacak. yapacaksan donanımsal I2C portunu kullanmayı öğren bari.

Ete

karacan451


    Ete hocam benim amacım yazılıma rahatlıkla müdahale etmem lazım. Bunun bedeli var hızdan ve veriden mahrum kalıyorum ama en azından kendi ihtiyaçlarımı karşılıyorum bide öğrenmiş oluyorum.
Benim kafam bazı şeylere basmıyor örneğin 3-4 yıldır pic ve 1 yıldır atmega program yazıyorum halen kesme mantığını anlamadım. 

ete

Anlatayım o halde.
Bir mikrodenetleyici verilen program doğrultusunda işlem yapar. Varsayalım program bazı pinlerin kontrolünü yapıp duruma göre ekrana bir şeyler yazdırıyor olsun.
Bazı pinlerin giriş kontrolü ancak ve ancak program o kısma gelince yapılabilir öyle değilmi.
Normalde program epeyce hızlı çalışır. Ama işlemci dünyasında ne kadar hızlı çalışırsa çalışsın bu işlemler yine vakit alan işlemler olarak tanımlanır. Bu nedenle işlemci LCD ye yazı yazdırırken aynı anda pinlerin durumuna bakamaz. Peki pinlerden birisine çok kısa palsler geldiğini varsayarsak işlemcinin bu palsleri yakalama olasılığı ancak şansa kalmış olarak düşünülür Çünki pals gelecek iişlemcide o anda pinlere bakıyor olacak ve gelen palsi yakalayacak. Ama program o esnada LCD ye bir şey yazdırıyor ise ve pinlere bakamıyor ise gelen pals kaçırılacak demektir.
Bu ve buna benzer pek çok durum mikrodenetleyici yada işlemci üreticelerini düşündürmüş olsa gerek ki buna bir çare bulalım demişler ve Kesme işini yaratmışlar. Her ne kadar siz bir program çalıştırsanız da aslında mikro işlemcilerde geri planda çalışan bir BIOS tipi bir program vardır. Bunun amacı program komutlarını algılayıp gereği olan işlemleri yaptırmaktır. Dolayısıyla KESME işleminide bu geriden çalışan asıl (sabit) program yapacaktır. Peki ne yapacak bu program ?. Yazdığınız program işlemci hafızasında çalışırken kesme oluşturacak bir işlem meydana geldiğinde işlemci hemen o kesmeye ait bayrağı (FLAG) set edecektir. Buradan anlıyoruzki her kesmenin bir BAYRAĞI (Flag'ı) var.
Bir kere bayrak set edilmiş ise geriden çalışan program bu sefer hemen o kesme sizin programda aktif edilmişmi edilmemişmi ona bakacaktır. Aktif ise çalışan programı hemen durduracak ve programı yine sizin belirlediğiniz Kesme (yada adı her ne ise) isimli etikete yollayacaktır. Ancak yollamadan önce işlemci hafızasında bulunan değer almış bütün değişken değerlerini ayrıldığı (ASM) adresini ve gerekli diğer belirteçleri bir yerlere kayıt eder.  Kısaca işini gücünü bırakıp doğruca kesme etiketine gider. Oradaki işlerini yapıp tekrar kaldığı yere döner. Bunu yapmak içinde gelirken kayıt ettiği değerleri geri alıp öyle kaldığı yere döner ve sanki hiç kesme etiketine gitmemiş gibi olur.
Kesme olayı çok özel bir durumdur. Kesme kısmına gelinirken bir çok şey yapılıyor bu nedenle kesmeden çıkmak içinde çok özel şeyler yapmak gerekiyor. Olaya bu açıdan bakınca kesme içinden programın istediğiniz bir bölümüne direk gitmemeniz gerektiğini umarım anlayabiliyorsundur. Bu nedenle kesme içinde GOTO xxxx veya GOSUB xxxx şeklinde programın başka bölümlerine gidilmemesi gerekir.
Sonuçta kesme olayını kısaca tarif etmek gerekirse oluştuğu zaman ve program içinde aktif edilmiş ise programın işini gücünü bırakarak gidip başka işler yaptığı özel durum şeklinde açıklayabiliriz.
Bu bize neler kazandırıyor biraz daha açmak gerekir ise, genellikle giriş pinlerinde sürekli başında bekleyip belirli bir konumda olan pinin konum değiştirip değiştirmediğine bakmak gerekmez. Programınız başka yerlerde başka işler yapıyor iken o pin konum değiştirir ise program (sizinki değil geri planda çalışan) hemen bunu algılar ve sizin yazdığınız programı o pin de konum değişince yapılması gerekenleri yapmak üzere yazdığınız programın ilgili bölümüne (Kesme etiketine) sevk eder.
Neler kesme ile kontrol edilebilir birazda ona değinelim.
- Timer kesmeleri , hemen hemen bütün timer sayaçları aşıma uğradığında (maksimum değerleri aşıp yeniden sıfırlandığında) kesme oluştururlar.
- PORTB.0 (RB0) kesmesi, bu pin programdan yapılacak ayarlamaya bağlı olarak LOW dan HIGH konumuna yada tam tersi durumda kesme oluşturabilir.
- PORTB.4-PORTB.7 pinlerindeki değişiklik kesmesi. Pinler giriş olarak ayarlanmış ise ve başlangıç konumlarında herhangi bir değişiklik olmuş ise kesme oluşturulabilir.
- USART kesmesi, çok kullanılan bu kesme türü olup donanımsal Seri Portu olan işlemcilerde pininbaşında beklemeden gelen bilgileri otomatik olarak almamızı sağlar. Kısaca pinden bir bilgi gelirse otomatikman kesme oluşturulur.
En çok kullanılanlar kesme türleri bunlar. Ayrıca Eprom kayıt kesmesi, ADC okuma kesmesi gibi daha az kullanılan kesmelerde mevcuttur.

Umarım bir şeyler anlamışsındır. Zira pek çok kişi anlamını az çok anlasada neden kullanıyoruz ne gereği varki diye sorarlar.
Gereği ortada , kesme oluşabilecek pinlerde biz bekçilik yapacağımıza Kesme bizim yerimize bekçilik yapmaktadır. Bu yüzden çok gereklidir ve kullanışlıdır.

Ete

Powered by EzPortal