24FJ256GB106 flash program hafızası kullanımı

Başlatan ahmetgokce01, 26 Ocak 2017, 13:14:31

ahmetgokce01

Merhaba arkadaşlar.
24fh256gb106 mcu da dahili eeprom bulunmadığı için gerçekleştirdiğim uygulamada verileri mcu nun çalışması esnasında flash program hafızasına kaydetmek istiyorum.

bunun için mcuda
read_program_memory(address, unsigned int8* dataptr, unsigned int16 count);
erase_program_memory(address);
write_program_memory(address, unsigned int8* dataptr, unsigned int16 count);

bu fonksiyonları kullanacağım fakat önce mcuda belli bir adres aralığı tahsis etmem gerekmez mi istediğim adresleri veri sil-yaz-oku yapabilmem için hangi ayarları tanımlamaları vs yapmam gerekir.

ahmetgokce01

Nasil yapabilirim örnek verebilecek olan var mi?

ahmetgokce01

Arkadaşlar merhaba, 24FJ256GB106'da hangi program adresi yazılıp okunabilir alan olduğunu datasheetten nerden bakabilirim, kimse program hafızasını kullanarak herhangi bir program yazmadı mı ?
Kod paylaşmayın yalnızca yol gösterin :)

dursuncemal

daha once hic denemedim ama fakat su yolu deneyebilirsin.once kendine kulannacagin bir alan acman lazim.yazdigin ana program ile kaydedeceklerinin karismamasi icin.bunun icin  #reserve on direktifini kulanabilirsin.bu direktif ile istadigin kadar alani kendine ayirabilirsin.
ornek;
#reserve 0x40:0x50  // bu direktifi verdiginde  0x40 dan 0x50 ye kadar olan adreslere herhangi birsey yuklenmez, dolayisi ile senin baslangic adresin 0x40 bitis adresin 0x50
:=

ahmetgokce01

Cevabınız için teşekkür ederim,
#reserve 0x0300:0x0318
#ZERO_RAM

bu şekilde kullandığım zaman

Constant out of the valid range  318 is out of the RAM range


bu şekilde hata veriyor



ahmetgokce01

Adreste sıkıntı var hangi adresleri reserve edebilirim acaba?

dursuncemal

bende hic denemedim sadece fikir olsun deyi yazdim.kullanmis oldugun islemciyide tanimiyorum pdfye bir bakmak lazim
:=

dursuncemal

Syntax: #RESERVE address
or
#RESERVE address, address, address
or
#RESERVE start:end
Elements: address is a RAM address, start is the first address and end is the last address
Purpose:
This directive allows RAM locations to be reserved from use by the
compiler. #RESERVE must appear after the #DEVICE otherwise it will
have no effect. When linking multiple compilation units be aware this
directive applies to the final object file.
Examples: #DEVICE PIC16C74
#RESERVE 0x60:0X6f

bir baska yoluda; rom direktifini kullanabilirsin
#ROM address = {list}

#ROM   baslayacagin adress  = {0,1,2,3,4,5,6,7,8,9,10,11}// bu sekilde baslayacagin adrese ilk programlama asamasinda sabit veriler  atabilirsin. daha sonra  kendi programinda yukaridaki fonksiyonlarile bu verileri degistirebilirsin.
bu sekilde kullananbir arkadasim ile gorustum 'adres olarak program hafizanin ilk baslarini kabul etmiyor  baslangic adresini sonlardan sec dedi' kulandigin islemcinin pdf sini inceleyip program memory adresinin nerden baslayip nerede bittigini tepit etikten sonra geriye birsey kalmiyor.son yazdigim sekilde yaparsan programi islemciye atiktan sonra okursan o adreslerdeki bilgileri konrol etiginde yazmis olduklarini goreceksin.kolay gelsin
:=

ahmetgokce01

Hocam #reserve direktifi ram bellekte alan ayırıyor diyor Serdar ÇİÇEK'in CCS C kitabı onun için rom hafızada alan ayırımı yapmak için
#ORG Start_Adres End_adres{}
direktifini kullanmamız gerektiği söyleniyor ve örnek uygulamalarda da hep bu direktif kullanılmış ccs c forumlarda araştırmalarda gördüğüm. ccs c forumlarda baktığımda yine sorun yaşayanlar bazı örnek kodlar var fakat çözüme ulaşmış örnekler yok yani kafam çok karıştı. Yine forumda araştırdığım ve anladığım kadarıyla önce #ORG direktifi ile ROM bellekte adres başlangıcı ve bitişi rezerve ediliyor veri yazılacağı zaman daha önce yazılmış blok ram hafızaya alınıyor,ilgili blok adres siliniyor sonra  değişiklik yapılacak adresteki içerik değiştiriliyor ve öyle yazılıyor diyor.
Program çalışması esnasında veriler değişebilir yazılıp okunabilir olacağı için sizin dediğiniz gibi
#ROM   baslayacagin adress  = {0,1,2,3,4,5,6,7,8,9,10,11}
çok uygun olmaz gibi geldi
Bu iş bu kadar teferruatlı olmamalı.

dursuncemal

isin teferuat gibi gorunen yani derledigimiz programin nerelere yerlestigini bilmiyor olmamiz dedigim gibi daha once tecrube edinmedigim icin pek emin degilim.
fakat    '#ROM   baslayacagin adress  = {0,1,2,3,4,5,6,7,8,9,10,11} '  seklinde kullanan arkadasim var. zaten mantik '#ORG Start_Adres End_adres{}' ile ayni mantik calisiyorfakat sunu unutmamalisin rom'a 100 000 yazma silme sansin var.
:=


CaFFeiNe

#ORG 0x800, 0x820 {}

//Nothing will be at 800-820


help'te böyle bir ifade var, ben başlangıç ve bitiş adreslerini girip bu aralığı boş bırakırsınız diye algılıyorum

CaFFeiNe






mevcut bir programımı derledim
1. resimde herhangi bir yer ayırma yok
2. resimde #ORG 0x30, 0x5f0 {} ile yer ayrıldı

0x30 adresinden öncede boş alanlar var ama o derleyicinin tasarrufu, sonuçta benim istediğim alanları boş bırakıyor

ahmetgokce01

Alıntı yapılan: Murat Mert - 07 Şubat 2017, 14:08:14
Buraya bir bak istersen.
http://www.ccsinfo.com/forum/viewtopic.php?t=49089&highlight=programmemory

verdiğiniz link için teşekkür ederim umarım faydalı olur arkadaş verdiği tanımlamalarla problemi çözdüğünü iddaa ediyor deneyeceğim.

ahmetgokce01

Alıntı yapılan: CaFFeiNe - 07 Şubat 2017, 14:41:20




mevcut bir programımı derledim
1. resimde herhangi bir yer ayırma yok
2. resimde #ORG 0x30, 0x5f0 {} ile yer ayrıldı

0x30 adresinden öncede boş alanlar var ama o derleyicinin tasarrufu, sonuçta benim istediğim alanları boş bırakıyor

Peki bu ayırdığımız alanlara veri yazıp okuyabiliyormuyuz programın çalışması esnasında