24Cxx serii eepromlar için okuma yazma alt programları

Başlatan XX_CİHAN_XX, 31 Ekim 2007, 00:15:22

XX_CİHAN_XX

;*******************************************************
;4mhz-20mhz aralıgında sorunsuz çalışmaktadır.
;aşağıdaki program 24 serisi seri eepromlara
;okuma - yazma işlemi yapmaya örnektir.
;define kısmından istenilen port ve pin seçilerek
;i2c haberleşmesinin yapılacağı noktalar belirlenir.
;*******************************************************
		LIST		P=16F876A
		INCLUDE		"P16F876A.INC"
;*******************************************************
	__config(_CP_OFF & _PWRTE_OFF & _HS_OSC & _WDT_OFF & _BODEN_OFF & _LVP_OFF)
;*******************************************************
		CBLOCK		0x20		
REG1
REG2
;*********I2C DATA VE ADRES REGISTERLERI****************
I2C_VERI
I2C_ADRES
I2C_RETURN
BUFFER_VERI
W_ADRESLOW
W_ADRESHIGH
R_ADRESLOW
R_ADRESHIGH
		ENDC
;********I2C HABERLESME PORTU***************************
#DEFINE	I2C_PORT	PORTC
#DEFINE	I2C_TRIS	TRISC
;********I2C HABERLESME PINLERI*************************
SCL			EQU		.0		;PORTC,0 CLOCK PINI
SDA			EQU		.1		;PORTC,1 DATA PINI	
;*******************************************************
		ORG			0x00
		MOVLW		.7
		MOVWF		ADCON1
		CLRF		PORTB
		BSF			STATUS,5
		CLRF		TRISB
		BCF			STATUS,5
;*******************************************************
MAIN
		CALL		DELAY
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
;24C512 SERI EEPROMUN 0x1923 üncü ADRESINE 0xCC KODU YAZILIR.
		MOVLW		0x19
		MOVWF		W_ADRESHIGH		;YAZILACAK ADRES HIGH BYTE
		MOVLW		0x23
		MOVWF		W_ADRESLOW		;YAZILACAK ADRES LOW BYTE
		MOVLW		0xCC
		MOVWF		BUFFER_VERI		;YAZILACAK VERIYI YUKLE
		CALL		WRITE_24C512	;YAZ	
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
		CALL		DELAY
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
;24C512 SERI EEPROMUN 0x1923 üncü ADRESI OKUNARAK PORTB YE YAZILIR.
		MOVLW		0x19
		MOVWF		R_ADRESHIGH		;OKUNACAK ADRES HIGH BYTE
		MOVLW		0x23
		MOVWF		R_ADRESLOW		;OKUNACAK ADRES LOW BYTE
		MOVLW		0xCC
		CALL		READ_24C512		;OKU
		MOVF		I2C_RETURN,W	;OKUNAN VERIYI
		MOVWF		PORTB			;PORTB YE YUKLE
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM	
		GOTO		MAIN
;*******************************************************
I2CSTART
		BCF			I2C_PORT,SDA
		BCF			I2C_PORT,SCL
		BSF			STATUS,5
		BSF			I2C_TRIS,SDA
		BSF			I2C_TRIS,SCL
		NOP
		NOP
		NOP
		NOP
		NOP
		BCF			STATUS,5
		BCF			I2C_PORT,SDA
		BSF			STATUS,5
		BCF			I2C_TRIS,SDA
		NOP
		NOP
		NOP
		NOP
		NOP
		BCF			STATUS,5
		BCF			I2C_PORT,SCL
		BSF			STATUS,5
		BCF			I2C_TRIS,SCL
		BCF			STATUS,5
		RETURN
;-------------------------------------
I2CSTOP
		BCF			I2C_PORT,SDA
		BSF			STATUS,5
		BCF			I2C_TRIS,SDA
		BSF			I2C_TRIS,SCL
		NOP
		NOP
		NOP
		NOP
		NOP
		BSF			I2C_TRIS,SDA
		BCF			STATUS,5
		RETURN
