“eepromokuyaz.c”
ana dosyamız
============================================================
//
Durali Kiraz 2015
//
PIC16F877A için hazırlanmıştır.
#include
"ayarlar.h"
#include
"bizim_lcd.h" // LCD kütüphanesi tanımlanıyor
#include
"delay.h"
#include
"eeprom.h"
void
main(void) // Ana fonksiyon alanı
{
TRISB
= 0x00; // LCD'ye bağlı portlar çıkış yapılıyor
TRISC
= 0x00; // C portları çıkış yapılıyor
PORTB
= 0x00;
PORTC
= 0x00;
lcd_baslat();
eeprom_yaz(0x00,
'D');
eeprom_yaz(0x01,
'U');
eeprom_yaz(0x02,
'R');
eeprom_yaz(0x03,
'A');
eeprom_yaz(0x04,
'L');
eeprom_yaz(0x05,
'i');
eeprom_yaz(0x06,
' ');
eeprom_yaz(0x07,
'K');
eeprom_yaz(0x08,
'i');
eeprom_yaz(0x09,
'R');
eeprom_yaz(0x0A,
'A');
eeprom_yaz(0x0B,
'Z');
lcd_yaz("EEPROM
verisi:");
lcd_konumlanxy(2,1);
veri_yolla(
eeprom_oku(0x00) );
veri_yolla(
eeprom_oku(0x01) );
veri_yolla(
eeprom_oku(0x02) );
veri_yolla(
eeprom_oku(0x03) );
veri_yolla(
eeprom_oku(0x04) );
veri_yolla(
eeprom_oku(0x05) );
veri_yolla(
eeprom_oku(0x06) );
veri_yolla(
eeprom_oku(0x07) );
veri_yolla(
eeprom_oku(0x08) );
veri_yolla(
eeprom_oku(0x09) );
veri_yolla(
eeprom_oku(0x0A) );
veri_yolla(
eeprom_oku(0x0B) );
for(;;); //Sonsuz
döngüye giriliyor
}
============================================================
“eeprom.c”
dosyamız
============================================================
#include
<pic14regs.h>
#include
"delay.h"
void
eeprom_yaz(unsigned char adres, unsigned char data)
{
EEADR =
adres;
EEDATA =
data;
WREN =
1;
EECON2
= 0x55;
EECON2
= 0xAA;
WR =
1;
while(WR);
WREN
= 0;
}
unsigned
char eeprom_oku(unsigned char adres)
{
EEADR
= adres;
RD
= 1;
return(EEDATA);
}
============================================================
“eeprom.h”
dosyamız
============================================================
*
Dahili
EEPROM Kullanım Klavuzu
*
eeprom_yaz(address, data); ile eepromun istenilen adresine istenilen
bilgi yazılır.
*
eeprom_oku(address); ile eepromun istenilen adresi okunur.
*/
extern
void eeprom_yaz(unsigned char adres, unsigned char data);
extern
unsigned char eeprom_oku(unsigned char adres);
============================================================
Bu dersimizde
mikrodenetleyici programlamanın vazgeçilmezlerinden dahili eeproma
yazma ve okuma işleminin nasıl yapıldığını göreceğiz.
EEPROM,
Electronically Erasable Programmable Read-Only Memory yani
elektriksel olarak
silinip yazılabilen
hafıza bölümüdür. Pic16f877a’nın içinde 256 byte yani 256x8
bit’lik EEPROM
bulunmaktadır.
Kullanacağımız işlemlerdeki bilgilerin, enerji kesildiğinde de
korunmasını
istiyorsak pic’in
EEPROM birimini kullanabiliriz. Eğer kaydedeceğimiz değerler
256byte’tan
büyük ise harici
EEPROM’lar kullanarak istediğimizi yine gerçekleştirebiliriz.
Harici eepromlar şu an bizim konumuz değil. O yüzden dahili eeprom
üzerinde basit bir iki işlem yapacağız.
EEPROM üzerinde
okuma ve yazma yapabilmemiz için datasheetinde yazdığı gibi bir
takım sıralı işlemlerini kuralına göre yapmamız gerekmekte. Bu
işlemlerin işlem adımlarını oluşturan fonksiyonlar topluluğuna
esasında eeprom sürme kodları desek daha isabetli bir anlatım
yapmış oluruz. Bizim sürücü eeprom.c dosyamızda iki fonksiyon
tanımı var. Biri okuma diğeri yazma işlemini yapmakta. PIC16F877A
üzerinde EECON1 ve EECON2(sanal olarak var) isimli iki adet kontrol
registerları bulunur. Eğer eeprom üzerinde okuma ve yazma
yapacaksak bunları doğru şekilde sürmeniz/kontrol etmemiz
gerekir. Bu registerlarla ilgili daha detaylı bilgiyi datasheet
dosyasından edinebilirsiniz. Biz yazma ve okuma işlem adımlarındaki
işlemleri açıklayalım.
OKUMA
İŞLEMİ:
-----------------------------------------------------------------------------------
1-
EEADR = adres;
Bu
adımda okunması gereken adres değerini EEADR isimli registera
yazarız
2-
RD = 1;
Bu
adımda RD Bitini (EECON1 0.bit) 1 yaparız. Bu da okuma yapmak
istediğimizi gösterir.
3-return(EEDATA);
Yukardaki
iki işlemden sonra hafızadaki değer EEDATA registerına
yazılmıştır. Bizde bu registerın değerini okursak sonuca
ulaşmış oluruz
YAZMA
İŞLEMİ:
-----------------------------------------------------------------------------------
1-
EEADR = adres;
Hangi
adrese yazma işi yapılacaksa o adresin değeri EEADR registerına
yazılır.
2- EEDATA =
data;
Yazılacak
hafıza değeri EEDATA registerına yazılır.
3- WREN =
1;
EECON1
bit 2 yani WREN 1 yapılırsa yazma izni verilmiş olur.0 da yazılma
olmaz.
4- EECON2 =
0x55;
yazma
işlemi için kurallardan birisi
5- EECON2
= 0xAA;
yazma
işlemi için kurallardan birisi
6- WR
= 1;
(EECON1
bit 1)WR nin 1 olması ile yazma işlemi başlatılır.
7- while(WR);
WR
sıfır olana kadar program bekletilir.
8- WREN
= 0;
WR
sıfır olduktan sonra WREN sıfır yapılır ki artık yazma izni
kaldırılmış olsun.
Görüldüğü üzere
kurallarını yukarıda açıklamaya çalıştık. Aslında olay
gayet basit. Bu eeprom üzerine yazdığımız veriler
mikrodenetleyici eeprom hafızasında kalıcıdır.
Ana programımızdan
bahsedecek olursak doğrudan eeprom kütüphanemizdeki eeprom_yaz
fonksiyonumuz ile yazdırmak istediğimiz 8 bitlik değeri
yazdırıyoruz. Burada char tipi karakterler yazdırdık. İsterseni
0 dan 255 e kadar sayılardan birini de yazdırabilirsiniz.
Sonrasında ise eeprom_oku fonksiyonu ile okuyup veri_yolla lcd
fonksiyonumuz ile eeprom hafızasındaki karakterleri sırasıyla lcd
ye gönderiyoruz. Sonrasında program for(;;) sonsuz döngüsüne
girerek bizim değerleri lcd üzerinde sürekli göstermemizi
sağlıyor. Bu derste verilemeyen diğer dosyalar bir önceki derslerde bulunmaktadır. Bu dersimizde bu kadar. Başka bir derste görüşmek
üzere hoşçakalın.
duralikiraz.blogspot.com
04
Ağustos 2015
“Muvaffakiyet
Allahtandır”
Kaynak:
*
Hi-Tech ile Pic Programlama – Fırat Deveci