I2C TAMAM AMA CAKISMA OLUYOR

Başlatan XX_CİHAN_XX, 23 Ağustos 2006, 20:11:23

XX_CİHAN_XX

Arkadaşlar 24c512 uygulaması yaptım sorunsuz calıstı aynı hatta ds1307 ekledım ve 24c512 den hızlı bir şekilde peşpeşe okuma yaptıgımda sanki ds1307 araya giriyormuş gibi 24c512 de adres kayması felan oluyor.Daha doğrusu 2 farklı i2c entegresını aynı hatta saglıklı bır sekılde calıstıramadım(kristalım 20mhz) tek tek deneme yaptıgımda bir sorn olmuyor(yani protokolum yazılım olarak duzgun calısıyor) fakat ıkı entegreyı bırden aynı hatta baglayıp pıc ıle bunlara ulasmak ıstedıgım de karısıklık oluyor.
kullandıgım pic: 16f876
dil: assembly
hız: 20mhz
Acaba nerede hata yapıyor olabılırım :?:  :roll:
Saygılar, Sevgiler....
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.

aslan_korhan

24C512'in adresini değiştirmeyi dene.

Tabiki programdan da bunu değiştirmeyi unutma...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

XX_CİHAN_XX

Denedim ama sonuç değişmedi :(
sisteme enerji verdiğimde eger ds 1307 takılı degılse problem olmuyor.
enerji verdikten sonra ds1307 yı takıncada problem yok yanı eeproma sorunsuz yazı yazılıyor fakat ds ve 24cxx aynı anda takılıyken enerjı verdıgımde eepromdan saglıklı okuma yapamıyorum.
NOT: programda ds ye hıc bır okuma yazma girişiminde bulunmadıgım halde neden ds ye bir karısma oluyor bir turlu anlamadım :S
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.

kesmez

ds 1307 3 voltluk pil gerilimi ister..
devreye güç vermeden önce de pil gerilimi olmalı diye hatırlıyorum..
senin devrende pil varmı?
eğer pil yerine kondansatör koyduysan ilk enerji verdiğinde kondansatör voltajı düşük olacağı için problem yaşanıyor olabilir..
"İnned dine indallahil İslam" (2-19)

XX_CİHAN_XX

Hocam çok ilginç bir durum gerçekten pillide pilsizde fark etmiyor.
Benim aklıma gelen veri yolları ortak oldugu için eeproma adres gonderirken veya veri okurken eepromdan çıkan yada eeproma giren datalar ds nın slave adres bilgisi ne denk gelınce (0xD0, 0xD1 gibi) acaba eeprom ile haberleşirken ds nın aktıf olmasına ve her byte tan sonra ACK veya NACK bilgisi çıkartarak eeprom ile olan haberleşmeyi bozmasına neden olabilir mi acaba?
Ama sisteme ilk enerji verdiğimde ds takılı ıse sorun oluyor ds yı eeprom ile haberlesme basladıktan sonra takarsam yada enerjı verdıkten sonra ds yı cıkarıp takarsam(tabı eeprom ıle haberlesme basladıktan sonra) eepromdan verı okumada bır problem cıkmıyor.
Gerçekten ilginç bir durum  8O  :?  :cry:
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.

kesmez

24lc64, ds1621, ds1307 yi aynı hatta bağlayıp problemsiz çalıştırmıştım böyle bir sorunlada karşılaşmadım.. Benim fikrim beyzik yada c derleyici ile  dene.. veya ccs deki 24512.c dosyasını bir incele.. acaba vatandaş nasıl yapmış, sen nasıl yapmışsın arada bir fark varmı...
"İnned dine indallahil İslam" (2-19)

Eagle_Tim

Yanlış hatırlamıyorsam ds1307 nin control registerinin son biti out disable ve enable işlemnide kullanıyordu. eğer önce ds1307 ye out disable kodunu verirsen ds 1307 nin hatta erişimi durabilir..
Software and Hardware Design...

refik1

XX_CİHAN_XX  kardeş
protokolü senmi yazdın yoksa entegrenin hardvare sinimi kullanarak yapıyorsun ?

bende entegrenin kendi hadvare sini kullanarak 24c512 yi haberleştirmek istiyorum örnek asm bulamadım  bu konuda örneği olan varsa ikrama geçer.

XX_CİHAN_XX

Arkadaslar protokolu ben yazmıstım yukarıdakı problemler cıktı
Bende @kesmezın tavsıyesı uzerıne oturdum ccs de yazdıgım 24c512 read, wrıte programından asm kodlarını cıkardım 8O  ve problemım duzeldı bu kodları sızınle paylasmak ıstıyorum

Bu kodları cıkarmak epey vaktımı aldı baskalarıda vakıt kaybetmesın  ;)