;-------------------------------------
SEND_I2C	;BU ALT PROGRAM DONUSUNDE I2C NIN GONDERDI KABUL BILGISI(ACK/NACK) I2C_RETURN,0 A KAYDEDILIR
		MOVWF		I2C_VERI
		BSF			STATUS,C
SEND_1
		RLF			I2C_VERI,F
		MOVF		I2C_VERI,F
		BTFSS		STATUS,Z
		CALL		BITOUT
		BTFSS		STATUS,Z
		GOTO		SEND_1
;-------------------------------------
BITIN
		BSF			STATUS,5
		BSF			I2C_TRIS,SDA
		BSF			I2C_TRIS,SCL
		NOP
		NOP
		NOP
		NOP
		BCF			STATUS,5
		BCF			I2C_RETURN,0
		BTFSC		I2C_PORT,SDA
		BSF			I2C_RETURN,0
		BCF			I2C_PORT,SCL
		BSF			STATUS,5
		BCF			I2C_TRIS,SCL
		BCF			STATUS,5
		RETURN
;-------------------------------------
GET_I2C
		MOVLW		.1
		MOVWF		I2C_RETURN
RX_1
		RLF			I2C_RETURN,F
		CALL		BITIN
		BTFSS		STATUS,C
		GOTO		RX_1
		MOVF		I2C_RETURN,W
		RETURN
;-------------------------------------
ACK
		BCF			STATUS,C
;-------------------------------------
BITOUT
		BCF			I2C_PORT,SDA
		BSF			STATUS,5
		BTFSS		STATUS,C
		BCF			I2C_TRIS,SDA
		BTFSC		STATUS,C
		BSF			I2C_TRIS,SDA
;-------------------------------------
		BSF			I2C_TRIS,SCL
		NOP
		NOP
		NOP
		NOP
		NOP
		BCF			STATUS,5
		BCF			I2C_PORT,SCL
		BSF			STATUS,5
		BCF			I2C_TRIS,SCL
		BCF			STATUS,C
		BCF			STATUS,5
		RETURN
;-------------------------------------
NACK
		BSF			STATUS,C
		GOTO		BITOUT
;-------------------------------------
READ_24C512
		CALL		I2CSTART
		MOVLW		0xA0
		CALL		SEND_I2C
		MOVF		R_ADRESHIGH,W
		CALL		SEND_I2C
		MOVF		R_ADRESLOW,W
		CALL		SEND_I2C
		CALL		I2CSTART
		MOVLW		0xA1
		CALL		SEND_I2C
		CALL		GET_I2C
		CALL		NACK
		CALL		I2CSTOP
		RETURN
;-------------------------------------
WRITE_24C512
		CALL		I2CSTART
		MOVLW		0xA0
		CALL		SEND_I2C
		MOVF		W_ADRESHIGH,W
		CALL		SEND_I2C
		MOVF		W_ADRESLOW,W
		CALL		SEND_I2C
		MOVF		BUFFER_VERI,W
		CALL		SEND_I2C
		CALL		I2CSTOP
		RETURN
;-------------------------------------
DELAY
		MOVLW		0xFF
		MOVWF		REG1
LOOP1
		MOVLW		0xFF
		MOVWF		REG2
LOOP2
		DECFSZ		REG2,F
		GOTO		LOOP2
		DECFSZ		REG1,F
		GOTO		LOOP1
		RETURN
		END
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Logan

XX_CİHAN_XX, 4 sene önce ASM ie yazmayı bıraktım. Programı tam manasıyla anlayabiliyorum fakat bazı bölümlerin mantığını kavrayabilmiş değilim. Lütfen Status registerinin Carry ve Zero bitlerini neden ve nasıl kullandığını detaylı olarak anlatır mısın? Mesela SEND_I2C, GET_I2C ve BIT_OUT alt programlarında bu bitleri sık sık kullanmışsınız. Mümkünse bahsi geçen alt programlara ait fonksiyonu register kullanarak yazabilir misin?
İmza.

XX_CİHAN_XX

SEND_I2C 
      MOVWF      I2C_VERI 
      BSF         STATUS,C 	;carry biti clear edildi
