PIC Mikrodenetleyici PIC16F877 ile I2C İletişimi

PIC Mikrodenetleyiciler, Microchip tarafından gömülü projeler için sağlanan güçlü bir platformdur. Çok yönlü yapısı sayesinde birçok uygulamaya girmiştir ve bu aşama hala devam etmektedir. PIC eğitimlerimizi takip ettiyseniz , PIC mikrodenetleyiciler hakkında en temellerden başlayarak geniş bir yelpazede eğitimler verdiğimizi fark etmişsinizdir. Şimdiye kadar, iletişim portalı gibi daha ilginç konulara da girebileceğimiz temelleri ele aldık.

Gömülü uygulamaların geniş sisteminde, hiçbir mikrodenetleyici tüm işlemleri tek başına gerçekleştiremez. Bir noktada, bilgi paylaşımı için diğer cihazlarla iletişim kurması gerekir. Bu bilgileri paylaşmak için birçok farklı iletişim protokolü türü vardır , ancak en çok kullanılanlar USART, IIC, SPI ve CAN’dır . Her iletişim protokolünün kendine özgü avantajları ve dezavantajları vardır. Bu eğitimde öğreneceğimiz şey bu olduğundan, şimdilik IIC kısmına odaklanalım .

I2C İletişim Protokolü Nedir?

IIC terimi, ” Inter Integrated Circuits” (Entegre Devreler Arası) anlamına gelir . Genellikle I2C veya I kare C veya bazı yerlerde 2 telli arayüz protokolü (TWI) olarak adlandırılır, ancak hepsi aynı anlama gelir. I2C, eşzamanlı bir iletişim protokolüdür; yani bilgiyi paylaşan her iki cihazın da ortak bir saat sinyalini paylaşması gerekir. Bilgi paylaşımı için yalnızca iki teli vardır; bunlardan biri sinyal için, diğeri ise veri gönderip almak için kullanılır.

I2C İletişimi nasıl çalışır?

I2C iletişimi ilk olarak Phillips tarafından tanıtıldı. Daha önce de belirtildiği gibi, iki kablosu vardır ve bu iki kablo iki cihaza bağlanır. Burada bir cihaz ana cihaz , diğer cihaz ise bağımlı cihaz olarak adlandırılır. İletişim her zaman iki ana cihaz ve bir bağımlı cihaz arasında gerçekleşmelidir ve gerçekleşecektir . I2C iletişiminin avantajı, bir ana cihaza birden fazla bağımlı cihazın bağlanabilmesidir.

Tüm iletişim, Seri Saat (SCL) ve Seri Veri (SDA) olmak üzere iki kablo üzerinden gerçekleşir.

Seri Saat (SCL): Ana bilgisayar tarafından üretilen saat sinyalini köle ile paylaşır

Seri Veri (SDA): Verileri Master ve slave arasında gönderir ve alır.

Herhangi bir anda yalnızca ana cihaz iletişimi başlatabilir. Veriyolunda birden fazla yardımcı cihaz olduğundan, ana cihazın her bir yardımcı cihaza farklı bir adres kullanarak başvurması gerekir. Adreslendiğinde, yalnızca o adrese sahip olan yardımcı cihaz bilgiyle yanıt verirken, diğerleri iletişimi kesmeye devam eder. Bu şekilde, aynı veri yolunu kullanarak birden fazla cihazla iletişim kurabiliriz.

I2C haberleşmesi nerelerde kullanılır?

I2C iletişimi yalnızca kısa mesafeli iletişim için kullanılır . Akıllı olmasını sağlayan senkronize bir saat darbesine sahip olduğundan, bir dereceye kadar güvenilirdir. Bu protokol, esas olarak bir ana bilgisayara bilgi göndermesi gereken sensörler veya diğer cihazlarla iletişim kurmak için kullanılır. Bir mikrodenetleyicinin en azından birkaç kablo kullanarak birçok başka yardımcı modülle iletişim kurması gerektiğinde çok kullanışlıdır. Uzun menzilli bir iletişim arıyorsanız RS232’yi, daha güvenilir bir iletişim arıyorsanız SPI protokolünü denemelisiniz.

XC8 Derleyicisini Kullanarak PIC16F877a ile I2C

Giriş kısmı yeter, şimdi konuya girelim ve bir mikrodenetleyiciyi I2C iletişimi gerçekleştirmek için nasıl kullanabileceğimizi öğrenelim. Başlamadan önce, bu eğitimin yalnızca XC8 derleyicisi kullanılarak PIC16F877a’da I2C’den bahsettiğini , sürecin diğer mikrodenetleyiciler için de aynı olacağını, ancak küçük değişiklikler gerekebileceğini unutmayın. Ayrıca, PIC18F serisi gibi gelişmiş mikrodenetleyicilerde derleyicinin I2C özelliklerini kullanmak için yerleşik bir kütüphanesi olabileceğini, ancak PIC16F877A için böyle bir şey olmadığını unutmayın, bu yüzden kendimiz bir tane oluşturalım. Burada açıklanan kütüphane, PIC16F877A’nın diğer I2C cihazlarıyla iletişim kurması için kullanılabilecek bir başlık dosyası olarak alt kısımda indirilebilir.

