5 Ağustos 2015 Çarşamba

SDCC ile Dahili Eeprom'a okuma ve yazma (16F877A) -Ders14



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

6 yorum:

  1. Elinize sağlık hocam usb konusunda sdcc çalışması yapmayı düşünüyormusunuz. Sdcc temel aldığımız bir çalışmamız var ama usb cdc örneklerinde sıkıntı yaşadık.

    YanıtlaSil
    Yanıtlar
    1. Maalesef şu aralar çalışma yapmam mümkün görünmüyor. 18F serisi pic mcu lar ile sdcc kodları daha sağlıklı iş görmekte, bu seriden usb çıkışları olan (18F2550, 18F4550 gibi) pic ler kullanılabilir. Kodlama aslında xc8 yada hi-tech C kodlarının aynen uygulanması kadar basit ve uyumlu. Zaten bende bu yazıyı hazırlarken fırat devecinin hitec-c kitabından örnekleri baz aldım.

      Sil
    2. Bu arada benim size hocam demem lazım :)

      Sil
    3. Sağolun sizin yaptığınız işleride okudum çok iyi işler çıkarmışsınız. Size yeni ürünümüz olan pickat geliştirme kartından hediye göndermek isterim kabul ederseniz. İletişim için d.nacikaya@gmail.com adresinden bana ulaşabilirsiniz. Web sitesi www.pickat.org

      Sil
    4. Teşekkür ederim sağolun.

      Sil
  2. Bu yorum yazar tarafından silindi.

    YanıtlaSil