SEND_1 				;bit gonderme dongusu başlangıcı									 
      RLF         I2C_VERI,F    ;gönderilecek verisola kaydırıldı *1
      MOVF      I2C_VERI,F 	;verinin yeni hali w registerine alındı *2
      BTFSS      STATUS,Z 	;zero biti set mi(w registerinin içeriği "0" mı)
      CALL      BITOUT 		;"0" değil ise sıradaki biti(carry deki biti) gönder
      BTFSS      STATUS,Z 	;"0" mı
      GOTO      SEND_1 		;"0" değil ise(henüz 8 bit birden gönderilmedi ise) dongu başına dön	
;------------------------------------- 
BITIN 				;veri registeri "0" oldu ise tüm bitler gönderildi ack/nack bilgisini sorgula					
      BSF         STATUS,5 
      BSF         I2C_TRIS,SDA 
      BSF         I2C_TRIS,SCL 
      NOP 
      NOP 
      NOP 
      NOP 
      BCF         STATUS,5 
      BCF         I2C_RETURN,0 	;data hattına gelen veri i2c_return,0. bite yazılır
      BTFSC      I2C_PORT,SDA 	;data hattına gelen veri i2c_return,0. bite yazılır
      BSF         I2C_RETURN,0  ;data hattına gelen veri i2c_return,0. bite yazılır
      BCF         I2C_PORT,SCL 
      BSF         STATUS,5 
      BCF         I2C_TRIS,SCL 
      BCF         STATUS,5 
      RETURN 
;------------------------------------- 
GET_I2C 
      MOVLW      .1 
      MOVWF      I2C_RETURN 
RX_1 
      RLF         I2C_RETURN,F 	;okunan verinin kaydedileceği register(i2c_return) sola kaydırılır *3
      CALL      BITIN 		;yeni gelen veri biti okunur
      BTFSS      STATUS,C 	;8 kez veri alımı tamamlandımı(8. bitten veri taşması oldu mu)
      GOTO      RX_1 		;olmadı ise bit almaya devam et
      MOVF      I2C_RETURN,W 	;oldu ise okunan veriyi w ye at ve
      RETURN 			;geri dön
;------------------------------------- 
ACK 
      BCF         STATUS,C 	;
;------------------------------------- 
BITOUT 
      BCF         I2C_PORT,SDA 
      BSF         STATUS,5 
      BTFSS      STATUS,C 	;carry bitine yuklenen değer data pininden gonderılır
      BCF         I2C_TRIS,SDA  ;carry bitine yuklenen değer data pininden gonderılır
      BTFSC      STATUS,C 	;carry bitine yuklenen değer data pininden gonderılır
      BSF         I2C_TRIS,SDA 	;carry bitine yuklenen değer data pininden gonderılır
;------------------------------------- 
      BSF         I2C_TRIS,SCL 
      NOP 
      NOP 
      NOP 
      NOP 
      NOP 
      BCF         STATUS,5 
      BCF         I2C_PORT,SCL 
      BSF         STATUS,5 
      BCF         I2C_TRIS,SCL 
      BCF         STATUS,C 
      BCF         STATUS,5 
      RETURN 
;------------------------------------- 
NACK 
      BSF         STATUS,C 
      GOTO      BITOUT 
;------------------------------------- 

       *1
veri registeri sola kaydırıldıgında o anda carry bitinde bulunan değer registerin 0. bitine,
8. bitte bulunan degerde carry bitine geçer.Bu durumda sola kaydırma işlemi bittiğinde,
gönderilecek sıradaki bit carrye taşınmış olur.
       *2
movf komutu doğrudan zero bitini etkileyen bir komuttur.Yani Movf ile veri registeri w ye alındığında,
registerde "0" varsa zero biti direk set olacaktır."0"dan farklı bir değer varsa zero biti clear olacaktır
       *3
Burdada sola kaydırma komutu kullanılmıştır.Dolayısıyla *1 deki olay geçerlidir.send_i2c de 8.bitin carry e
taşmasından yararlanarak register bitlerini tek tek gönderiyorduk burdada(get_i2c de) her kaydırmada carry nin
0. bite girmesinden faydalanarak gelen bitleri tek tek registere yerleştiriyoruz.