Her zaman olduğu gibi, herhangi bir şeye başlamak için en iyi yer veri sayfamızdır . Veri sayfasında I2C ile ilgili ayrıntıları arayın ve hangi kayıtların yapılandırılması gerektiğini kontrol edin. Veri sayfası bunu sizin için zaten yaptığı için ayrıntılı olarak açıklamayacağım. Aşağıda, başlık dosyasında bulunan farklı işlevleri ve programdaki sorumluluklarını açıklayacağım.

void I2C_Initialize()

Başlatma fonksiyonu, mikrodenetleyiciye I2C protokolünü kullanacağımızı bildirmek için kullanılır. Bu, SSPCON ve SSPCON2 kayıtlarında gerekli bitleri ayarlayarak yapılabilir. İlk adım, IIC pinlerini giriş pinleri olarak tanımlamaktır ; burada RC3 ve RC4 pinleri I2C iletişimi için kullanılmalıdır, bu yüzden bunları giriş pinleri olarak tanımlıyoruz. Ardından, MSSP kontrol kayıtları olan SSPCON ve SSPCON2’yi ayarlamalıyız. PIC’i FOSC/(4 * (SSPADD + 1)) saat frekansıyla IIC ana modunda çalıştırıyoruz . Bu belirli kaydın neden bu şekilde ayarlandığını anlamak için aşağıdaki yorum satırlarında belirtilen veri sayfasının sayfa numaralarına bakın.

Şimdi sırada saat frekansını ayarlamamız gerekiyor , farklı uygulamalar için saat frekansı değişebilir, bu nedenle kullanıcıdan feq_k değişkeni aracılığıyla seçim yapma hakkı alıyoruz ve bunu formüllerimizde SSPADD kaydını ayarlamak için kullanıyoruz.

Boş I2C_Hold()

Bir sonraki önemli işlev, mevcut I2C işlemi tamamlanana kadar cihazın yürütülmesini bekletmek için kullanılan I2C_hold işlevidir . Herhangi bir yeni işlem başlatmadan önce I2C işlemlerinin durdurulup durdurulmaması gerektiğini kontrol etmemiz gerekir. Bu, SSPSTAT ve SSPCON2 kayıtlarını kontrol ederek yapılabilir. SSPSTAT, I2C veri yolunun durumu hakkında bilgi içerir.

Program, bir “ve” ve bir “veya” operatörü içerdiğinden biraz karmaşık görünebilir. Bunu şu şekilde parçalara ayırdığınızda:

Bu, SSPSTAT’taki 2. bitin sıfır olduğundan ve benzer şekilde SSPCON2’deki 0 ile 4 arasındaki bitlerin sıfır olduğundan emin olduğumuz anlamına gelir. Ardından, sonucun sıfır olduğunu kontrol etmek için tüm bunları birleştiririz. Sonuç sıfırsa program devam eder, değilse , while döngüsünde kullanıldığı için sıfır olana kadar orada kalır .

Boş I2C_Begin() ve boş I2C_End()

I2C veri yolunu kullanarak herhangi bir veri yazarken veya okurken, I2C bağlantısını başlatmalı ve sonlandırmalıyız . Bir I2C iletişimi başlatmak için SEN bitini, iletişimi sonlandırmak için ise PEN durum bitini ayarlamalıyız. Bu bitlerden herhangi birini değiştirmeden önce, yukarıda açıklandığı gibi I2C_Hold işlevini kullanarak I2C veri yolunun meşgul olup olmadığını da kontrol etmeliyiz.

Boş I2C_Write()

Yazma işlevi, ana modülden yedek modüle herhangi bir veri göndermek için kullanılır . Bu işlev genellikle bir I2C başlangıç ​​işlevinden sonra kullanılır ve ardından bir I2C bitiş işlevi gelir. IIC veri yoluna yazılması gereken veriler, değişken veri üzerinden iletilir. Bu veriler daha sonra I2C veri yolu üzerinden gönderilmek üzere SSPBUF tampon kaydına yüklenir.

Normalde bir veriyi yazmadan önce bir adres yazılacağından yazma fonksiyonunu iki kez kullanmanız gerekir; bir kez adresi ayarlamak için, bir kez de gerçek veriyi göndermek için.

imzasız kısa I2C_Read()

Bilmemiz gereken son fonksiyon I2C_Read fonksiyonudur. Bu fonksiyon, I2C veri yolundaki mevcut verileri okumak için kullanılır. Bir slave’den veri yoluna bir değer yazmasını istedikten sonra kullanılır. Alınan değer SSPBUF’ta olacaktır ve bu değeri işlemimiz için herhangi bir değişkene aktarabiliriz.

Bir I2C iletişimi sırasında, köle, ana cihaz tarafından talep edilen verileri gönderdikten sonra, onay biti olan başka bir bit gönderir. Bu bit, ana cihaz tarafından iletişimin başarılı olduğundan emin olmak için kontrol edilmelidir. Onay için ACKDT biti kontrol edildikten sonra, ACKEN biti ayarlanarak etkinleştirilmelidir.

İşte bu kadar, bu işlevler bir I2C iletişimi kurmak ve bir cihazdan veri yazmak veya okumak için yeterli olmalıdır. Ayrıca, I2C iletişiminin gerçekleştirebileceği başka birçok işlev olduğunu da unutmayın, ancak basitlik adına bunları burada ele almıyoruz. Cihazın tüm çalışma prensibini öğrenmek için veri sayfasına bakabilirsiniz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir