EEPROM U ROM OLARAK KULLANMA?

Başlatan tonkol, 14 Haziran 2005, 13:18:59

mustafayilmnaz

devam4      btfss   EECON1,EEIF
                goto   devam4
                bcf   EECON1,EEIF

yazmanın bitip bitmediğini ben bu kod ile kontrol ediyorum zaten.yani gecikme kullanmıyorum.benim anlamadığım yazma adresleri nereleri.örneğin siz 0x01 ve 0x02 ye yazmışsınız anladığım kadarıyla.mesela ben 4 tane sayıyı hangi adrese yazabilirim.yardımınız için teşekkürler.

mesmert

mikrokontrolcünün data sheet bakabilirsin veya aşağıdaki örneği kullanabilirsin

sayı_1        equ   0x01
sayı_2        equ   0x02
sayı_3        equ   0x03
sayı_4        equ   0x04
sayı_5        equ   0x05
sayı_6        equ   0x06
sayı_7        equ   0x07 gibi devam eder

transistor

16f84 için 0x00....0x30 adres aralığında 64 bytes veriyi eeproma yazabilirsin.

yazmak için;

MOVLW	0X00
	MOVWF	EEADR
	MOVF	SAYI1,W
	CALL	EEPROM_KAYDET
	MOVLW	0X01
	MOVWF	EEADR
	MOVF	SAYI2,W
	CALL	EEPROM_KAYDET
	MOVLW	0X02
	MOVWF	EEADR
	MOVF	SAYI3,W
	CALL	EEPROM_KAYDET
	MOVLW	0X03
	MOVWF	EEADR
	MOVF	SAYI4,W
	CALL	EEPROM_KAYDET


EEPROM_KAYDET
	BANKSEL	EEDATA
	CLRF	EEDATA
	MOVWF	EEDATA
	BANKSEL	EECON1
	BCF	EECON1,EEPGD
	BSF	EECON1,WREN
	MOVLW	H'55'
	MOVWF	EECON2
	MOVLW	H'AA'
	MOVWF	EECON2
	BSF	EECON1,WR
	BTFSC	EECON1,WR
	GOTO	$-1
	BCF	EECON1,WREN
	BANKSEL	PORTA
	RETURN

bu şekilde sayı1 sayı2 sayı3 sayı4 reg.nin içeriklerini sırasıyla 0x00,01,02,03 adreslerine yazarsın.

okumak için;
              	MOVLW	0X00	; OKUNACAK ADRES
	CALL	EEPROM_OKU
	MOVWF	SAYI1	; OKUNAN REGISTRYE KAYDEDILIR
      	MOVLW	0X01	; OKUNACAK ADRES
	CALL	EEPROM_OKU
	MOVWF	SAYI2	; OKUNAN REGISTRYE KAYDEDILIR
      	MOVLW	0X02	; OKUNACAK ADRES
	CALL	EEPROM_OKU
	MOVWF	SAYI3	; OKUNAN REGISTRYE KAYDEDILIR
      	MOVLW	0X03	; OKUNACAK ADRES
	CALL	EEPROM_OKU
	MOVWF	SAYI4	; OKUNAN REGISTRYE KAYDEDILIR

EEPROM_OKU
	BANKSEL	EEADR
	MOVWF	EEADR
	BANKSEL	EECON1
	BCF	EECON1,EEPGD
	BSF	EECON1,RD
	BANKSEL	EEDATA
	MOVF	EEDATA,W
	BANKSEL	PORTA
	RETURN  

    bu şekilde de sırasıyla yazdıklarını okursun. ve yine sayı1,sayı2,3,4 reglerine okuduklarını tekrar yazarsın.

diğer örneklerdeki gibi arka arkaya okuma ve yazma rutinlerini yazmana gerek yok.
Herşey Vatan İçin.

mustafayilmnaz

arkadaslar verdiğiniz bilgiler  ve kısa kodlar için sağol un.programıma dahil ettim bütün bunları ama lcd de bu sefer yazılar kayboldu.hala adreslerde bi sorun olduğunu düşünüyorum.benim programımda 0x10 dan 0x30 a kadar heryer dolu.eeprom olarak kaydedeceğim adresleri 0x31,32,33ve34
seçtim.datasheette "PIC16F84A devices have 64 bytes of
data EEPROM with an address range from 0h to 3Fh." yazıyor.yani 0x3F e kadar ama lcd de bişe gözükmüyor.eeprom işine girmeden önce sorun yoktu.eeprom için tanımladığım yerleri (31,32..) equ ile tanımlamam gerekebilir mi.bu arada FSR ve INDF de kullanıyorum.klavyeden okuduğum tuş bilgisini 13'lük bir diziye kaydediyorum.dizidende kaynaklanabilir mi...

Muhabbetle!

mustafayilmnaz

arkadaşlar bu arada eeprom boş iken okuduğum değerin 0xFF olmasımı gerekiyo.bu durumda şöle bi şe yapsam doğru olur mu acaba;
      bsf   INTCON,GIE
      movlw   0x31            ;0x31 adresi okunacak
      call   eep_oku
      sublw   0xFF               ;eeprom bos ise
      btfss   STATUS,2   
      goto   $+2      
      call   eeproma_yaz        ;eeproma  yaz!
                               .
                               .
bu kodu,  sistemin ilk enerjilendiğinde çalışması lazım.bundan sıonra zaten eeprom dolu olacağı için sorun olmayacaktır.burada 0xFF ile kontrol etme sizce doğru mu?yada boş olduğunu başka bir şekilde öğrenebilirm iyiz?


Muhabbetle!