Bu işlemler esasında asm nin incelikleridir.Uzun süre assembly kullanmayan yada basic-c vb. dillerini kullananlar
bu kısımlarda zorlanabilirler.Sanırım asm ye bakarak bu programı C ye çevirmeye çalışıyorsun.

istediğin gibi 8 bitlik veri gönderme döngüsünü bu şekilde carry , zero bitleri ile değil daha basit olarak
bir sayac registeri kullanarak yapayım örneğin send_i2c döngüsü şöylede olabilirdi.

SEND_I2C 
      MOVWF      I2C_VERI 
	MOVLW	.8
	MOVWF	SAYAC		;SAYACA 8 YUKLE
SEND_1 				;bit gonderme dongusu başlangıcı									 
      RLF         I2C_VERI,F    ;sola kayınca sıradakı bit carry e gecer
      CALL      BITOUT		;carry bitinin konumunu gönder	
	DECFSZ	SAYAC,F		;sayacı eksılt sıfır mı?
      GOTO      SEND_1		;henuz sıfır olmadı donguye devam et
;------------------------------------- 
BITIN 				;sayac registeri "0" oldu ise tüm bitler gönderildi ack/nack bilgisini sorgula					
      BSF         STATUS,5 
      BSF         I2C_TRIS,SDA 
      BSF         I2C_TRIS,SCL 
      NOP 
      NOP 
      NOP 
      NOP 
      BCF         STATUS,5 
      BCF         I2C_RETURN,0 	;data hattına gelen veri i2c_return,0. bite yazılır
      BTFSC      I2C_PORT,SDA 	;data hattına gelen veri i2c_return,0. bite yazılır
      BSF         I2C_RETURN,0  ;data hattına gelen veri i2c_return,0. bite yazılır
      BCF         I2C_PORT,SCL 
      BSF         STATUS,5 
      BCF         I2C_TRIS,SCL 
      BCF         STATUS,5 
      RETURN 
;------------------------------------- 

sanırım şimdi daha basit oldu get i2c yide aynı mantıkla oluşturabiliriz

GET_I2C 
	MOVLW	.8
	MOVWF	SAYAC		;SAYACA 8 YUKLE
RX_1 
      CALL      BITIN 		;yeni gelen veri biti okunur,CARRY E YAZILIR
      RLF         I2C_RETURN,F 	;SOLA KAYDIRMA İLE BİRLİKTE CARRY SIFIRINCI BİTE YERLEŞİR
 	DECFSZ	SAYAC,F		;BU YERLEŞTİRME 8 KEZ OLDUGUNDA GELEN TUM BİTLER I2C_RETURN E ALINMIS OLUR
	GOTO	RX_1		;HENUZ 8 BIT TAMAMLANMADI İSE BAŞADÖN
      MOVF      I2C_RETURN,W 	;oldu ise okunan veriyi w ye at ve
      RETURN 			;geri dön
;-------------------------------------

Umarım anlatabilmişimdir.Ancak asm değil C kullanacaksan buradan çevirme ile uzun uzun uğraşma direk örnek kod
bildiğim kadarı ile forumda vardı.
Kolay gelsin...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

Ek olarak önceden  ccs c ile seri eeproma okuma yazma yapmıştım.
Forumda aratınca bununla ilgili eski başlığımı buldum.

https://www.picproje.org/index.php/topic,9696&highlight=i2c

Burdaki verdiğim C kodları sanırım daha çok işine yarıyacaktır. ;)
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Logan

İmza.

Logan

XX_CİHAN_XX, C kullanıp kullanmadığını bilmiyorum. Yazdığın programı Hi-Tech ile C'ye çevirdim. Yazmada problem yok fakat okuma kısmı  çalışmıyor. Programı olabildiğince sade yazmaya çalıştım. Eğer yardımcı olabilirsen çok sevinirim.

#include <pic18.h>
#include "my_delay.h"
#include "global.h"

