24CXX Asm Kodu

Başlatan mesmert, 02 Nisan 2007, 20:20:50

mesmert

Slm Arkadaşlar webde 24cxx için bir sürü protokol indirip denedim ama hiçbiri doğru bir şekilde çalışmadı bana elinde çalışan test edilmiş 4MHz göre kod lazım.

XX_CİHAN_XX

Alıntı yapılan: "mesmert"Slm Arkadaşlar webde 24cxx için bir sürü protokol indirip denedim ama hiçbiri doğru bir şekilde çalışmadı bana elinde çalışan test edilmiş 4MHz göre kod lazım.

;KULLANILAN REGISTERLER
I2C_VERI
I2C_ADRES
I2C_RETURN
BUFFER_VERI
W_ADRESLOW
W_ADRESHIGH
R_ADRESLOW
R_ADRESHIGH

#DEFINE	I2C_PORT	PORTA
#DEFINE	I2C_TRIS	TRISA
SCL		EQU			.1
SDA		EQU			.2


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
		MOVWF		BUFFER_VERI
		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
;-------------------------------------

4MHZ dede 20MHZ dede sorunsuz çalışıyor...
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.

mesmert

Hocam burda bilgiyi hangi registere yükleyip okuyacam ve yazacam bide burda R_Adreslow,R_Adreshigh ve W_Adreslow, W_Adreshigh bu registerler nedir örneğin R_Adreslow,R_Adreshigh bu registerler tanıtılmamış.

XX_CİHAN_XX

W_ADRESLOW - W_ADRESHIGH 24C512 nin yazma adreslerinin verildiği yer.
R_ADRESLOW - R_ADRESHIGH (bunları programa taşımayı unutmusuşum mesajı editledim) 24C512 den okuma yapılırken kullanılan adresler.Bunları istersen ADRESHIGH - ADRESLOW diye tek bir registerdede toplayabilirsin.

#DEFINE   I2C_PORT   PORTA 
#DEFINE   I2C_TRIS   TRISA 
SCL      EQU         .1 
SDA      EQU         .2

Burada 24cxx in baglanacagı portu ve pin numaralarını girmelisin.Şuan porta,1 de scl pini porta,2 sda pini tanımlı ;)

örneğin 24c512 nin 0000 adresine 0xCC verisi yazıcaksın bu durumda yapman gereken :

      CLRF       W_ADRESHIGH
       CLRF       W_ADRESLOW
       MOVLW       0xCC
       CALL       WRITE_24C512



örneğin 24c512 nin 0000 adresini okuyacaksın bu durumda yapman gereken :

      CLRF       R_ADRESHIGH
       CLRF       R_ADRESLOW
       CALL       READ_24C512


      CALL       READ_24C512  alt programının dönüşünde okunan bilgi W nin içersinde bulunmaktadar.Aynı zamanda I2C_RETURN registerindede bulunmaktadı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.

mesmert

programda hiç gecikme görmedim birde neden EEPROM adres bilgisini  ikikere gönderiyoruz örneğin 90H adresini okumak için ilk önce 9 sonra 0 yüklemek  lazım  mı?

XX_CİHAN_XX

Alıntı yapılan: "mesmert"programda hiç gecikme görmedim birde neden EEPROM adres bilgisini  ikikere gönderiyoruz örneğin 90H adresini okumak için ilk önce 9 sonra 0 yüklemek  lazım  mı?
gönderilen verilere bakarsanız biri high diğeri low byte yani gönderilen veri 16 bitlik.90 adresine yazıcaksanız önce 00 ardından 90 göndermeniz gerekir.
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.

mesmert

@XX_CIHAN_XX Hocam ben sizin verdiğiniz bu protocol bir türlü adapte edemedim düzgün çalışmıyor yazma ve okuma olmuyor

2. Protocolde gecikme rutini olması lazım değilmi?

3. Benim kullandığım protocolde Adres bilgilerini kaydırıyor

WRITE_EEPROM 
	CALL 		BSTART 
	MOVLW 		B'10100000' 
	MOVWF 		TXBUF 
	CALL 		TX 
	MOVF 		ADDR_1,W 
	MOVWF 		TXBUF 
	CALL 		TX 
	MOVF 		DATAO,W 
	MOVWF 		TXBUF 
	CALL 		TX 
	CALL 		BSTOP 
	PAGESEL		TIMER200ms
	CALL		TIMER200ms
	PAGESEL		0X800
	RETURN 