;24C512 read_wrıte programı
;CCS DEN ASM YE CEVRILMISTIR TEST OKEy
;24/08/06
;*******************************************************
			LIST		P=16F876A
			INCLUDE	"P16F876A.INC"
;*******************************************************
	__config(_CP_OFF & _PWRTE_OFF & _HS_OSC & _WDT_OFF & _BODEN_OFF & _LVP_OFF)
			ERRORLEVEL -302
			ERRORLEVEL -306			
;*******************************************************
			CBLOCK		0x20
REG20
I2C_ADRL
I2C_ADRH
I2C_VERI
COPY_I2C_ADRL
COPY_I2C_ADRH
COPY_I2C_VERI
REG27
REG28
REG29
REG2A

			ENDC
;*******************************************************
			CBLOCK		0x70
REG77
REG78
			ENDC
;*******************************************************								
			ORG		0x00
			GOTO		SETUP
;*******************************************************								
GONDER
	MOVLW  .8
	MOVWF  REG78
LOOP21
	NOP
	NOP
	BCF    PORTC,3
	BCF    REG20,3
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	NOP
	BCF    STATUS,5
	RLF    REG2A,F
	BCF    PORTC,4
	BTFSS  STATUS,0
	GOTO   LOOP17
	BSF    REG20,4
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	GOTO   LOOP18
	BCF    STATUS,5
LOOP17
	BCF    REG20,4
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
LOOP18
	NOP
	BCF    STATUS,5
	BSF    REG20,3
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
LOOP20
	BCF    STATUS,5
	BTFSC  PORTC,3
	GOTO   LOOP19
	BSF    STATUS,5
	GOTO   LOOP20
LOOP19
	DECFSZ REG78,F
	GOTO   LOOP21
	NOP
	BCF    PORTC,3
	BCF    REG20,3
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	NOP
	BCF    STATUS,5
	BSF    REG20,4
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	NOP
	NOP
	BCF    STATUS,5
	BSF    REG20,3
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
LOOP23
	BCF    STATUS,5
	BTFSC  PORTC,3
	GOTO   LOOP22
	BSF    STATUS,5
	GOTO   LOOP23
LOOP22
	CLRF   REG78
	NOP
	BTFSC  PORTC,4
	BSF    REG78,0
	BCF    PORTC,3
	BCF    REG20,3
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	BCF    STATUS,5
	BCF    PORTC,4
	BCF    REG20,4
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	BCF    STATUS,5
	RETLW  .0
;**********************************************************
;i2c_start(); 
WRITE_EEPROM
	MOVF   I2C_ADRH,W
	MOVWF  COPY_I2C_ADRH
	MOVF   I2C_ADRL,W
	MOVWF  COPY_I2C_ADRL
	MOVF   I2C_VERI,W
	MOVWF  COPY_I2C_VERI
;********************************************************
	BSF    STATUS,5
	BSF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BSF    PORTC,3
	MOVLW  .3
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BCF    STATUS,5
	BCF    PORTC,4
	BSF    STATUS,5
	BCF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BCF    STATUS,5
	BCF    PORTC,3
	BSF    STATUS,5
	BCF    PORTC,3
;i2c_write(0xa0); 
	MOVLW  0xA0
	BCF    STATUS,5
	MOVWF  REG2A
	CALL   GONDER
;i2c_write(address>>8); 
	MOVF   COPY_I2C_ADRH,W
	MOVWF  REG28
	CLRF   REG29
	MOVF   COPY_I2C_ADRH,W
	MOVWF  REG2A
	CALL   GONDER
;i2c_write(address); 
	MOVF   COPY_I2C_ADRL,W
	MOVWF  REG2A
	CALL   GONDER
;i2c_write(data); 
	MOVF   COPY_I2C_VERI,W
	MOVWF  REG2A
	CALL   GONDER
;i2c_stop(); 
	BSF    STATUS,5
	BCF    PORTC,4
	NOP
	BSF    PORTC,3
