EEPROM U ROM OLARAK KULLANMA?

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

tonkol

Merhaba arkadaşlar. Bu forumda yeniyim ama soracağım konu biraz profesyonellere yönelik.

PIC16LF77 yi Hi-Tech C Compiler ile kullanıyorum. Yazdığım program şuan 8162 byte seviyesinde. Yeni eklediğim fonksiyonlar artık sığmaz oldu. Bir üst seriye geçmektense ROM u büyütmek için bir yöntem arıyorum. Mesela kullandığım EEPROM un bir kısmına kodlamı yazsam ve bunu programım içerisinden çalıştırsam diyorum. Bu yöntemin kullanıldığını duydum. Fakat nasıl yapıldığını bulamadım.

Bu konuda bilgisi olan var ise yardımcı olabilir mi?
:(  :? 8O

DumrulBey

Merhaba,

Öncelikle aramıza yeni katılan arkadaşımıza ufak bir mesaj:
Hoş geldin "tonkol"  ;)

Vallahi EEPROM belleğini program belleği olarak kullanılabildiğin daha önce hiç duymadım. Bunun tersi yani çalışma anında tıpkı EEPROM'a ulaşmak gibi program belleğini değiştirilebildiğini duymuştum. Dolayısıyla bunu kullanarak EEPROM'dan okunan bilgi program belleğine komut olarak yazılabilir. Zaten bu iki bellek birimi aynı, sadece adresleri farklı. Çalışma anında EEPROM bellekteki veriler çalıştırılmıyor hepsi o kadar.

Bence bununla uğraşacağına üst seviyeye mesela 18LF252 kullanmanı önerebilirim. Hem bunun RAM belleği de yüksektir. Dinamik değişkenleri daha çok tanımlayabilirsin. Yok ben o yöntemi denemek istiyorum diyorsan o zaman yukarıdaki taşıma işlemini yaparken ekleyeceğin kodları da hesaba kat derim. Zira onlarda program belleğini işgal edecek. O zaman belki aynı kapıya çıkacak.

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

tonkol

Merhaba DumrulBey,
Hoşbulduk. Cevabınız için de teşekkürler. Peki PIC16LF77 ile EEPROM dan program belleğine nasıl yazabilirim?
8O

Petek

Alıntı yapılan: "tonkol"Merhaba arkadaşlar. Bu forumda yeniyim ama soracağım konu biraz profesyonellere yönelik.

PIC16LF77 yi Hi-Tech C Compiler ile kullanıyorum. Yazdığım program şuan 8162 byte seviyesinde. Yeni eklediğim fonksiyonlar artık sığmaz oldu. Bir üst seriye geçmektense ROM u büyütmek için bir yöntem arıyorum. Mesela kullandığım EEPROM un bir kısmına kodlamı yazsam ve bunu programım içerisinden çalıştırsam diyorum. Bu yöntemin kullanıldığını duydum. Fakat nasıl yapıldığını bulamadım.

