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..