__CONFIG(1,OSCSDIS&XT);
__CONFIG(2,PWRTEN&WDTDIS&WDTPS128&BOREN&BORV27);
__CONFIG(4,STVREN&LVPDIS&DEBUGDIS);

void i2c_start(void);
void i2c_stop(void);
void send_i2c(unsigned char i2c_veri);
void bit_in(void);
void get_i2c(void);
void n_ack(void);
void ack(void);
void read_512(unsigned int adress);
void write_512(unsigned int adres,unsigned char byte);

/* 
 *    SDA        RB1
 *    SCL        RB2
 *    SDATRIS    TRISB1	
 *    SCLTRIS    TRISB2
 */
void
main(void)
{	TRISB=0; PORTB=0;
	TRISC=0; PORTC=0;
	TRISD=0; PORTD=0;
	
	
	write_512(0,0xf0); DelayMs(5);
	read_512(0); 
      PORTC=i2c_return;
	while (1) {
	bitset (PORTD,0); DelayMs(250);
	bitclr (PORTD,0); DelayMs(250);
	}
} // End main.

/*************************************************************************
 *  Subroutines...
 *************************************************************************/

void read_512 (unsigned int adress) {
i2c_start(); send_i2c(0xa0);
send_i2c(adress >> 8); send_i2c(adress & 0xff);
i2c_start(); send_i2c(0xa1); get_i2c(); n_ack(); i2c_stop(); }

void write_512 (unsigned int adres, unsigned char byte) {
i2c_start(); send_i2c(0xa0);
send_i2c(adres >> 8); send_i2c(adres & 0xff);
send_i2c(byte); i2c_stop();}

void i2c_start(void) {
	sda_512=1;	scl_512=0;
	bitset(TRISB,1); bitset(TRISB,2);
	asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop");
	sda_512=0; bitclr(TRISB,1);
	asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop");
	scl_512=0; bitclr(TRISB,2);}

void i2c_stop(void) {
	sda_512=0; bitclr(TRISB,1); bitset(TRISB,2);
	asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop");
	bitset(TRISB,1); }
	
void send_i2c(unsigned char i2c_veri) {
for (i=0;i<=7;i++) { y=i2c_veri; y &=0x80;
	if (y==0x80) { sda_512=0; bitset(TRISB,1); }
	else { sda_512=0; bitclr(TRISB,1); }
	bitset(TRISB,2);
	asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop");
	scl_512=0; bitclr(TRISB,2);
	i2c_veri=i2c_veri << 1; }
	bit_in();
}

void get_i2c(void) {
for (i=0;i<=7;i++) { bit_in(); i2c_return<=1; }}

void bit_in(void) {
	bitset(TRISB,1); bitset(TRISB,2);
	asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop");
	if (!sda_512) { bitclr(i2c_return,0);	scl_512=0; bitclr(TRISB,2); }
	else {bitset(i2c_return,0); scl_512=0; bitclr(TRISB,2); }
}
 
void n_ack(void) {
	sda_512=0; bitset(TRISB,1); bitset(TRISB,2);
      asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop");
      scl_512=0; bitclr(TRISB,2);
}
	
void ack (void) {
	sda_512=0;  bitclr(TRISB,1);  bitset(TRISB,2);
	asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop"); asm ("nop");
	scl_512=0;  bitclr(TRISB,2);}
İmza.

Macera

Cihan arkadaşımızın asm kodu gayet güzel.
Bende Logan gibi C ye çevirdim.Okuma yazma oluyor.
Derleyici CC5X , denemelerimide proteus 7.1 de yaptım.
Simulasyonda problem gözükmüyor.
Pazartesi işyerinde eepromdada denerim.

/*  
    Bu program 16F877 için yazılmıştır
    MCU nun hızı 4 Mhz
    I2C EEpromun hızı 400khz
    I2C yazma hızı 5 ms
    EEprom 24C128
*/
    #pragma     chip PIC16F877
    #pragma     bit  scl        @ PORTC.0
    #pragma     bit  sda        @ PORTC.1
    #pragma     bit  triscl     @ TRISC.0
    #pragma     bit  trisda     @ TRISC.1
    
    #define  WR           0xa0
    #define  RE           0xa1
    bit      I2Cer,ack;
    char     I2Cbyte;
    uns16    Adr;
    uns8     Data;