Bu konuda bilgisi olan var ise yardımcı olabilir mi?
:(  :? 8O
ISIS örneklerinde PIC üzerinde çalışan çok basit bir basic yorumlayıcısı var. hız sizin için önemli değilse basic programını seri eeproma yerleştirip, oradan okuyacak düzenlemeyi yaptıktan sonra istediğiniz uzunlukta program geliştirebilirsiniz. Ancak bu yorumlayıcının donanım desteği hakkında hiç bilgim olmadığından istediğiniz herşeyi (i2c, spi, TMR, PWM,...) yapıp yapamayacağı konusunda bir fikir veremeyeceğim.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

HEXF2

Arkadaşlar acaba bu PIC lerde EECON1 saklayıcısında EEPGD diye bir bit var flash program belleğe erişim diye birşeydi galiba bu olmasın sakın yani bu bit ne işe yarıyor

Tom

Selam arkadaşlar bende aynı problemle karşı karşıyayım.Yani yazdığım proram yaklaşık 8byte ve artık sığmayacak durumda + ben lcd ekran kullanıyorum ve inanılmaz fazla yer kaplıyor PIC belleğinde.Bende ilk evela eepromu kullanayım en azından ihtiyacım olduğunda ilgili verileri eepromdan çağırırım diye düşünüyordum ama bu seferde çağırma komutları bellekte yer tutacak.
   Ne yapacağımı şaşırdım.Bir seçenek daha var oda daha büyük bellekli PIC kullanmak ama PIC16F 877 ye portları uyumlu pıc varmı .Ve proğramda hiç bir değişiklik yapmadan kullanabilirmiyim bilmiyorum.Bu konuda yardım edecek arkadaşlar varsa sevinirim.

CaFFeiNe

optimizasyon ile uğraşabilirsiniz belki

DaRt

Alıntı yapılan: "Tom"Selam arkadaşlar bende aynı problemle karşı karşıyayım.Yani yazdığım proram yaklaşık 8byte ve artık sığmayacak durumda + ben lcd ekran kullanıyorum ve inanılmaz fazla yer kaplıyor PIC belleğinde.Bende ilk evela eepromu kullanayım en azından ihtiyacım olduğunda ilgili verileri eepromdan çağırırım diye düşünüyordum ama bu seferde çağırma komutları bellekte yer tutacak.
   Ne yapacağımı şaşırdım.Bir seçenek daha var oda daha büyük bellekli PIC kullanmak ama PIC16F 877 ye portları uyumlu pıc varmı .Ve proğramda hiç bir değişiklik yapmadan kullanabilirmiyim bilmiyorum.Bu konuda yardım edecek arkadaşlar varsa sevinirim.

18f452 ile 16f877nin portları uyumludur. Kendisisteminde 18f452 kulanırsan program hafızan 2 kat artar. Ayrıca 16 serisinde tablo kullanımında her bir word 1 byte veri saklar ancak 18 serisinde 1 word ile 2 byte saklayabilirsin, eğer tablo kullanıyorsan 2 kattan fazla alan kazanırsın.

16 serisinde eprom yazma fonksiyonu ile program belleğine erişilebileceği datashertlerde yazıyor bu durumda herhangi bir fonksiyonu kullanmak gerektiğinde epromdan program belleğine yazıp daha sonra çalıştırıp ardından bir başka fonksiyonu yazarak program belelği arttırılabilir sanırım. Hiç denemedim ama datasheetlerde böyle bir özellik olduğu yazdığına göre olmalı. 18 serisinde eprom yerine tblwrt komutu ile çok daha kolay program belleğine erişilebilir.

CaFFeiNe

HEXF2 bahsettiğin bit flash belleğe (program hafızasına) erişim ile ilgili yani bildiğiniz gibi bazı pic modellerinde (877,452 vs.) program belleğini okuyup yazabilme özelliği var böylece bootloader uygulamaları yapılabiliyor
bu yöntemle program hafızasını arttırabilirsiniz ama yazdığınız program aynı zamanda hangi fonksiyonlar çalışacaksa onlar için gerekli kodları epromdan okuyup program hafızasına yazabilmeli ve kullanılmayan fonksiyonlarıda program hafızasından silebilmeli yani küçük bir işletim sistemi :) yazacaksınız biraz zorlama bir iş ayrıca programınız bu işlemleri yaparken asıl amacını yerine getirebilecekmi? makina/sistem/devrenizi kontrol edebilecekmi?
kulağınızı tersten göstermek gibi birşey bence bu onun yerine daha büyük hafızalı bir pic kullanmak bazı işlemleri mümkünse kodlama ile yapmak yerine donanım birimlerine yüklemek ve en önemlisi optimizasyon yapmak daha mantıklı

bigbey

Alıntı yapılan: "HEXF2"Arkadaşlar acaba bu PIC lerde EECON1 saklayıcısında EEPGD diye bir bit var flash program belleğe erişim diye birşeydi galiba bu olmasın sakın yani bu bit ne işe yarıyor

