merhabalar.
birkaç gündür 24lc01 e veri kaydetmeye çalışıyorum fakat bir türlü başaramadım.acaba atladığım bir şeymi var.
kod
#include <htc.h>
#include <delay.c>
#include <i2c.c>
void WriteByte(unsigned char addr, unsigned char byte)
{
i2c_PutByte(addr);
i2c_PutByte(byte);
}
void main()
{
TRISB=0;
TRISE=0b011;
PORTB=0;
i2c_Start();
i2c_PutByte(0xa2);
WriteByte(0x00,0x0f);
i2c_Stop();
DelayMs(250);
DelayMs(250);
for(;;);
}
devre ise(//%5BURL=http://img12.imageshack.us/my.php?image=adszcy9.jpg%5D%5Bimg%5Dhttp://img12.imageshack.us/img12/6792/adszcy9.th.jpg)[/URL][/img]
yanlışlık var sematikte epromun datashet bak
Oncelıkle 24CXX türü epromlara bilgi yazmak ve okuma sekli aşağıdaki şekilde
i2c_Start()
i2c_WriteByte(0xA0) // Eepromun adresi Datasheet te yazıyor
i2c_WriteByte(adres1)
i2c_WriteByte(adres2)
i2c_WriteByte(data) // Yazmak istedigin veri
i2c_Stop()
Okuma kısmı :
i2c_Start()
i2c_WriteByte(0xA0) // Eepromun adresi Datasheet te yazıyor
i2c_WriteByte(adres1)
i2c_WriteByte(adres2)
i2c_Rstart()
i2c_WriteByte(0xA1)
i2c_Read(data)
i2c_Stop()
Not:
Yukarda yazdıklarım da hata veya yanlısım olabilir.
Su an bende bu konu uzerınde calısıyorum
Yapıp çalıştırabilirsem buraya koyacagım.
hocam bende dediğiniz kodları bi deneyeyim datsheete de detaylı bir inceleyim.ikinizde sağolun
dediğinzi kodları denedim .dediğiniz gibi eepromun adresini falan gönderdim ama halen somut bir şey elime geçmedi.yeni yanıtlarınızı bekliyorum.
teşekkürler
Merhaba,
Ben 24c512 ile ilgili örnek kod yayınlamıştım. o kodları deneyin.
Selamlar
Alıntı yapılan: arslan74Merhaba,
Ben 24c512 ile ilgili örnek kod yayınlamıştım. o kodları deneyin.
Selamlar
hocam sağolasın.
Alıntı yapılan: arslan74Merhaba,
Ben 24c512 ile ilgili örnek kod yayınlamıştım. o kodları deneyin.
Selamlar
Merhaba hocam ;
https://www.picproje.org/index.php/topic,18861&highlight=i2clinkteki kodunuzu kullanarak bir seyler yapmaya calıstım ama malesef
yazdıgım veriyi okuyamadım.
kodum aşagıdadır.
Acaba nerde hata yapmış olabilirim.
Not: SCL yi pul up da denedım pull upsızda degısen bır sey olmadı.
Yoksa hocam kutuphanenizi mi yanlış kulladım.
simülasyon devresi olarak proteus taki PİCDEM2 yi kullanıyorum.
#include <pic.h>
#include <stdio.h>
#include "lcd.h"
#include "delay.h"
#include "877-i2c.h"
#define yaz RA4
#define oku RB0
unsigned char outString[17];
unsigned char veri;
unsigned char adres;
void main(void)
{
ADCON1 = 0x06; // ADC iptal.
TRISB=0b00000001;
TRISA4=1;
PORTB=0;
veri =64;
adres=50;
i2c_init();
lcd_init(FOURBIT_MODE);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazilak ");
lcd_goto(S2_1); // 1. satırının 1.cü sütününa git
sprintf (outString, "veri= %d ", veri );
lcd_puts(outString);
lcd_goto(S2_10); // 2. satırının 1.cı sütününa git
sprintf (outString, " adres = %d ", adres );
lcd_puts(outString);
veri=0;
while(1){
if(!yaz)
{ DelayUs(180);
lcd_clear();
i2c_write(50,64);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazildi");
}
if(!oku)
{ DelayUs(180);
lcd_clear();
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Okunan Veri=");
veri=i2c_read(50);
sprintf (outString, " %d ", veri );
lcd_puts(outString);
}
}
}
Merhaba,
Bu proje ile ilgileneli cok zaman gecti. Şimdi bir cok şeyi hatırlamiyorum.
Haberleşmeyi yazılımsal olarak yaptığım için OSC frekansı cok önemli. Ben 4Mhz ile PIC i kullaniyorum. Örnek kod tekrar yayınlıyorum.
Herader dosyası:
http://rapidshare.com/files/199586564/877-i2c.h.html
Kod Dosyası:
http://rapidshare.com/files/199660242/877-i2c.c.html
Selamlar,
aslan hocam iki gündür verdiğiniz kodu deniyorum.bir kaç kere denedim.yazdı.fakat hiçbirşey değiştirmememe rağmen artık yazmamıyorum.biraz daha uğraşıyım bakalım ne çıkacak.somut birşy elde edebilirsem tartışalım.
bu kodları bir internet sitesinde buldum.
877_i2c
/*===========================================================================
Written in HI-TEC PIC C COMPILER 8.6.01
this program is using the hardware i2c on the pic 16f877 to write
to 24LC01B configured for a x8 org I used the PICDEM 2 demo board from MICROCHIP
===========================================================================
the project contains 2 files:
877_i2c.h this is the header file all functions are in it include it in your project
877_i2c.c this is a demo program to illustrate using this header
to use the files :
init_i2c(); Call before the other functions are used
write_ext_eeprom(a, d); Write the byte "d" to the address" a"
d = read_ext_eeprom(a); Read the byte "d" from the address" a"
===========================================================================
the demo program is writing 10 numbers (0 to 10) to 10 first pleases in the eeprom memory
and showing it on leds on PORTB on PICDEM 2,
after it lights all the leds once to indicate moving to read state,
and then it lights on the leds of the address it is going to read, waiting a while
and sends to leds the data it read from that address an so on, 10 times for the 10 read addresses
(attention!! THE ADDRESS AND THE DATA IT READ should be the SAME if not check the pin connection or
the 820 ohm pull up resistors).
I used 24LC01B that was on the board:
pin 1 to 4 connected to VSS
pin 5 "SDA" connected to RC4 PIN 23 on PIC (do not forget to connect to this point a 820 ohm pull up resistor to VCC)
pin 6 "SCL" connected to RC3 PIN 18 on PIC (do not forget to connect to this point a 820 ohm pull up resistor to VCC)
pin 7 "WP" connected to VSS
pin 8 connected to VCC
you can watch the eeprom connection drawings in PICDEM 2 MANUEL on microchip site WWW.MICROCHIP.COM
the PICDEM 2 is using 2 pull up resistors of 820 ohm on the board.
*/
/******************************************************************************************/
#include <pic18.h>
#include "delay.h"
#include "delay.c"
#include "877_i2c.h"
/******************************************************************************************/
void write_ext_eeprom(unsigned char address, unsigned char data)
{
i2c_start();
i2c_write(0xa0);
i2c_write(address);
i2c_write(data);
i2c_stop();
DelayMs(11);
}
/******************************************************************************************/
unsigned char read_ext_eeprom(unsigned char address)
{
unsigned char data;
i2c_start();
i2c_write(0xa0);
i2c_write(address);
i2c_repStart();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return(data);
}
/******************************************************************************************/
void main()
{
unsigned char i=0;
PORTB=0x00; // port
PORTC=0x00; // port
TRISB=0x00; //portb out
TRISC=0x00; //portc out
i2c_init(); // init i2c
while(i<=10) /* write 10 numbers to eeprom */
{
PORTB=i; // the value of i on leds i is the curent address and also the data
write_ext_eeprom(i,i); // it to eeprom
i++;
DelayMs(255);
}
PORTB=0xff; // some leds
DelaySec(1);
PORTB=0x00;
DelaySec(1);
i=0;
while(i<=10)
{
PORTB=i; // the address will read from the EEprom on the leds
DelayMs(255);
PORTB=0x00; // leds off
DelayMs(255);
PORTB=read_ext_eeprom(i); // the memory and show it on leds,it shoaled be the same like the address
DelayMs(255);
i++;
}
}
/******************************************************************************************/
877_i2c.h
/******************************************************************************************/
// Hardware I2C single master routines for PIC16F877
// for HI-TEC PIC C COMPILER.
//
// i2c_init - initialize I2C functions
// i2c_start - issue Start condition
// i2c_repStart- issue Repeated Start condition
// i2c_stop - issue Stop condition
// i2c_read(x) - receive unsigned char - x=0, don't acknowledge - x=1, acknowledge
// i2c_write - write unsigned char - returns ACK
//
// modified from CCS i2c_877 demo
//
//
/******************************************************************************************/
void i2c_init()
{
TRISC3=1; // set SCL and SDA pins as inputs
TRISC4=1;
SSPCON = 0x38; // set I2C master mode
SSPCON2 = 0x00;
//SSPADD = 0x6; // 400kHz bus with 10MHz xtal - use 0x0C with 20MHz xtal
SSPADD = 10; // 100k at 4Mhz clock
STAT_CKE=0; // use I2C levels worked also with '0'
STAT_SMP=1; // disable slew rate control worked also with '0'
PSPIF=0; // clear SSPIF interrupt flag
BCLIF=0; // clear bus collision flag
}
/******************************************************************************************/
void i2c_waitForIdle()
{
while (( SSPCON2 & 0x1F ) | STAT_RW ) {}; // wait for idle and not writing
}
/******************************************************************************************/
void i2c_start()
{
i2c_waitForIdle();
SEN=1;
}
/******************************************************************************************/
void i2c_repStart()
{
i2c_waitForIdle();
RSEN=1;
}
/******************************************************************************************/
void i2c_stop()
{
i2c_waitForIdle();
PEN=1;
}
/******************************************************************************************/
int i2c_read( unsigned char ack )
{
unsigned char i2cReadData;
i2c_waitForIdle();
RCEN=1;
i2c_waitForIdle();
i2cReadData = SSPBUF;
i2c_waitForIdle();
if ( ack )
{
ACKDT=0;
}
else
{
ACKDT=1;
}
ACKEN=1; // send acknowledge sequence
return( i2cReadData );
}
/******************************************************************************************/
unsigned char i2c_write( unsigned char i2cWriteData )
{
i2c_waitForIdle();
SSPBUF = i2cWriteData;
return ( ! ACKSTAT ); // function returns '1' if transmission is acknowledged
}
/******************************************************************************************/
Arkadaşlar ben çalışmalarımın simülasyonu sırasında proteusun i2c debuggerından çok faydalanmıştım.
bence en önemli yardımcınız olacaktır.
o günlerde bayağı bir tırmalamıştım. yeri gelmişken arslan_74'e tekrar teşekkür ederim.
kolay gelsin..
Alıntı yapılan: tyilginArkadaşlar ben çalışmalarımın simülasyonu sırasında proteusun i2c debuggerından çok faydalanmıştım.
bence en önemli yardımcınız olacaktır.
o günlerde bayağı bir tırmalamıştım. yeri gelmişken arslan_74'e tekrar teşekkür ederim.
kolay gelsin..
Hocam proteusun i2c debuggerın nasıl kullanıldıgını tam olarak bılmıyorum denedım ama basaramadım.
mumkunse kullanımını tarif edebilirmisinız
Alıntı yapılan: M_BAlıntı yapılan: tyilginArkadaşlar ben çalışmalarımın simülasyonu sırasında proteusun i2c debuggerından çok faydalanmıştım.
bence en önemli yardımcınız olacaktır.
o günlerde bayağı bir tırmalamıştım. yeri gelmişken arslan_74'e tekrar teşekkür ederim.
kolay gelsin..
Hocam proteusun i2c debuggerın nasıl kullanıldıgını tam olarak bılmıyorum denedım ama basaramadım.
mumkunse kullanımını tarif edebilirmisinız
üzerinden hayli zaman geçtiği için debuggerin monitör ekranının görüntüsünü hatırlıyamıyorum ama şöyle bir yol izleyebileceğinizi düşünüyorum ;
proteusta debuggerın nasıl bağlanacağını bildiğinizi düşünerek (blimiyorsanız belirtin yardımcı olurum) önce çalıştığını bildiğiniz bir hex ve şema bularak proteusta simüle edin. debuggeri de i2c eeprom pinlerine paralel bağlayın. i2c eepromda pull-up direnci olarak sakın "res" tipi herhangi bir direnç koymayın çalışmaz. Mutlaka PULL-UP direnci olmalı. sonra hexi çalıştırarak debuggerın monitöründe neler geçtiğini görün. son olarakta sizin programınızı simüle ettiğinizde nelerin eksik gittiğine bakın.
umarım faydası olur..
kolay gelsin..
dayanamayıp size birkaç şey hazırladım.
bu çalışmada üstteki butona basınca eprom üzerinden 10 karakter okuyor, alttaki butona basınca ise epromun 0. adresine 0x90 değerini yazıyor. üğstteki buton okuma sonrası 0. adresten 0x90 okudu ise C portu 0xFF oluyor aksi durumda 0x00. zamanım kısıtlı olduğu için lcd falan koyamadım.
gelelim debuggere;
resimdek
çıktı yazma sırasında geçen paket. önce (S) start sonra klasik başlangış komutu 0xA0 sonra ise 256bytettan daha büyük bir eprom olduğu için 2 adet adres karakteri sonrasında da "90" değeri görülüyor.
okuma sırasında ise birinci karakter olan 90'ı ve sonrasını gözlemleyebiliyorsunuz.
daha fazla zaman ayıramayacağım. eksiğim veya noksanım varsa forumdaki diğer arkadaşlarda gözden geçirirse iyi olur.
kolay gelsin
ana porogram:
#include <htc.h>
#include <delay.c>
#include "i2c.h"
__CONFIG(UNPROTECT & WDTDIS & PWRTEN & XT & LVPDIS);
char dizi[20];
#define Buton1 RB0
#define Buton2 RB4
//***************************************************************************************
void I2C_oku(void) {
i2c_read2(0x0, 10, dizi);
if(dizi[0]==0x90) PORTC=0xFF; else PORTC=0;
}
//***************************************************************************************
void I2C_yaz(void) {
i2c_write2(0x0, 0x90);
}
//***************************************************************************************
void main(void) {
unsigned char byte;
unsigned char SeriKomut, araci;
RBPU = 0;
ADCON1=6;
OPTION=0;
TRISA = 0b11111111;
TRISB = 0b11111111;
TRISC = 0b00000000;
TRISD = 0b11111111;
TRISE = 0b111;
DelayMs(250); DelayMs(250); DelayMs(250);
PORTC=0;
i2c_init();
while(1) {
if (!Buton1) {
I2C_oku();
DelayMs(250); DelayMs(250);
}
if (!Buton2) {
I2C_yaz();
DelayMs(250); DelayMs(250);
}
}
}
//***************************************************************************************
kendi yazdığım i2c.c;
#include <pic.h>
#include <delay.h>
#include "i2c.h"
void gecikme(void) {
unsigned char sayac;
//for (sayac=0;sayac<5;sayac++);
}
void i2c_init(void) {
i2c_clk = 1;
i2c_dta = 1;
i2c_dtayon = 0;
i2c_clkyon = 0;
i2c_clk = 1;
i2c_dta = 1;
}
void i2c_start(void) {
i2c_dta = 1;
i2c_clk = 1;
gecikme();
i2c_dta = 0;
gecikme();
i2c_clk = 0;
}
void i2c_stop(void) {
i2c_dta = 0;
gecikme();
i2c_clk = 1;
gecikme();
i2c_dta = 1;
}
unsigned char i2c_write_int(unsigned char veri) {
unsigned char bits, sayac, sonuc;
bits=0x80;
for (sayac=0; sayac<8; sayac++) {
i2c_clk=0;
if (veri & bits) i2c_dta=1; else i2c_dta=0;
gecikme();
i2c_clk=1;
gecikme();
i2c_clk=0;
bits=bits>>1;
}
i2c_clk = 0;
i2c_dtayon = 1;
gecikme();
i2c_clk = 1;
gecikme();
sonuc = i2c_dta;
//if (i2c_dta==1) {
i2c_clk = 0;
i2c_dtayon = 0;
return sonuc;
}
unsigned char i2c_read_int(void) {
unsigned char bits, sayac, veri;
bits=0x80;
veri=0;
i2c_clk = 0;
i2c_dtayon = 1;
gecikme();
for (sayac=0; sayac<8; sayac++) {
i2c_clk = 1;
if ( i2c_dta==1 ) veri |= bits;
i2c_clk = 0;
gecikme();
bits = bits >> 1;
}
i2c_dtayon = 0;
i2c_dta = 0;
i2c_clk = 1;
gecikme();
i2c_clk = 0;
return veri;
}
unsigned char i2c_readson(void) {
unsigned char bits, sayac, veri;
bits=0x80;
veri=0;
i2c_clk = 0;
i2c_dtayon = 1;
for (sayac=0; sayac<8; sayac++) {
i2c_clk = 1;
gecikme();
if ( i2c_dta==1 ) veri |= bits;
i2c_clk = 0;
gecikme();
bits = bits >> 1;
}
i2c_dtayon = 0;
i2c_dta = 1;
i2c_clk = 1;
gecikme();
i2c_clk = 0;
return veri;
}
unsigned char i2c_write(unsigned char adres, unsigned char veri) {
unsigned char hata;
i2c_start();
hata=i2c_write_int(0xA0);
if (hata) goto Cik;
hata=i2c_write_int(adres);
if (hata) goto Cik;
hata=i2c_write_int(veri);
i2c_stop();
Cik:
return hata;
}
unsigned char i2c_write2(unsigned int adres, unsigned char veri) {
unsigned char adresh, adresl, hata;
adresh = (adres >> 8) & 0x00FF;
adresl = adres & 0x00FF;
i2c_start();
hata=i2c_write_int(0xA0);
if (hata) goto Cik;
hata=i2c_write_int(adresh);
if (hata) goto Cik;
hata=i2c_write_int(adresl);
if (hata) goto Cik;
hata=i2c_write_int(veri);
i2c_stop();
Cik:
return hata;
}
unsigned char i2c_read(unsigned char adres, unsigned char uzunluk, unsigned char *veri) {
unsigned sayac, hata;
i2c_start();
hata=i2c_write_int(0xA0);
if (hata) goto Cik;
hata=i2c_write_int(adres);
if (hata) goto Cik;
i2c_start();
hata=i2c_write_int(0xA1);
if (hata) goto Cik;
for (sayac=0; sayac<(uzunluk-1); sayac++) *(veri+sayac) = i2c_read_int();
*(veri+uzunluk-1) = i2c_readson();
i2c_stop();
*(veri+uzunluk) = '\0';
Cik:
return hata;
}
unsigned char i2c_read2(unsigned int adres, unsigned char uzunluk, unsigned char *veri) {
unsigned char sayac, hata, adresh, adresl;
adresh = (adres >> 8) & 0x00FF;
adresl = adres & 0x00FF;
i2c_start();
hata=i2c_write_int(0xA0);
if (hata) goto Cik;
hata=i2c_write_int(adresh);
if (hata) goto Cik;
hata=i2c_write_int(adresl);
if (hata) goto Cik;
i2c_start();
hata=i2c_write_int(0xA1);
if (hata) goto Cik;
for (sayac=0; sayac<(uzunluk-1); sayac++) *(veri+sayac) = i2c_read_int();
*(veri+uzunluk-1) = i2c_readson();
i2c_stop();
*(veri+uzunluk) = '\0';
Cik:
return hata;
}
ve ic2.h :
#ifndef I2C_H_
#define I2C_H_
#endif /*I2C_H_*/
#ifndef i2c_clk
#define i2c_clk RA2
#endif
#ifndef i2c_dta
#define i2c_dta RA3
#endif
#ifndef i2c_clkyon
#define i2c_clkyon TRISA2
#endif
#ifndef i2c_dtayon
#define i2c_dtayon TRISA3
#endif
extern void i2c_init(void);
extern unsigned char i2c_write(unsigned char adres, unsigned char veri);
extern unsigned char i2c_write2(unsigned int adres, unsigned char veri);
extern unsigned char i2c_read(unsigned char adres, unsigned char uzunluk, unsigned char *veri);
extern unsigned char i2c_read2(unsigned int adres, unsigned char uzunluk, unsigned char *veri);
umarım faydası olur.
kolay gelsin..
dosyaları unutmuşum.
burada da proteus simülasyonu, i2c ekran görüntüsü, ve diğer kodlar mevcut.
(http://www.loadtr.com/resimekle.php?r=z1.341790)
dosyalar burada (http://rapidshare.com/files/200420481/i2c.rar.html)
@tyilgin hocam;
Allah razı olsun.
Elinize sağlık simdi indirip inceleyecegim
vakit ayırıp yardımcı olmanız bile yeter
Tekrar Teşekkürler
M_B
Alıntı yapılan: M_B@tyilgin hocam;
Allah razı olsun.
Elinize sağlık simdi indirip inceleyecegim
vakit ayırıp yardımcı olmanız bile yeter
Tekrar Teşekkürler
M_B
yardımcı olabildiysem ne mutlu.
iyi akşamlar dilerim.
Bu FULL kodlu Animasyonlu projeyi'de çalıştırıp incelermisiniz?
(http://img4.imageshack.us/img4/4620/2002nh5.png)
(http://img23.imageshack.us/img23/2553/2102su0.png)
http://www.4shared.com/file/88659788/110ce0ff/I2C_24LC01B_ahmet2004.html (http://www.4shared.com/file/88659788/110ce0ff/I2C_24LC01B_ahmet2004.html)
tüm hocalarım yardımlarınız için teşekkür ederim.tüm kodları denedim ama sonuç sıfır.bende en baştan alayım dedim.önce i2c nini philipsin döküman larını inceledim ve en temel kaynak olan hi -tech in içindeki demo yu çalıştırdım ve bişi farkettim i2c debuggerden gördüğüm kadarıyla picden eproma tüm veriler gönderiliyor fakat sanırım eprom yazmıyor.halbuki onay falan var.acaba proteusda bu similasyondamı sorun varki?burada hardware i2c olduğundan her iki bittede direnç var.
bunu sizler kendiniz derleseniz ve proteusla bi similisayon yapsanız belki bizim programda hata vardır.
yardımlarınız için teşekkürler
demo:::/* I2C test program that writes & reads data to an I2C EEPROM device. */
#include <pic18.h>
#include "delay.h"
#include "i2c.h"
#define ROM 0xA0 /* I2C EEPROM */
void flashled(void) { /* flash a led on RB0 */
while(1) {
RB0 = 1;
DelayMs(200);
RB0 = 0;
DelayMs(200);
}
}
void WriteByte(unsigned char addr, unsigned char byte) {
i2c_WriteTo(ROM);
if (i2c_PutByte(addr)==I2C_ERROR)
flashled();
if (i2c_PutByte(byte)==I2C_ERROR)
flashled();
}
int ReadByte(unsigned char addr) {
i2c_WriteTo(ROM);
if (i2c_PutByte(addr)==I2C_ERROR)
flashled();
i2c_ReadFrom(ROM);
return i2c_GetByte(I2C_LAST);
}
void main(void) {
unsigned char count,val;
TRISB=0; /* use a led on RB0 - set as output */
PORTB=0;
RB0=0;
/* initialize i2c */
#ifdef I2C_MODULE
SSPMode(MASTER_MODE);
SSPEN = 1;
CKP = 1;
#else
SCL_DIR = I2C_OUTPUT;
SDA_DIR = I2C_OUTPUT;
SDA = 0;
SCL = 0;
#endif
while(1) {
for(count=0; count < 10; ++count) {
WriteByte(count,count); /* write to I2C EEPROM */
val = ReadByte(count); /* read back value */
if (val != count) /* verify */
flashled();
}
DelayMs(200);
}
}
i2c debugger da çıkan noise ifadesi ne gürültüsüdürki anlamadım.
(http://img5.imageshack.us/img5/7162/adsz1z.th.jpg) (http://img5.imageshack.us/my.php?image=adsz1z.jpg)
bu ise proteus
(http://img15.imageshack.us/img15/4010/adsz2k.th.jpg) (http://img15.imageshack.us/my.php?image=adsz2k.jpg)
baya uğraştım fakat hep aynı sonuç.acaba hi-tech in demo dosyasındaki programda çalışmazsa biz ne yapalım.
merhaba matristeki engelleri sharp sensörle görerek eprom hafızaya kaydetme işlemi yapan proje tasarlıyoruz.
16f877A pic kullanıyoruz engeli hafızaya nasıl aldırırız, engeli hafızaya alıp engeli yerinden kaldırdığımızda engelin bulunduğu yere gitmeyecek
Sonunda i2c ile ilgili calısmamda eproma yazıp okuya bildim.
Su an kutuphane seklıne getırmedım. Eksıklerım var ama en azından calısır duruma geldı. En azından baskalarına yol gosterır.
simülasyon devresi olarak proteus taki PİCDEM2 yi kullanıyorum.
#include <pic.h>
#include <stdio.h>
#include "lcd.h"
#include "delay.h"
#define yaz RA4
#define oku RB0
#define i2c_scl RC3
#define i2c_sda RC4
#define i2c_scl_direction TRISC3
#define i2c_sda_direction TRISC4
unsigned char outString[17];
unsigned char veri;
unsigned char adres;
void i2c_init(void)
{
i2c_scl= 0;
i2c_sda= 0;
i2c_scl_direction = 1;
i2c_sda_direction = 1;
}
void i2c_start(void)
{
DelayUs(10);
i2c_sda_direction = 1;
DelayUs(10);
i2c_scl_direction = 1;
DelayUs(10);
i2c_sda_direction = 0;
DelayUs(10);
i2c_scl_direction = 0;
DelayUs(10);
}
void i2c_stop(void)
{
DelayUs(10);
i2c_sda_direction = 0;
DelayUs(10);
i2c_scl_direction = 0;
DelayUs(10);
i2c_scl_direction = 1;
DelayUs(10);
i2c_sda_direction = 1;
DelayUs(10);
}
bit i2c_tx(unsigned char d )
{
char x;
static bit b;
for(x=8;x; x--){
if(d&0x80) i2c_sda_direction = 1;
else
i2c_sda_direction = 0;
i2c_scl_direction = 1;
d<<=1;
i2c_scl_direction = 0;
}
i2c_sda_direction = 1;
i2c_scl_direction = 1;
DelayUs(10);
b = i2c_sda;
i2c_scl_direction = 0;
return b;
}
unsigned char i2c_rx(char ack )
{
char x,d = 0;
i2c_sda_direction = 1;
for(x=0; x<8; x++) {
d<<=1;
do {
i2c_scl_direction = 1;
}
while(i2c_scl==0);
DelayUs(10);
if(i2c_sda) d|=1;
i2c_scl_direction = 0;
}
if(ack) i2c_sda_direction =0;
else
i2c_sda_direction = 1;
i2c_scl_direction =1;
DelayUs(10);
i2c_scl_direction =0;
i2c_sda_direction =1;
return d;
}
i2c_write( char address, char data )
{
i2c_start();
i2c_tx(0xA0);
i2c_tx(0x00);
i2c_tx(address);
i2c_tx(data);
i2c_stop();
}
i2c_read(unsigned char adres)
{
unsigned int ee_data;
i2c_start();
i2c_tx(0xA0);
i2c_tx(00);
i2c_tx(adres);
i2c_start();
i2c_tx(0xA1);
ee_data = i2c_rx(adres);
i2c_stop();
return ee_data;
}
void main(void)
{
ADCON1 = 0x06; // ADC iptal.
TRISB=0b00000001;
TRISA4=1;
TRISC=0;
PORTB=0;
veri =65;
adres=10;
i2c_init();
lcd_init(FOURBIT_MODE);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazilak ");
lcd_goto(S2_1); // 1. satırının 1.cü sütününa git
sprintf (outString, "veri= %d ", veri );
lcd_puts(outString);
lcd_goto(S2_10); // 2. satırının 1.cı sütününa git
sprintf (outString, " adres = %d ", adres );
lcd_puts(outString);
veri=0;
while(1){
if(!yaz)
{ DelayUs(180);
lcd_clear();
i2c_write(10,65);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazildi");
}
if(!oku)
{ DelayUs(180);
lcd_clear();
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Okunan Veri=");
veri=i2c_read(10);
sprintf (outString, " %d ", veri );
lcd_puts(outString);
}
}
}
Not: eksiklerim var.
Alıntı yapılan: M_BSonunda i2c ile ilgili calısmamda eproma yazıp okuya bildim.
Su an kutuphane seklıne getırmedım. Eksıklerım var ama en azından calısır duruma geldı. En azından baskalarına yol gosterır.
simülasyon devresi olarak proteus taki PİCDEM2 yi kullanıyorum.
#include <pic.h>
#include <stdio.h>
#include "lcd.h"
#include "delay.h"
#define yaz RA4
#define oku RB0
#define i2c_scl RC3
#define i2c_sda RC4
#define i2c_scl_direction TRISC3
#define i2c_sda_direction TRISC4
unsigned char outString[17];
unsigned char veri;
unsigned char adres;
void i2c_init(void)
{
i2c_scl= 0;
i2c_sda= 0;
i2c_scl_direction = 1;
i2c_sda_direction = 1;
}
void i2c_start(void)
{
DelayUs(10);
i2c_sda_direction = 1;
DelayUs(10);
i2c_scl_direction = 1;
DelayUs(10);
i2c_sda_direction = 0;
DelayUs(10);
i2c_scl_direction = 0;
DelayUs(10);
}
void i2c_stop(void)
{
DelayUs(10);
i2c_sda_direction = 0;
DelayUs(10);
i2c_scl_direction = 0;
DelayUs(10);
i2c_scl_direction = 1;
DelayUs(10);
i2c_sda_direction = 1;
DelayUs(10);
}
bit i2c_tx(unsigned char d )
{
char x;
static bit b;
for(x=8;x; x--){
if(d&0x80) i2c_sda_direction = 1;
else
i2c_sda_direction = 0;
i2c_scl_direction = 1;
d<<=1;
i2c_scl_direction = 0;
}
i2c_sda_direction = 1;
i2c_scl_direction = 1;
DelayUs(10);
b = i2c_sda;
i2c_scl_direction = 0;
return b;
}
unsigned char i2c_rx(char ack )
{
char x,d = 0;
i2c_sda_direction = 1;
for(x=0; x<8; x++) {
d<<=1;
do {
i2c_scl_direction = 1;
}
while(i2c_scl==0);
DelayUs(10);
if(i2c_sda) d|=1;
i2c_scl_direction = 0;
}
if(ack) i2c_sda_direction =0;
else
i2c_sda_direction = 1;
i2c_scl_direction =1;
DelayUs(10);
i2c_scl_direction =0;
i2c_sda_direction =1;
return d;
}
i2c_write( char address, char data )
{
i2c_start();
i2c_tx(0xA0);
i2c_tx(0x00);
i2c_tx(address);
i2c_tx(data);
i2c_stop();
}
i2c_read(unsigned char adres)
{
unsigned int ee_data;
i2c_start();
i2c_tx(0xA0);
i2c_tx(00);
i2c_tx(adres);
i2c_start();
i2c_tx(0xA1);
ee_data = i2c_rx(adres);
i2c_stop();
return ee_data;
}
void main(void)
{
ADCON1 = 0x06; // ADC iptal.
TRISB=0b00000001;
TRISA4=1;
TRISC=0;
PORTB=0;
veri =65;
adres=10;
i2c_init();
lcd_init(FOURBIT_MODE);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazilak ");
lcd_goto(S2_1); // 1. satırının 1.cü sütününa git
sprintf (outString, "veri= %d ", veri );
lcd_puts(outString);
lcd_goto(S2_10); // 2. satırının 1.cı sütününa git
sprintf (outString, " adres = %d ", adres );
lcd_puts(outString);
veri=0;
while(1){
if(!yaz)
{ DelayUs(180);
lcd_clear();
i2c_write(10,65);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazildi");
}
if(!oku)
{ DelayUs(180);
lcd_clear();
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Okunan Veri=");
veri=i2c_read(10);
sprintf (outString, " %d ", veri );
lcd_puts(outString);
}
}
}
Not: eksiklerim var.
hocam elinize sağlık
Alıntı yapılan: M_BAlıntı yapılan: arslan74Merhaba,
Ben 24c512 ile ilgili örnek kod yayınlamıştım. o kodları deneyin.
Selamlar
Merhaba hocam ;
https://www.picproje.org/index.php/topic,18861&highlight=i2c
linkteki kodunuzu kullanarak bir seyler yapmaya calıstım ama malesef
yazdıgım veriyi okuyamadım.
kodum aşagıdadır.
Acaba nerde hata yapmış olabilirim.
Not: SCL yi pul up da denedım pull upsızda degısen bır sey olmadı.
Yoksa hocam kutuphanenizi mi yanlış kulladım.
simülasyon devresi olarak proteus taki PİCDEM2 yi kullanıyorum.
#include <pic.h>
#include <stdio.h>
#include "lcd.h"
#include "delay.h"
#include "877-i2c.h"
#define yaz RA4
#define oku RB0
unsigned char outString[17];
unsigned char veri;
unsigned char adres;
void main(void)
{
ADCON1 = 0x06; // ADC iptal.
TRISB=0b00000001;
TRISA4=1;
PORTB=0;
veri =64;
adres=50;
i2c_init();
lcd_init(FOURBIT_MODE);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazilak ");
lcd_goto(S2_1); // 1. satırının 1.cü sütününa git
sprintf (outString, "veri= %d ", veri );
lcd_puts(outString);
lcd_goto(S2_10); // 2. satırının 1.cı sütününa git
sprintf (outString, " adres = %d ", adres );
lcd_puts(outString);
veri=0;
while(1){
if(!yaz)
{ DelayUs(180);
lcd_clear();
i2c_write(50,64);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazildi");
}
if(!oku)
{ DelayUs(180);
lcd_clear();
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Okunan Veri=");
veri=i2c_read(50);
sprintf (outString, " %d ", veri );
lcd_puts(outString);
}
}
}
arslan74 hocam size yukardaki soruyu sormus ve sizin kodu çalıştıramıştım. Hocam sizin kodda ufak bir hata buldum ve düzelltim sorunsuz olarak çalısıyor.
Hem size bilgi vermek hemde diğer yararlanmak isteyen arkadaşlara yardımı olsun birde
https://www.picproje.org/index.php/topic,18861&highlight=i2c yerdeki kaynak koddaki hatalı yeri editleyip düzelmeniz için bilgi vermek istedim.
Teşekkürler
M_B
düzeltiğim noktalar:
void set_clk_low ( void ){
SCL = 0;
SCL_TRIS = 0;
}
void set_clk_high ( void ){
SCL = 1;
SCL_TRIS = 1;
}
void set_sdo_low ( void ){
SDA = 0;
SDA_TRIS = 0;
}
void set_sdo_high ( void ){
SDA = 1;
SDA_TRIS = 1;
}
Merhaba,
Sen koda yaptığın değişikliğin bir önemi yok yapsanda olur yapmasan da. Ama sen yine benim yaptığım gibi çalıştır daha sağlıklı olur. Benim verdiğim kod çalışmiyorsa Kullandığın Pullup dirençin değerini değiştir.
Selamlar