CCS C Fonksiyonlarını Kullanarak Donanımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması

pr_01_37_max

 

/******************************************************
 PIC16F877 ile CCS C Dosyalarını Kullanarak Donanımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması
*******************************************************/

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

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

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

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 iletişim ayarları belirtiliyor

#include <input.c> // input.c dosyası programa ekleniyor
#include <stdlib.h> // stdlib.h dosyası programa ekleniyor

#define CS PIN_C2 // CS ifadesi PIN_C2 pini yerine atanıyor

int8 _adres[4],veri,adres_high,adres_low,i; // int8 tipinde değişkenler tanımlanıyor
int16 adres; // int16 tipinde değişken tanımlanıyor
char islem; // char tipinde değişken tanımlanıyor

#int_ssp // SPI iletişiminde yazma veya okuma yapıldığında meydana gelen kesme
void SPI_kesmesi()
{
 output_high(pin_c0); // RC0'a bağlı LED yansın
 delay_ms(250); // Gecikme veriliyor
 output_low(pin_c0); // RC0'a bağlı LED sönsün
}

/******************* 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ışı

 setup_spi(spi_master| spi_L_to_H | spi_clk_div_4); // SPI iletişim ayarları belirtiliyor

 enable_interrupts(int_ssp); // SPI kesmesi aktif yapılıyor
 enable_interrupts(GLOBAL); // Aktif edilen tüm kesmelere izin ver 

 printf("\n\r***********************************************************");
 printf("\n\r 25LC640 Harici EEPROM Bilgi Okuma ve Yazma Programi ");
 printf("\n\r***********************************************************");
 printf("\n\r");

 output_high(cs); // Harici EEPROM CS ucu lojik-1 yapılıyor

 while(1) // Sonsuz Döngü
 {
 do // do-while döngüsü tanımlanıyor
 {
 printf("\n\r\r\r1-Belirtilen adresteki veriyi oku");
 printf("\n\r2-Belirtilen adresten itibaren sona kadar tum adresleri oku");
 printf("\n\r3-Belirtilen adrese istenen veriyi yaz");
 printf("\n\r4-Tum bellege ayni veriyi yaz");
 printf("\n\r5-Durum (Status) kaydedicisi degerini oku");
 printf("\n\r\rBir islem seciniz (1,2,3,4,5) >");

 islem=getc(); // RS232 portundan gelen veri alınıyor
 putc(islem); // "islem" değişkeni içeriği RS232 portuna gönderiliyor
 } while ( (islem!='1') && (islem!='2') && (islem!='3') && (islem!='4') && (islem!='5')); // Girilen karakter 1,2,3,4 dışında ise döngü başına dön

 if (islem=='1') // Eğer okunan karakter "1" ise
 {
 printf("\n\r\rOkumak istediginiz adresi giriniz>");

 get_string(_adres,4); // Seri porttan gelen adres bilgisi string olarak alınıyor
 adres=atol(_adres); // String olarak alınan adres bilgisi tam sayıya çevriliyor
 adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
 adres_low=make8(adres,0); // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

 printf("\n\r\rVeri okunuyor...");

 output_low(cs); // Entegre seçiliyor
 spi_write(0x03); // Okuma komutu (READ) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_high); // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_low); // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 printf("\n\r\rAdres=%04lu Deger=0x%02X",adres,spi_read(0) ); // İstenen adresteki değer okunuyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor
 delay_ms(5); // Gecikme veriliyor
 }

 if (islem=='2') // Eğer okunan karakter "2" ise
 {
 printf("\n\r\rOkumaya baslamak istediginiz adresi giriniz>");

 get_string(_adres,4); // Seri porttan gelen adres bilgisi string olarak alınıyor
 adres=atol(_adres); // String olarak alınan adres bilgisi tam sayıya çevriliyor
 adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
 adres_low=make8(adres,0); // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

 output_low(cs); // Entegre seçiliyor
 spi_write(0x03); // Okuma komutu (READ) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_high); // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_low); // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor

 for(;adres<=0x1FFF;adres++) // Belleğin sonuna gelene kadar döngü dönsün
 {
 printf("\n\r\rAdres=%04lu Deger=0x%02X",adres,spi_read(0)); // İstenen adresteki değer okunuyor
 delay_ms(5); // Gecikme veriliyor
 } 

 output_high(cs); // Entegre bekleme konumuna getiriliyor
 }

 if (islem=='3') // Eğer okunan karakter "3" ise
 {
 printf("\n\r\rBilgi yazmak istediginiz adresi giriniz> ");

 get_string(_adres,4); // Seri porttan gelen adres bilgisi string olarak alınıyor
 adres=atol(_adres); // String olarak alınan adres bilgisi tam sayıya çevriliyor
 adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
 adres_low=make8(adres,0); // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

 printf("\n\r\rBilgiyi giriniz> ");
 veri=gethex(); // Yazılacak veri heksadesimal olarak alınıyor
 printf("\n\r\rVeri yaziliyor...");

 output_low(cs); // Entegre seçiliyor
 spi_write(0x06); // Yazmaya izin ver komutu (WREN) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor

 output_low(cs); // Entegre seçiliyor
 spi_write(0x02); // Yazma komutu (WRITE) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_high); // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_low); // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(veri); // Belirtilen adrese yazdırılacak veri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor
 printf("\n\r\rYazma islemi bitti.");
 }

 if (islem=='4') // Eğer okunan karakter "4" ise
 {
 disable_interrupts(GLOBAL); // Tüm kesmeleri pasif hale getirir. Tüm belleğe yazma işlemi daha hızlı yapılsın diye.
 printf("\n\r\rBilgiyi giriniz> ");
 veri=gethex(); // Yazılacak veri heksadesimal olarak alınıyor

 printf("\n\r\rVeri yaziliyor...");

 for(adres=0;adres<8192;adres=adres+32) // Her sayfa (page) yazımı bitince adres değeri diğer sayfa başlangıcı olsun
 {
 adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
 adres_low=make8(adres,0); // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

 output_low(cs); // Entegre seçiliyor
 spi_write(0x06); // Yazmaya izin ver komutu (WREN) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor

 delay_ms(5); // Gecikme veriliyor
 output_low(cs); // Entegre seçiliyor
 spi_write(0x02); // Yazma komutu (WRITE) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_high); // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_low); // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor

 for(i=0;i<=32;i++) // Her sayfa (page) 32 byte olduğundan
 {
 spi_write(veri); // Belirtilen adrese yazdırılacak veri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 }
 output_high(cs); // Entegre bekleme konumuna getiriliyor
 delay_ms(20); // Gecikme veriliyor
 }

 printf("\n\r\rYazma islemi bitti.");
 enable_interrupts(GLOBAL); // Aktif edilen tüm kesmelere izin ver
 }

 if (islem=='5') // Eğer okunan karakter "5" ise
 {
 output_low(cs); // Entegre seçiliyor
 spi_write(0x06); // Yazmaya izin ver komutu (WREN) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor

 output_low(cs); // Entegre seçiliyor
 spi_write(0x05); // Durum kaydedicisi okuma komutu (WRSR) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 printf("\n\r\rDurum (Status) Kaydedicisi Degeri=0x%02X",spi_read(0)); // Durum kaydedicisi değeri okunuyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor
 }
 }
}

CCS C Fonksiyonlarını Kullanarak Donanımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması

Bu yazı CCS C Örnekleri kategorisine gönderilmiş ve , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.