Evet arkadaşlar, Program belleğine istediğiniz bilgiyi yazabilirsiniz.
Size bir fikir vereyim. ana program içinde kullanacağınız bir alt programın hex verilerini bir harici eprom belleğinde tutabilir ve istendiğinde oradan sıra ile okunup program belleğine aktarabiliriz. aktarma işlemi bitince yüklemeyi yaptığımız adrese dallanıp komutları yürüttükten sonra retun komutunu görünce ana program içine döneriz. Başka bir alt program çalıştıracaksak onu yine dış bellek epromdan okuyup daha önceki alt program adres başlangıcına yazarız. yazılan program verilerinin en sonunda return komutu olacağından yorumlama bitince yine başlangıca dönecektir. ama bu işlem hiçde iyi bir yöntem değil çünkü program belleğe yazma anında kaybedeceğiniz zaman sizin bu ekonomikliğinizi yok edecektir.
bunun yerine ya daha üst bir chip kullanacaksınız yada birden fazla yeteri kadar 16f877 kullanıp program görevini bölmüş olacaksınız.
Program belleğine yazma işine gelince EECON1 registeri 7. biti (1) yaparsanız artık program belleğine ulaşmış olursunuz. Bundan sonra EEPROM'a yazar gibi adresleme ile program belleğine yazmış olursunuz. İsterseniz aynı belleği okumuş olursunuz.
TA6R

mustafayilmnaz

merhaba arkadaşlar.ilk defa eeprom ile bir uygulama yapacam ve elimde 4 tane sayı degeri var bunları eeproma yazmam gerekiyor ve istediğimde okuyabilmeliyim.bu 4 degeri sırayla yazdığımda okuma işlemi nasıl olucak.yine aynı sıradamı okuyabilirim yoksa farklı bişeylermi var.
BSF STATUS, RP0            ; Bank 1
BCF INTCON, GIE            ; Disable INTs.
BSF EECON1, WREN             ; Enable Write
MOVLW 55h ;
MOVWF EECON2               ; Write 55h
MOVLW AAh ;
MOVWF EECON2           ; Write AAh
BSF EECON1,WR          ; Set WR bit
BSF INTCON, GIE           ; Enable INTs.
bunu pic16f84 ün datasheet inden aldım ve burada yazacağımız bilgi 55h degerimi.ayrıca bir döngü ile bu 4 sayıyı nasıl girebilirim.

muhabbetle!

mustafayilmnaz

tamam 55h yazılacak deger değilmiş :D bunu anladım ama şimdi başka bir sorun var. 8O elimizdeki veriyi hangi adrese girebiliriz.yani saklayabileceğimiz adresi genel amaçlı register lardan seçebilir miyiz.

mustafayilmnaz

eeproma_yaz		
                                bcf	INTCON,GIE  ;tüm kesmeler iptal
				;bu arada hala bank0'dayiz
		movlw	h'00'	;ilk veriyi bu adrese yaz	
		movwf	EEADR
		movf	sayi1,W
		movwf	EEDATA
		bsf	STATUS,RP0    
		bsf	EECON1,WREN   ;yazma enable
		movlw	h'55'	        ;bu kisim sabit 		                movwf	EECON2
		movlw	h'AA'
		movwf	EECON2
		bsf	EECON1,WR	;yazma basladi!
devam		btfss	EECON1,EEIF	;yazma bitti mi?
		goto	devam		;hayir!bekle
		bcf	EECON1,EEIF       ;manuel sifirlamak 
;---------------sayi2 yi yaz---------------------------------
		bcf	STATUS,RP0
		movlw	h'01'	:sayi2'yi buraya yaz!
		movwf	EEADR
		movf	sayi2,W
		movwf	EEDATA
		bsf	STATUS,RP0
		bsf	EECON1,WREN
		movlw	h'55'
		movwf	EECON2
		movlw	h'AA'
		movwf	EECON2
		bsf	EECON1,WR
