PIC16F877 Mikrodenetleyici ile I2C haberleşmesi
PIC mikrodenetleyicisi bir çok gömülü sistemde kullanılan güçlü ve uygun bir denetleyici türüdür. Geniş uygulama alanı olsada, hiçbir mikrodenetleyici tüm faaliyetleri tek başına gerçekleştiremez. Bir zaman diliminde, bilgi paylaşmak 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 kendi avantaj ve dezavantajı vardır. Bu yazımızda I2C protokülüne değineceğiz.
I2C İletişim Protokolü Nedir?
IIC terimi, “Entegre Devreler” anlamına gelmektedir. Normalde I2C veya I C kare, hatta bazı yerlerde 2 kablolu arabirim protokolü (TWI) olarak ifade edilir, ancak hepsi aynı anlama gelir. I2C, senkronize bir iletişim protokolü anlamına gelir; her iki bilgiyi paylaşan cihazların ortak bir zaman sinyalini paylaşması gerekir. Bir clock sinyali için veri göndermek ve almak için kullanılan sadece iki yol kullanır.
I2C İletişim nasıl çalışır?
I2C iletişimi ilk olarak Phillips tarafından tanıtıldı. Burada bir aygıta server, diğer aygıta da client adı verilir. İletişim iki Master ve Slave arasında gerçekleşmeli ve gerçekleşmelidir. I2C iletişiminin avantajı, birden fazla clientin bir sunucuya bağlanabilmesidir.
Komple iletişim, SCL ve SDA olarak adlandırılan bu iki tel üzerinden gerçekleştirilir.
SCL: Master tarafından üretilen saat sinyalini client ile paylaşır
SDA: Master ve slave arasında bu verileri gönderir.
Herhangi bir zamanda yalnızca bir iletişim kurabilir. Veriyolunda birden fazla client bulunduğundan, ana ünitenin her cliente farklı bir adres kullanarak başvurması gerekir. Yalnızca bu adrese sahip olan salve ele alındığında, diğerlerinden ayrılmaya devam ederken bilgilerle geri cevap verecektir. Bu şekilde aynı veri yolunu birden fazla cihazla iletişim kurmak için kullanabiliriz.
XC8 Derleyicisini kullanarak PIC16F877a Mikrodenetleyici ile I2C
Artık bir I2C iletişiminin nasıl çalıştığını öğrendiğimize göre, kullanacağımız ve I2C satırlarına bazı değerler yazacağımız basit bir program yapalım. Daha sonra bu programı simüle edeceğiz.
Her zaman olduğu gibi, program Yapılandırma bitlerinin ayarlanması ve saat frekansının 20 MHz olarak ayarlanması ile başlayalım.
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #define _XTAL_FREQ 20000000
Bir sonraki adımda önceden tanımlanan PIC16F877a_I2C.h başlık dosyasını projemize include ederek uygulamamıza I2C bağlantısı için gerekli tanımları otomatik tanıtmış oluruz. PIC16F877a_I2C.h dosyasına yazının altında bulunan indirme linki yardımı ile ulaşabilirsiniz.
Başlık dosyasını eklemek için :
#include <xc.h> #include "PIC16F877a_I2C.h"
While döngüsünün içinde I2C iletişimine başlayacağız, I2C veriyoluna birkaç rastgele değer yazacağız ve sonra I2C iletişimini sonlandıracağız. Seçtiğim rastgele değerler D0, 88 ve FF’dir. İstediğiniz değerleri girebilirsiniz. Fakat bu değerleri, simülasyonumuzda doğrulayacağımızdan hatırlayın.
while(1) { I2C_Begin(); I2C_Write(0xD0); I2C_Write(0x88); I2C_Write(0xFF); I2C_End(); __delay_ms(1000); }
Programımızı derleyip Proteus ile similasyonu yapalım.
Hex dosyamızı oluşturup Proteus yardımıyla oluşturduğumuz similasyona yükleyelim. Hex dosyamızı yüklediğimiz similasyonumuzu çalıştıralım ve mikrodenetleyicimizin pinlerini kontrol edelim.
Yazılan değerlere baktığımızda programda belirtiğimiz değerler D0, 88 ve FF’dir. Değerler her 1 saniyede bir yazılmıştır.
/* * File: IIC with PIC16F */ #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #define _XTAL_FREQ 20000000 #include <xc.h> #include "PIC16F877a_I2C.h" int main() { I2C_Initialize(100); //Initialize I2C Master with 100KHz clock while(1) { I2C_Begin(); I2C_Write(0xD0); I2C_Write(0x88); I2C_Write(0xFF); I2C_End(); __delay_ms(1000); } }