void srI2C( void)
{   
    sda = 0;
    scl = 0;
    trisda  = 1;
    triscl = 1;
    nop2();
    nop2();
    sda = 0;
    trisda  = 0;
    nop2();
    nop2();
    scl = 0;
    triscl  = 0;    
}
        

void stI2C( void)
{
    sda = 0;
    trisda = 0;
    triscl = 1;
    trisda = 1;
    sda = 1;
    scl = 1;
}

void wrI2Cbyte(char W)
{
    char count;
    I2Cbyte = W;   
    trisda  = 0;
    triscl  = 0; 
    count = 8;
    do  {
        I2Cbyte = rl( I2Cbyte);
        scl = 0;
        if (Carry) sda = 1 ; else sda = 0;
        scl = 1;
    } while ( -- count > 0);
    scl = 0;
    trisda = 1;
    triscl = 1;
    ack = sda;
    scl = 0;
    triscl  = 0;
}

char rdI2C( void)
{
    char count,dat;
    trisda  = 1;
    triscl  = 0;
    count = 8;
    dat = 0;
    do  {
        scl = 0;
        scl = 1;
        if (sda) Carry = 1 ; else Carry = 0;
        dat = rl( dat);

    } while ( -- count > 0);
    scl = 0;
    trisda  = 0;
    return dat;
}
    
void writeI2C(uns16 Adres, uns8 Veri)
{
    srI2C();
    wrI2Cbyte(WR);
    wrI2Cbyte(Adres.high8);
    wrI2Cbyte(Adres.low8);
    wrI2Cbyte(Veri); // 55i veri olarak yazma
    wrI2Cbyte(Veri+1); // 56yı veri olarak yazma
    wrI2Cbyte(Veri+2); // 57yi veri olarak yazma
    stI2C();
} 
void ackf( void)
{
    sda = 0;
    trisda  = 0;
    triscl  = 1;
    scl = 0;
    triscl  = 0;
}   
void nack( void)
{
    sda = 0;
    trisda  = 1;
    triscl  = 1;
    scl = 0;
    triscl  = 0;
}
void readI2C(uns16 Adres)
{
    char ch1 , ch2 , ch3;
    I2Cer = 0;
    srI2C();
    wrI2Cbyte(WR);
    wrI2Cbyte(Adres.high8);
    wrI2Cbyte(Adres.low8);
    srI2C();
    wrI2Cbyte(RE);
    ch1 = rdI2C();
    ackf();
    ch2 = rdI2C();
    ackf();
    ch3 = rdI2C();
    nack();
    stI2C();
}
void delay(char reg1 , char reg2)
{   
    char i,k;
    for (i=0;i<reg1;++i)
        for (k=0;k<reg2;++k);
}         
void main( void)
{
    ADCON1 = 0xFF;
    Adr   = 0x0101;
    Data  = 0x55;
    writeI2C(Adr, Data);
    delay(0x03 , 0xFF); // 5 ms bekleme
    readI2C( Adr);
}
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts

XX_CİHAN_XX

Alıntı yapılan: "Logan"XX_CİHAN_XX, C kullanıp kullanmadığını bilmiyorum. Yazdığın programı Hi-Tech ile C'ye çevirdim. Yazmada problem yok fakat okuma kısmı  çalışmıyor. Programı olabildiğince sade yazmaya çalıştım. Eğer yardımcı olabilirsen çok sevinirim.
Malesef uzun zamandan beri assembly kullanıyorum biraz c kullanmışlığım vardı o aradada yukarıdaki kodu çıkarmıştım :) sonra asm ye geri döndüm ve ozamandan beri asm kullanıyorum dolayısıyla yardımcı olamıyacağım ancak macera hocam yardımına yetişmiş sanırım :)
Kolay gelsin...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Macera

