Öncelikle dahili EEPROM nedir ve Flash program hafızası ne işe yarar bundan bahsedelim.  EEPROM (Electronically Erasable Programmable Read-Only Memory) mikrodenetleyicide  RAM in bir kısmını oluşturur. Bu kısım flash program hafızasına sahiptir. Bu durumda EEPROM a yazılan bilgiler elektrik sinyali kesilse bile silinmezler. Bu belleklere ancak programla bilgi yazılıp silinebilir. Dahili EEPROM a 8 bitlik veriler yazılabilir ve dahili EEPROM adresindeki 8 bitlik veriler okunabilir. 

eeprom

  EEPROM da ulaşılmak istenen adres bilgileri EEADR ve EEADRH kaydedicilerinde tutulur. EEPROM daki okuma-yazma işlemlerindeki veri ise EEDATA ve EEDATH kaydedicilerinde tutulur. Dahili EEPROM için sadece EEDATA kaydedicisi yeterlidir. Fakat EEPROM data hafızasına 8 bitlik veriler yazılırken flash program hafızasına 14 bitlik veriler yazılır. Bu nedenle flash hafızaya veri yazılırken verinin yüksek bitli değerini EEDATH kaydedicisi tutarken 6 bitini ise EEDATA kaydecisi tutar. 

 Pic denetleyicilerinin içerisine yüklenen program kodarı flash program hafızasında saklanır.Denetleyici işlemlerini bu kodlara göre yapar. Bu flash program belleğine programlar programlayıcı kartlar vasıtası ile yazılır. Bu flash belleğe denetleyici işlem yaparkende ulaşılabilir. Yani şunu demek istiyorum; denetleyici normal işlemini yaparken bu bellekteki program kodları değiştirilebilir.  İşte bu işlemi yapabilmek için bazı Pic CCS C gibi denetleyicide bazı komutlar vardır. 

   READ_PROGRAM_EEPROM() Fonksiyonu: Flash programdaki istenilen adresteki veriyi okur. 

  WRITE_PROGRAM_EEPROM() Fonksiyonu:  EEPROM daki flash belleğe ve istenilen adrese istenilen kodu yazmayı sağlayan komuttur.

  ERASE_PROGRAM_EEPROM() Fonksiyonu: Bu komut ise istenilen adresteki istenilen veriyi silmek için kullanılır.  

 Şimdi örnek olarak 16F877 mikrodenetleyicisini alırsak. Bu denetleyicide iki tip koruma vardır. Birincisi data EEPROM hafızası koruması ikincisi ise flash bellek hafızası korumasıdır.  Data EEPROM korumasının aktif olup olmamasına bakılmaksızın  data EEPROM içeriği program işlerken denetleyiciye önceden yazılan program ile okunup yazılabilir.  Fakat denetleyici dışından cihazların Data EEPROM’ a ulaşılması engellenir.  Bu koruma programın başında konfigrasyon ayarları ile aktif hale getirilir. 

#fuse CPD  ifadesi data EEPROM korumasını aktif yaparken 

#fuse NOCPD ifadesi korumayı diaktif eder. 

 Aynı şekilde flash program hafızasıda korumaya alınabilir. Böylelikle bir daha programı yükleyen dahil olmak üzere kimse tarafından flash bellekteki program okunamaz. Bunun için de;

 #fuse PROTECT ve #fuse NOPROTECT komutları konfigrasyon ayarları kısmında belirlenir. 

 Şimdi geçelim denetleyicinin bu dahili EEPROM’u nu kullanarak bir hafızalı kronometre yapımına. Şimdi yapacağımız uygulamda B portuna bağlanan LCD de artan süre değerleri milisaniye olarak görülecek ve RA1 girişine bağlı butona basıldığı andaki değer data EEPROM’a  kaydedilecektir. Bu kaydedilen değer ise LCD nin alt satırına verilecektir.  EEPROM’ a kadedilen bu değer istenildiğinde tekrar okunabilir ve devredeki suppy voltaj kesilse bile o bilgi orada kalır. 

Program şöyle olacak;

/*****************************************************************
Dahili EEPROM Uygulaması
******************************************************************/

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(a) //Port yönlendirme komutları A portu için geçerli

#define use_portb_lcd TRUE // LCD B portuna bağlı

#include // LCD.c dosyası programa ekleniyor