READ_EEPROM 
	CALL 		BSTART 
	MOVLW 		B'10100000' 
	MOVWF 		TXBUF 
	CALL 		TX 
	MOVF 		ADDR_1,W 
	MOVWF 		TXBUF 
	CALL 		TX 
	CALL 		BSTART 
	MOVLW 		B'10100001' ;
	MOVWF 		TXBUF 
	CALL 		TX 
	CALL 		RX 
	CALL 		BSTOP 
	RETURN 

BSTART 
	BSF 		SDA 
	BSF 		STATUS, RP0 
	MOVLW 		0XF0
	MOVWF 		TRISB 
	BCF 		STATUS, RP0 
	BCF 		SCL 
	NOP
	NOP
	NOP 
	BSF 		SCL 
	NOP
	NOP
	NOP 
	BCF 		SDA 
	NOP
	NOP
	NOP 
	BCF 		SCL 
	NOP
	NOP
	NOP 
	RETURN 

BSTOP 
	BSF 		STATUS, RP0 
	MOVLW 		0XF0 
	MOVWF 		TRISB 
	BCF 		STATUS, RP0 
	BCF 		SDA 
	NOP
	NOP
	NOP 
	BSF 		SCL 
	NOP
	NOP
	NOP 
	BSF 		SDA 
	NOP
	NOP
	NOP 
	BCF 		SCL 
	NOP
	NOP
	NOP 
	RETURN 


BITOUT 
	BSF 		STATUS, RP0 
	MOVLW 		00H 
	MOVWF 		TRISB 
	BCF 		STATUS, RP0 
	BTFSS 		EEPROM_1,DO 
	GOTO 		BITLOW 
	BSF 		SDA 
	GOTO 		CLK_OUT 
BITLOW 
	BCF 		SDA 
CLK_OUT 
	NOP
	NOP
	NOP 
	BSF 		SCL 
	NOP
	NOP
	NOP 
	BCF 		SCL 
	NOP
	NOP
	NOP 
	RETURN 

BITIN 
	BSF 		EEPROM_1,DI 
	BSF 		STATUS,RP0 
	MOVLW 		B'01110011'	;02H 
	MOVWF 		TRISB 
	BCF 		STATUS, RP0 
	BSF 		SCL 
	NOP 
	BTFSS 		SDA 
	BCF 		EEPROM_1,DI 
	NOP
	NOP 
	BCF 		SCL 
	RETURN 
TX 
	CLRF		COUNT
	MOVLW 		.8 
	MOVWF 		COUNT 
TXLP 
	BCF 		EEPROM_1,DO 
	BTFSC 		TXBUF,7 
	BSF 		EEPROM_1,DO 
	CALL 		BITOUT 
	RLF 		TXBUF,F 
	DECFSZ 		COUNT,F 
	GOTO 		TXLP 
	CALL 		BITIN 
	RETURN 

RX 
	CLRF 		COUNT 

	MOVLW 		.8 
	MOVWF 		COUNT 
	BCF 		STATUS,0 
RXLP 
	RLF 		DATAI,F 
	CALL 		BITIN 
	BTFSC 		EEPROM_1,DI 
	BSF 		DATAI,0 
	DECFSZ	 	COUNT,F 
	GOTO 		RXLP 
	BSF 		EEPROM_1,DO 
	CALL 		BITOUT 
	RETURN

XX_CİHAN_XX


Gördüğünüz gibi gibi en büyük gecikme 1Us nin altında yanı burada haberleşme esnasında en fazla 2-3 nop fazlasıyla yeterli gelmektedir.siz hangi entegre ile haberleşiceksiniz?
Verdiğiniz kodlardan çok küçük değerli bir eeprom (24c04--24c16) oldugu belli.Bu eepromlarda 1byte lık adres gondermek yeterlı oluyor fakat benim verdiğim kodlar daha büyük eepromlar (24c32--24c512) için. Esasında aralarındaki tek fark benim verdiğim kodda adres bilgisinin iki byte tan olmasıdır.
Yaşadığın problem büyük ihtimalle bundan kaynaklanıyor.w_adreslow ve r_adreslow lu yazma ve okuma saıtrlarını iptal ederek tek adres gondererek dene yada kullandıgın eepromu yükselt sorunun düzelir...
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.