LOOP2  BCF    STATUS,5
	BTFSC  PORTC,3
	GOTO   LOOP1
	BSF    STATUS,5
	GOTO   LOOP2
LOOP1  MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	NOP
	NOP
	NOP
	BSF    STATUS,5
	BSF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
;i2c_start(); 
	BSF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BSF    PORTC,3
	MOVLW  .3
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BCF    STATUS,5
	BCF    PORTC,4
	BSF    STATUS,5
	BCF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BCF    STATUS,5
	BCF    PORTC,3
	BSF    STATUS,5
	BCF    PORTC,3
;status=i2c_write(0xa0); 
	MOVLW  0xA0
	BCF    STATUS,5
	MOVWF  REG2A
	CALL   GONDER
	MOVF   REG78,W
	BTFSC  REG78,0
	GOTO   LOOP3
	BCF    REG27,0
	GOTO   LOOP4
LOOP3
	BSF    REG27,0
LOOP4
	BTFSS  REG27,0
	RETURN
;i2c_start(); 
	BSF    STATUS,5
	BSF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BSF    PORTC,3
	MOVLW  .3
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
LOOP7
	BCF    STATUS,5
	BTFSC  PORTC,3
	GOTO   LOOP6
	BSF    STATUS,5
	GOTO   LOOP7
LOOP6  BCF    PORTC,4
	BSF    STATUS,5
	BCF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BCF    STATUS,5
	BCF    PORTC,3
	BSF    STATUS,5
	BCF    PORTC,3
;status=i2c_write(0xa0); 
	MOVLW  0xA0
	BCF    STATUS,5
	MOVWF  REG2A
	CALL   GONDER
	MOVF   REG78,W
	BTFSC  REG78,0
	GOTO   LOOP8
	BCF    REG27,0
	GOTO   LOOP9
LOOP8
	BSF    REG27,0
LOOP9
 	GOTO   LOOP4
;************************************************************
READ_EEPROM
	MOVF   I2C_ADRH,W
	MOVWF  COPY_I2C_ADRH
	MOVF   I2C_ADRL,W
	MOVWF  COPY_I2C_ADRL
;********************************************	
       BSF    STATUS,5
	BSF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BSF    PORTC,3
	MOVLW  .3
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
LOOP11
       BCF    STATUS,5
	BTFSC  PORTC,3
	GOTO   LOOP10
	BSF    STATUS,5
	GOTO   LOOP11
LOOP10
       BCF    PORTC,4
	BSF    STATUS,5
	BCF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BCF    STATUS,5
	BCF    PORTC,3
	BSF    STATUS,5
	BCF    PORTC,3
;i2c_write(0xa0); 
	MOVLW  0xA0
	BCF    STATUS,5
	MOVWF  REG2A
	CALL   GONDER
;i2c_write(address>>8); 
	MOVF   COPY_I2C_ADRH,W
	MOVWF  REG27
	CLRF   REG28
	MOVF   COPY_I2C_ADRH,W
	MOVWF  REG2A
	CALL   GONDER
;i2c_write(address); 
	MOVF   COPY_I2C_ADRL,W
	MOVWF  REG2A
	CALL   GONDER
;i2c_start(); 
	BSF    STATUS,5
	BSF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BSF    PORTC,3
	MOVLW  .3
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
LOOP13
       BCF    STATUS,5
	BTFSC  PORTC,3
	GOTO   LOOP12
	BSF    STATUS,5
	GOTO   LOOP13
LOOP12
       BCF    PORTC,4
	BSF    STATUS,5
	BCF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BCF    STATUS,5
	BCF    PORTC,3
	BSF    STATUS,5
	BCF    PORTC,3
;i2c_write(0xa1); 
	MOVLW  0xA1
	BCF    STATUS,5
	MOVWF  REG2A
	CALL   GONDER
;data=i2c_read(0); 
	CLRF   REG77
;*****************************************************************
       MOVLW  .8
	MOVWF  REG28
	MOVF   REG77,W
	MOVWF  REG29
LOOP26
	BSF    REG20,4
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	NOP
	BCF    STATUS,5
	BSF    REG20,3
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
LOOP25
	BCF    STATUS,5
	BTFSC  PORTC,3
	GOTO   LOOP24
	BSF    STATUS,5
	GOTO   LOOP25