int8 _10ms=0; // Tam sayı tipinde değişken tanımlanıyor
unsigned int8 saniye=0; // İşaretsiz tam sayı tipinde değişken tanımlanıyor

//****************** Timer0 Kesmesi *****************************
#int_timer0 // Timer0 kesmesi. Her 10 msn'de bir kesme oluşur.
void timer0_kesme () // Kesme fonksiyonu ismi
{
set_timer0(217); // TMR0 değeri belirleniyor

_10ms++; // _10ms değişkeni değerini 1 arttır

if (_10ms==100) // _10ms değeri 100 olunca (Geçen süre 1 saniye olunca)
{
_10ms=0; // _10ms değişkenini sıfırla
saniye++; // saniye değişkenini bir arttır
if (saniye==255) // Eğer saniye değişkeni 999 olursa sıfırla
saniye=0; // saniye değişkenini sıfırla
}
}

/********* ANA PROGRAM FONKSİYONU********/
void main ( )
{
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

set_tris_a(0x0F); // RA0, RA1, RA2, RA3 pinleri giriş

lcd_init(); // LCD kurulumu yapılıyor

setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // Timer0 ayarları yapılıyor
set_timer0(217); // TMR0 değeri belirleniyor

lcd_gotoxy(1,1); // İmleç 1.sütun, 1. satırda
printf(lcd_putc,"Sure=%03u.%02d",saniye,_10ms); // Saniye ve milisaniye LCD'ye yazdırılıyor
lcd_gotoxy(1,2); // İmleç 1.sütun, 2. satırda
printf(lcd_putc,"Sonuc=%03u.%02d",read_eeprom(0),read_eeprom(1)); // EEPROM'da saklanan saniye ve milisaniye değerleri LCD'ye yazdırılıyor

while(1)
{
if(input(pin_a3)) // SIFIRLA butonuna basıldı ise
{
saniye=_10ms=0;
write_eeprom(0,saniye); // 0 (0x00) adresine saniye değerini yaz
write_eeprom(1,_10ms); // 1 (0x01) adresine milisaniye değerini yaz
lcd_gotoxy(1,1); // İmleç 1.sütun, 1. satırda
printf(lcd_putc,"Sure=%03u.%02d",saniye,_10ms); // Sıfırlanan süre LCD'ye yazdırılıyor
lcd_gotoxy(1,2); // İmleç 1.sütun, 2. satırda
printf(lcd_putc,"Sonuc=%03u.%02d",saniye,_10ms);// Sıfırlanan kayıtlı süre LCD'ye yazdırılıyor
while(input(pin_a3)); // Butondan el çekilene kadar bekle
}

if(input(pin_a0)) // BAŞLA butonuna basıldı ise
{
while(!input(pin_a2)) // DUR butonuna basılana kadar döngü dönsün
{
enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

lcd_gotoxy(1,1); // İmleç 1.sütun, 1. satırda
printf(lcd_putc,"Sure=%03u.%02d",saniye,_10ms); // Süre LCD'ye yazdırılıyor
lcd_gotoxy(1,2); // İmleç 1.sütun, 2. satırda
printf(lcd_putc,"Sonuc=%03u.%02d",read_eeprom(0),read_eeprom(1)); // EEPROM'da saklanan saniye ve milisaniye değerleri LCD'ye yazdırılıyor

if (input(pin_a1)) // YAKALA butonuna basılmışsa
{
write_eeprom(0,saniye); // 0 (0x00) adresine saniye değerini yaz
write_eeprom(1,_10ms); // 1 (0x01) adresine milisaniye değerini yaz
lcd_gotoxy(7,2); // İmleç 7.sütun, 2. satırda
printf(lcd_putc,"%03u.%02d",read_eeprom(0),read_eeprom(1)); // LCD'de yakalanan zamanı göster
while(input(pin_a1)); // Butondan elimizi çekene kadar bekle
}

lcd_gotoxy(6,1); // İmleç 6.sütun, 1. satırda
printf(lcd_putc,"%03u.%02d",saniye,_10ms); // Geçen zamanı LCD'de göster
}
disable_interrupts(GLOBAL); // Tüm kesmeleri pasif yap.
}
}
}

Dahili EEPROM Uygulaması

 Dökümanlar için;  Dahili EEPROM Uygulaması

CEVAP VER

Please enter your comment!
Please enter your name here