Turkelektronik.org  Elektronik Forumu  

Geri git   Turkelektronik.org Elektronik Forumu > Elektronik > Hobi Devreleri ve Basit Projeler Problemler

Hobi Devreleri ve Basit Projeler Problemler Hobi elektronik devreleri ,Örnek devreler,Otomobil ve ev elektroniği ,Kuvetlendiriciler (amplifiers) ,Hoperlor , stero sistem (subwoofers), Vericiler (transmitters), Alıcılar (receivers),Jeneratörler (Generatörs),Zamanlayıcılar (Osilatörler)

Cevapla
 
Bookmark and Share Seçenekler Stil
Alt 24-02-2010, 21:52   #1
picman
Yeni Üye
 
picman - ait Kullanıcı Resmi (Avatar)
 
Üyelik tarihi: Feb 2010
Mesajlar: 1
picman is on a distinguished road
Standart i2c ile seri eprom okuma yazma

Content on this page requires a newer version of Adobe Flash Player.

Get Adobe Flash player

arkadaşlar kayan yazı uygulaması yapmaya çalışıyorum. 24c256 epromundan verileri okuyup ekranda göstermem gerekli. her şey güzelde epromdan sıralık okuma işleminde hata var . pic16f877a nın mssp modulunu kullanarak c dilinde i2c haberleşme programı yaptım. veri yama işleminde hiç bir problem yok ama sıralı okuma işleminde. her byte veriden sonra gecikme yaptığımda hatalı okuyor.
program kodları aşağıda arkadaşlar
Kod:
#include <pic.h> 
#include "delay.h" 

#define NULL '\0' 
#define ack 0 
#define nack 1 

unsigned char i; 
unsigned char veri; 

void SSPIF_bekle(void){ 
   SSPIF=0; 
   while(!SSPIF) NULL; 
   SSPIF=0; 
} 

void i2c_basla(void){ 
   SEN=1; 
   SSPIF_bekle(); 
} 

void i2c_basla_tekrar(void){ 
   RSEN=1; 
   SSPIF_bekle(); 
} 

void i2c_dur(void){ 
   PEN=1; 
   SSPIF_bekle(); 
} 

bit i2c_byte_yaz(char veri){ 
   SSPIF=0; 
   SSPBUF = veri; 
   SSPIF_bekle(); 
   if(WCOL) WCOL=0; 
   if(ACKSTAT){ 
      i2c_dur(); 
      return(1); 
   } 
   else 
      return(0); 
} 

void ack_nack_gonder(char x){ 
   ACKDT=x; 
   ACKEN=1; 
   while(ACKEN) NULL; 
} 


char i2c_byte_oku(){ 
char veri; 
   RCEN=1; 
   while(RCEN); 
   if(SSPOV) SSPOV=0; 
   while(!BF); 
   veri = SSPBUF; 
   return(veri); 
} 

void _24c256_adres_yaz(int adres){ 
char adresH,adresL; 
   adresH = (char)( (adres >> 8) & 0x00ff ); 
   adresL = (char)( adres & 0x00ff ); 
   i2c_byte_yaz(0b10100000); 
   i2c_byte_yaz(adresH); 
   i2c_byte_yaz(adresL); 
} 

void _24c256_byte_yaz(int adres, char veri){ 
   i2c_basla(); 
   _24c256_adres_yaz(adres); 
   i2c_byte_yaz(veri); 
   i2c_dur(); 
} 

char _24c256_byte_oku(int adres){ 
char veri; 
   i2c_basla(); 
   _24c256_adres_yaz(adres); 
   i2c_basla_tekrar(); 
   i2c_byte_yaz(0b10100001); //yazma bilgisi.. 
   veri = i2c_byte_oku(); 
   ack_nack_gonder(nack); 
   i2c_dur(); 
   return(veri); 
} 

char _24c256_sonraki_byte_oku(char ack_dt){ 
char veri; 
   veri = i2c_byte_oku(); 
   ack_nack_gonder(ack_dt); 
   return(veri); 
} 

void main(void){ 
   SMP=1; 
   SSPADD=40; 
   SSPCON2=0; 
   PORTC =  0b11100111;      //SCL ve SDA Clear edildi 
     TRISC =  0b00011000;      //i2c için SLC ve SDA pinleri giriş yapıldı 
   SSPCON = 0B00101000;       //İ2C MASTER MODU SSPEN AKTİF; 
   SSPIF=0; 
i=0; 

DelayMs(20); 
/* 
//------128 byte veri yazılıyor----------------- 
i2c_basla(); 
_24c256_adres_yaz(0x00); 
for(i=0; i<64; i++){ 
   i2c_byte_yaz(i); 
} 
i2c_dur(); 
DelayMs(20); 
i2c_basla(); 
_24c256_adres_yaz(64); 
for(i=64; i<128; i++){ 
   i2c_byte_yaz(i); 
} 
i2c_dur(); 
//--------------------------------------------- 
*/ 

//---------------sıralı bir byte okuma--------- 
DelayMs(10); 
i2c_basla(); 
_24c256_adres_yaz(0x00); 
i2c_basla_tekrar(); 
i2c_byte_yaz(0b10100001); 
for(i=0; i<128; i++){ 
   veri = i2c_byte_oku(); 
   if(i!=127) 
      ack_nack_gonder(0); 
   else 
      ack_nack_gonder(1); 
} 
i2c_dur(); 

//---------------------------------------------- 
/* 
//----------her byte ı adresleyerek okuma------------- 
for(i=0; i<10; i++){ 
   veri[i] = _24c256_byte_oku(i); 
   DelayMs(1); 
} 
//----------------------------------------------------- 
*/ 
for(;;); //programı durdur.. 
}
yardımlarınızı bekliyorum herkese kolay gelsin..
picman isimli Üye şimdilik offline konumundadır   Alıntı ile Cevapla
Cevapla

Etiketler
24c256, eprom, haberleşme, i2c, pic16f877

Seçenekler
Stil

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı

Hizli Erisim


WEZ Format +2. Şuan Saat: 10:07.


Powered by vBulletin
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
ßy Turkelektronik.org ©2009