LOOP24
	BTFSC  PORTC,4
	BSF    STATUS,0
	BTFSS  PORTC,4
	BCF    STATUS,0
	RLF    REG78,F
	NOP
	BCF    REG20,3
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	BCF    STATUS,5
	BCF    PORTC,3
	DECFSZ REG28,F
	GOTO   LOOP26
	BSF    REG20,4
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	NOP
	BCF    STATUS,5
	BCF    PORTC,4
	MOVF   REG29,W
	BTFSC  STATUS,2
	GOTO   LOOP27
	BCF    REG20,4
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	BCF    STATUS,5
LOOP27
	NOP
	BSF    REG20,3
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
LOOP29
	BCF    STATUS,5
	BTFSC  PORTC,3
	GOTO   LOOP28
	BSF    STATUS,5
	GOTO   LOOP29
LOOP28
	NOP
	BCF    PORTC,3
	BCF    REG20,3
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	NOP
	BCF    STATUS,5
	BCF    PORTC,4
	BCF    REG20,4
	MOVF   REG20,W
	BSF    STATUS,5
	MOVWF  PORTC
	BCF    STATUS,5
;*****************************************************************
	MOVF   REG78,W
	MOVWF  COPY_I2C_VERI
;i2c_stop(); 
	BSF    STATUS,5
	BCF    PORTC,4
	NOP
	BSF    PORTC,3
LOOP16
       BCF    STATUS,5
	BTFSC  PORTC,3
	GOTO   LOOP15
	BSF    STATUS,5
	GOTO   LOOP16
LOOP15
       MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	NOP
	NOP
	NOP
	BSF    STATUS,5
	BSF    PORTC,4
	MOVLW  .4
	MOVWF  REG77
	DECFSZ REG77,F
	GOTO   $-1
	BCF    STATUS,5
	MOVF   COPY_I2C_VERI,W
	MOVWF  I2C_VERI
       RETURN
;**********************************************************
SETUP
;void main



;I2C_ADRH VE I2C_ADRL REGISTERININ GOSTERDIGI ADRESE I2C_VERI DEKI DATAYI YAZAR
	CALL	WRITE_EEPROM	;VERI YAZMA ALT PROGRAMIDIR					


;VERI OKUMA ALTPROGRAMI I2C_ADRH VE I2C_ADRL REGISTERININ GOSTERDIGI ADRESI OKUR
	CALL   READ_EEPROM	;OKUNAN VERI DONERKEN I2C_VERI REGISTERINE KAYDEDILIR
		


       SLEEP

	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.

refik1

Arkadaşlar hiç kullanan olmadımı

bende entegrenin kendi hadvare sini kullanarak 24c512 yi haberleştirmek istiyorum örnek asm bulamadım bu konuda örneği olan varsa ikrama geçer.

optech

Alıntı YapThe memories are compatible with the I2C standard,
two wire serial interface which uses a bi-directional
data bus and serial clock. The memories
carry a built-in 4 bit, unique device identification
code (1010) corresponding to the I2C bus definition.
This is used together with 2 chip enable inputs
(E2, E1) so that up to 4 x 4K devices may be
attached to the I2C bus and selected individually.
The memories behave as a slave device in the I2C
protocol with all memory operations synchronized
by the serial clock. Read and write operations are
initiated by a START condition generated by the
bus master. The START condition is followed by a
stream of 7 bits (identification code 1010), plus one
read/write bit and terminated by an acknowledge
bit.

Device Select --> 1 0 1 0 E2 E1 A8 R/W

Bu aciklamalara gore START tan sonra device select yapilmasi gerekiyor. Bu da donanimsal olarak yapilmis ayarlara gore seciliyor. EEPROM un E1 ve E2 pinleri neye bagliysa DEVSEL komutu ona gore gonderiliyor.  Device Select --> 1 0 1 0 E2 E1 A8 R/W  aciklamasina gore DEVSEL komutu icin uygun yerlere E1 ve E2 neyse o yazilmali. Bunun yaninda A8 blok numarasini (her blok 256 byte), R/W de okuma veya yazma islemini secmek icin, ilk dort bit ise EEPROMun essiz numarasi...
Bu durumdan  DS1307 datasheetinde "slave adres" olarak bahsedilmis. Pin ile secme iclemi yok yalniz ds1307 icin essiz adres olan 1101000 7bit adresinin sonuna da R/W biti eklemek gerekiyor.