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

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

ahmetgokce01

Bu arada 24FJ serisi bir PIC'te mi denediniz. 24FJ serisinin diğer PIClere göre bir farkı var mıdır?

ahmetgokce01

#16
#define CK_FLASH_END       (getenv("PROGRAM_MEMORY")-1)      
#define CK_FLASH_PAGE_SIZE (getenv("FLASH_ERASE_SIZE")/2) 
#define CK_NUM_PAGES (CK_FLASH_END/CK_FLASH_PAGE_SIZE) 

#define CK_USER_PAGE (CK_FLASH_PAGE_SIZE*(CK_NUM_PAGES-1)) 

#org CK_USER_PAGE,CK_FLASH_END {} 

void main()
{

unsigned int8 read_data[8]; 
unsigned int8 write_data[] = {49,50,51,52,53,54,55,56}; 


erase_program_memory(CK_USER_PAGE);
write_program_memory(CK_USER_PAGE,write_data,8); 
delay_ms(1);              
read_program_memory(CK_USER_PAGE,read_data,8);

           printf("write_data:%s\r\n",write_data);
           printf("read_data:%s\r\n",read_data);
}


yaptığımda
write_data:12345678
                                                          
read_data:123


neden sonucu bu şekilde veriyor olabilir





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

hocam yer ayırma dediğiniz gibi fakat en büyük mesele ayrılan yere istediğimiz verileri yazıp silip tekrar yazma ve okuma işlemlerinde Bariş SAMANCI arkadaşımızın önemli makalelerinden
http://www.barissamanci.net/Makale/22/pic-flash-program-hafizasina-yazma-silme-okuma-islemleri/
burada belirttiği gibi aslında yöntemi söylüyor bu makalede ama bunu ccs c de nasıl yapacağımız

ahmetgokce01

#org direktifi ile rezerve ettiğim alana #ROM direktifi ile istediğim veriyi yazabiliyorum. yazdığımı nasıl anlıyorum
WinPic800'e derlediğim hexi yükleyim adrese baktığımda yüklemeyi yaptığını görüyorum.
Ama asıl yapmak istediğim program çalışması esnasında ilgili adrese 8 byte lık veriyi ya da 1 bayt farketmiyor write_program_memory(0x0200,write_data,8); fonksiyonunu kullanarak yükleme yaptığımda yazmak istediğim adres boş yazılmamış görünüyor.

Problem nedir arkadaşlar denemediğim yöntem kalmadı neredeyse derleyicide sıkıntı olabilir mi ya da fuselarda ya da config etmem gereken bir durum mu var çözemedim.

dursuncemal

 usenmedim devreyi kurup denedim < cok nadir yaptigim bir sey.pic 18 e hem yazdim hem okudum hic bir sorun yok

#define baslangic_adresi 0x1b80


#ROM baslangic_adresi = {0,1,2,3,4,5,6,7,8,9,10}// bu verileri ilk programladiginizda rom'yukluyor bunu derlediginiz hex dosyasindada goruyorsunuz.

daha sonra programin icinde       x = read_program_eeprom( baslangic_adresi); dediginizde ilk adresteki veriyi okuyorsunuz.  x = read_program_eeprom( baslangic_adresi + 1); dediginizde sacma sapan bir deger geliyor.
 
x = read_program_eeprom( baslangic_adresi + 2);  de 1. deger geliyor buradan anladigim rom konutuyla ilk yerlestirdigimiz veriler 16 bit olarak yerlesiyor fakat rom memory yi adreslerken 8 bit adresleme yapiyor.

tabi pic24 te nasildir bilemem.fakat ne olursa olsun sorun yok ilk degerleri kaale almadan kendi kaydedecegim degerleri bir dizi icinden sira ile yazacagim. ayrica  write_program_eeprom( baslangic_adresi,yazacagin veri); gayet guzel yaziyor.
:=

ahmetgokce01

Alıntı yapılan: dursuncemal - 08 Şubat 2017, 23:07:18
usenmedim devreyi kurup denedim < cok nadir yaptigim bir sey.pic 18 e hem yazdim hem okudum hic bir sorun yok

