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: tonkolMerhaba 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: TomSelam 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: HEXF2Arkadaş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.