mesmert

Alıntı yapılan: "XX_CİHAN_XX"
Yaşadığın problem büyük ihtimalle bundan kaynaklanıyor.w_adreslow ve r_adreslow lu yazma ve okuma saıtrlarını iptal ederek tek adres gondererek dene yada kullandıgın eepromu yükselt sorunun düzelir...

w_adreslow ve r_adreslow  tek registerde birleştirdim ama sorun yine düzelmedi. Kullandığım EEprom 24C02 data sheet bakıyorum çoğu şey aynı sadece bit tipleri değişiyor

mesmert

Seri haberleşme neden Bank1 de yapılmış?

XX_CİHAN_XX

Alıntı yapılan: "mesmert"Seri haberleşme neden Bank1 de yapılmış?
Esasında bank1 de yapılmıyor sadece clk ve data hattındaki pin giriş çıkış işlemleri için bank1 e geçiliyor.

;KULLANILAN REGISTERLER 
I2C_VERI 
I2C_ADRES 
I2C_RETURN 
BUFFER_VERI 
ADRESLOW 

#DEFINE   I2C_PORT   PORTA 
#DEFINE   I2C_TRIS   TRISA 
SCL      EQU         .1 
SDA      EQU         .2 


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      ADRESLOW,W 
      CALL      SEND_I2C 
      CALL      I2CSTART 
      MOVLW      0xA1 
      CALL      SEND_I2C 
      CALL      GET_I2C 
      CALL      NACK 
      CALL      I2CSTOP 
      RETURN 
;------------------------------------- 
WRITE_24C512 
      MOVWF      BUFFER_VERI 
      CALL      I2CSTART 
      MOVLW      0xA0 
      CALL      SEND_I2C 
      MOVF      ADRESLOW,W 
      CALL      SEND_I2C 
      MOVF      BUFFER_VERI,W 
      CALL      SEND_I2C 
      CALL      I2CSTOP 
      RETURN 
;-------------------------------------


Kodları kullandıgın eeproma göre düzenledim birde bunları dene.

örneğin 24c02 nin 0x90 adresine 0xCC verisi yazıcaksın bu durumda yapman gereken :

      MOVLW       0xCC 
       MOVWF       ADRES
       MOVLW       0xCC 
       CALL       WRITE_24C512



örneğin 24c02 nin 255. adresini okuyacaksın bu durumda yapman gereken :


      MOVLW         0xFF
       MOVWF        ADRES
       CALL       READ_24C512




CALL READ_24C512 alt programının dönüşünde okunan bilgi W nin içersinde bulunmaktadar.Aynı zamanda I2C_RETURN registerindede bulunmaktadı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.

mesmert

15000 üyelik forumda sadece Cihan hocam cevap yazdığın için double Teşekkür.
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



Hocam yukardaki kod için konuşuyorum bank1 geçilmiş BCF I2C_TRIS,SDA bu komut benim bildiğim SDA pinini çıkış yapmış ve hemen peşinden BSF         I2C_TRIS,SCL  ve bu komutta SCL pin giriş  yapılmış ve biraz gecikme kullanılmış    BSF         I2C_TRIS,SDA   SDA pin giriş yapılmış tekrar bank sıfıra geçilmiş takıldığım konu burası. Neden böyle bir gereksinim ihtiyaç duyulmuş.

XX_CİHAN_XX

Evet I2c ve onewire tarzındaki seri haberleşme protokollerinde olası çakışmaları önlemek amacıyla haberleşme pinleri(scl, sda) lojik 1 yapılacağı zaman giriş , lojik 0 yapılacağı zaman çıkış yapılır.Pini giriş yaptığımızda o pine bağlı pull up direnci o pini lojik 1 e alır.Yani ben scl hattını set etmek için scl pinini giriş yapıyorum.Clear etmek içinde o pini çıkış yapıyorum(tabi port daha onceden bcf yapıldığı için hattı çıkış yapınca otomatik olarak lojik 0 konumunu alıyor)Bu olay scl hattı içinde sda hattı içinde geçerli.
Tabi burada o hattı lojık1 yapmak için neden giriş yapılıyor diye düşünülebilir.Fakat dediğim gibi I2c ve one wire haberleşmelerde sağlıklı iletişim kurulması için bu şekilde çalışılmalıdı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.