devam2		btfss	EECON1,EEIF
		goto	devam2
		bcf	EECON1,EEIF
;---------------sayi3 u yaz--------------------------------		
		bcf	STATUS,RP0
		movlw	h'02'	:sayi3'u buraya yaz!
		movwf	EEADR
		movf	sayi3,W
		movwf	EEDATA
		bsf	STATUS,RP0
		bsf	EECON1,WREN
		movlw	h'55'
		movwf	EECON2
		movlw	h'AA'
		movwf	EECON2
		bsf	EECON1,WR
devam3		btfss	EECON1,EEIF
		goto	devam3
		bcf	EECON1,EEIF
;---------------sayi4 u yaz------------------------------
		bcf	STATUS,RP0
		movlw	h'03'	:sayi4'u buraya yaz!
		movwf	EEADR
		movf	sayi4,W
		movwf	EEDATA
		bsf	STATUS,RP0
		bsf	EECON1,WREN
		movlw	h'55'
		movwf	EECON2
		movlw	h'AA'
		movwf	EECON2
		bsf	EECON1,WR
devam4		btfss	EECON1,EEIF
		goto	devam4
		bcf	EECON1,EEIF
		bcf	STATUS,RP0
		bsf	INTCON,GIE   ;tum kesmeler aktif
		return

içimden bir ses burada döngü kullanmam gerektiğini söylüyor :D fikri olan varmı.ayrıca degerlerih'00',h'01',h'02've h'03' e yazdım.sorun olur mu?

mustafayilmnaz

forumun ustaları yardım edin:(.yukarıdaki soruma hala cevap veren olmadı.devre çalışmıyo bakıp duruyorum iki günüm birbirine eşit oldu.zarardayım ilerlemem .eepromla ilk uygulamam ve yazdığım adresler nereler olacak.(hangi aralıkta)

Muhabbetle!

mesmert

EEOKU1
	MOVLW   0X01            
	MOVWF   EEADR
	BSF     STATUS,RP0
	BSF     EECON1,RD
	BCF     STATUS,RP0
	MOVF    EEDATA,W
	MOVWF   SAYI_1

	MOVLW   0X02            
	MOVWF   EEADR
	BSF     STATUS,RP0
	BSF     EECON1,RD
	BCF     STATUS,RP0
	MOVF    EEDATA,W
	MOVWF   SAYI_2
                RETURN

EEYAZ1
	MOVLW   0X01
	MOVWF   EEADR
	MOVF    SAYI_1,W
	MOVWF   EEDATA
	BSF     STATUS,RP0
 	BSF     EECON1,WREN
	MOVLW   0X55
	MOVWF   EECON2
	MOVLW   0XAA
	MOVWF   EECON2
	BSF     EECON1,WR
	BCF     STATUS,RP0 
	
	CALL	TIMER200

	MOVLW   0X02
	MOVWF   EEADR
	MOVF    SAYI_2,W
	MOVWF   EEDATA
	BSF     STATUS,RP0
 	BSF     EECON1,WREN
	MOVLW   0X55
	MOVWF   EECON2
	MOVLW   0XAA
	MOVWF   EECON2
	BSF     EECON1,WR
	BCF     STATUS,RP0 

	CALL	TIMER200
                RETURN

TIMER200			;GENEL SAYICILAR ICIN
	MOVLW	.100
	MOVWF	ASAYI1
T2001
	MOVLW	.100
	MOVWF	ASAYI2
T2002
	DECFSZ	ASAYI2,1
	GOTO	T2002
	DECFSZ	ASAYI1,1
	GOTO	T2001
	RETURN

mustafa yılmaz arkadaşım yukardaki örnek 16f84 için kendim bizzat kullandığım okuma ve yazma rutini yazmada dikkat etmen gereken kısım eeproma yazma süresi için araya bekleme zamanı ilave etmen gerekir.