#define baslangic_adresi 0x1b80


#ROM baslangic_adresi = {0,1,2,3,4,5,6,7,8,9,10}// bu verileri ilk programladiginizda rom'yukluyor bunu derlediginiz hex dosyasindada goruyorsunuz.

daha sonra programin icinde       x = read_program_eeprom( baslangic_adresi); dediginizde ilk adresteki veriyi okuyorsunuz.  x = read_program_eeprom( baslangic_adresi + 1); dediginizde sacma sapan bir deger geliyor.
 
x = read_program_eeprom( baslangic_adresi + 2);  de 1. deger geliyor buradan anladigim rom konutuyla ilk yerlestirdigimiz veriler 16 bit olarak yerlesiyor fakat rom memory yi adreslerken 8 bit adresleme yapiyor.

tabi pic24 te nasildir bilemem.fakat ne olursa olsun sorun yok ilk degerleri kaale almadan kendi kaydedecegim degerleri bir dizi icinden sira ile yazacagim. ayrica  write_program_eeprom( baslangic_adresi,yazacagin veri); gayet guzel yaziyor.



teşekkür ederim desteğiniz için, dediğiniz gibi zaten bende #ROM direktifi ile istenilen adrese yazabiliyorum ve yazıldığınıda görebiliyorum

write_program_eeprom( baslangic_adresi,yazacagin veri);    =>     write_program_memory(CK_USER_PAGE,write_data,8);


x = read_program_eeprom( baslangic_adresi + 2);               => read_program_memory(CK_USER_PAGE,read_data,8);                 


bu komutların farkı ne olabilir 24FJ256GB106 mcu da eeprom bulunmuyor.

dursuncemal

bunlar komut degil fonksiyon sizin kullandiginiz fonksiyon ile benim kullandigim faonksiyonlarin aldiklari parametreler farkli.sizin kullandiginiz fonksiyonun parametrelerinin neler oldugunu bilmemiz lazim.zaten bu fonksiyonlar ile eeproma degiil flash memory e yaziyoruz.
:=

dursuncemal

#22
sizin kullanmak istediginiz fonksiyonlarin yapisi;           read_program_memory(baslangic_adresi,veriyi alacaginiz dizinin adi,almak istediginiz verinin boyutu(veriyi saklayacaginiz dizinin boyutu) );
#define baslangic_adresi 0x1B80

#ROM baslangic_adresi = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}// ilk etapta hem baslangic adresimiz belli olsun diye hemde saklayacagimiz veri dizisinin ilk degerlerini ilk programlama asamasinda yuklemek icin.
  unsigned char oku_veri[10];// okuyacagimiz veriyi kaydedecegimiz dizimiz

          int8 saklanacak_veri[] = {1,2,3,4,5,6,7,8,9,10,11};//hafizaya yazip yazamayacagimizi test etmek icin 10 elemanli  bir dizi 
        
          write_program_memory(baslangic_adresi,saklanacak_veri,10);//cok guzel bir fonksiyon yazmislar bu fonksiyon gostermis oldugunuz dizideki verilerin hepsini baslangic adresinden itibaren yazar
          
          read_program_memory(baslangic_adresi,oku_veri,10);// 'oku_veri'adinda tanimladigimiz dizinin icine program memory'deki baslangic adresinden itibaren olan verileri kaydeder.


pic 18de denedim 24 serisinde problem cikmayacagini dusunuyorum cunku fonksiyonlar genele yazilmitir

:=

ahmetgokce01

dursun bey yardımlarınız ve desteğiniz için çok teşekkür ederim, problem sanırım fuses ayarlarından birkaç sigortaları kaldırdım düzeldi fonksiyon yazıp istenilen adrese 16 bit veriler yazılıp okunabiliyor artık yöntem şu;

önce kayıt edilecek verileri biçimli olarak diziye doldur
sonra write_program_memory() fonksiyonu ile flash hafızaya yaz

okumak içinde read_program_memory() ile verileri dizi içine al ve görüntüle