Yukarda verdiğim kodun belli bir yerinde I2C hatı yazma anında ack olmadan önce lojik açıdan kararsız bir hale geliyordu.
Rutinin yeni hali bu şekilde en azından proteusda hatasız çalışıyor.

void wrI2Cbyte(char W)
{
    char count;
    I2Cbyte = W;   
    trisda  = 0;
    triscl  = 0; 
    count = 8;
    do  {
        I2Cbyte = rl( I2Cbyte);
        scl = 0;
        if (Carry) sda = 1 ; else sda = 0;
        scl = 1;
    } while ( -- count > 0);
    if ( sda == 1 ) trisda = 1; // Eklenen satır
    scl = 0;
    trisda = 1;
    triscl = 1;
    ack = sda;
    scl = 0;
    triscl  = 0;
}
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts

X-Fi

eski bir başlığı tekrar canlandıralım arkadaşlar :)

ı2c konusunda sorun yaşıyorum elimde 24c02 var ama yazıp okuyamadım asm dilinde program yazıyorum cihan hocamın verdiği kodlarda birkaç hata buldum acaba son halini veya çalışır ı2c & eeprom örnek programı olan varmı acaba çok sıkıntı yaşadım bu konuda bir gündür kodlarla uğraşıyorum çalıştıramadım yardımcı olan üstadlarıma şimdiden teşekkürler... :oops:
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

XX_CİHAN_XX

Alıntı yapılan: "X_Fi"eski bir başlığı tekrar canlandıralım arkadaşlar :)

ı2c konusunda sorun yaşıyorum elimde 24c02 var ama yazıp okuyamadım asm dilinde program yazıyorum cihan hocamın verdiği kodlarda birkaç hata buldum acaba son halini veya çalışır ı2c & eeprom örnek programı olan varmı acaba çok sıkıntı yaşadım bu konuda bir gündür kodlarla uğraşıyorum çalıştıramadım yardımcı olan üstadlarıma şimdiden teşekkürler... :oops:
@X_Fi oradaki kodlar halen kullandığım çalışan kodlardır. Bahsettiğin hataları söylersen yardımcı olmaya çalışırım. Ancak kodlarda bir hata yoktur.
Kolay gelsin.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

X-Fi

Hocam mrb  anlayamadığım birkaç yer vardı öncelikle onları sorayım belkide ben çalıştıramamışımdır

;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
;24C512 SERI EEPROMUN 0x1923 üncü ADRESI OKUNARAK PORTB YE YAZILIR.
      MOVLW      0x19
      MOVWF      R_ADRESHIGH      ;OKUNACAK ADRES HIGH BYTE
      MOVLW      0x23
      MOVWF      R_ADRESLOW      ;OKUNACAK ADRES LOW BYTE
>>  MOVLW      0xCC <<<<<
      CALL      READ_24C512      ;OKU
      MOVF      I2C_RETURN,W   ;OKUNAN VERIYI
      MOVWF      PORTB         ;PORTB YE YUKLE
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM  


yukarıda  MOVLW   0xCC komutunu kullanmışsınız okunacak verinin ne olduğunu bilemiyeceğimiz için buraya yazamayız gözünüzden kaçmış olabilir ben anlam veremedim


ACK
      BCF         STATUS,C


ack alt programı oluşturulmuş ama hiçbiyerde kullanılmamış bunada anlam veremedim sonra eeprom un haberleşme protekolünü inceleyince kullanılmamasında bi hata görmedim yinede bunlar kafama takıldı o yüzden çalışmıyacağını düşünmüştüm halada üzerinde uğraşmaktayım

saygılar...
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

XX_CİHAN_XX

Merhabalar,
Haklısınız oradaki 0xCC,
eeprom_write kısmından kopyala yapıştır yaparken gelmiş ve silmeyi unutmuşum ama çalışmayı etkileyecek birşey değil.
ACK olayıda yine aynı şekilde çalışmayı etkileyecek bişi değil ancak isteyen kullanabilir diye programa koyulan bir fonksiyon.
Ancak burada bir hata yoktur.
Kolay gelsin.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

laparga

Teşekkür ederim asm kodlarının açıklaması için tam sorularıma cevap buldum. ;)