Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

CCS nin 91 sayısına olan garezi !!!

Başlatan mihri, 01 Nisan 2008, 12:37:28

mihri

Datasheet'te yazılanlardan pek bişey anlamadım. Adresleme moduna göre 0x5f ve 0x80 adresleri arasına ulaşılamıyor. Ama bunun mantığı nedir anlamadım. Konu hakkında bilgisi olan açıklayabilir mi?
"Eppur si muove!"

tnen

Programda ayırdıgın hafıza bölgesi sınırı kaç acaba bununla ilgili bir problem mi var yada ayırdıgın array ile ilgili CCs in bir sınırlaması mı var mesela basicde böyle bir sınırlama mevcut  

Basic de şu şekilde;

Arrays

Variable arrays can be created in a similar manner to variables.

Label VAR Size[Number of elements]

Label is any identifier, excluding keywords, as described above. Size is BIT, BYTE or WORD. Number of elements is how many array locations is desired. Some examples of creating arrays are:

sharks VAR byte[10]
fish VAR bit[8]

The first array location is element 0. In the fish array defined above, the elements are numbered fish[0] to fish[7] yielding 8 elements in total. Because of the way arrays are allocated in memory, there are size limits for each type:

Size
Maximum Number of elements

BIT   256

BYTE   96*

WORD   48*


* Processor dependent. See the section on memory allocation for more information.

Arrays must fit entirely within one RAM bank on most PICmicros. They may not span RAM banks on 14-bit or 17Cxxx devices. (Arrays may span banks on 18Cxxx devices. Byte- and word-sized arrays are only limited in length by the amount of memory.) The compiler will assure that arrays will fit in memory before successfully compiling.

Copyright © 1999 microEngineering Labs, Inc.
All rights reserved.

iyonosfer

rapid'e yüklediğin kod ile mplab ta simule edilen aynı değil. CCS doğru derlemiş

................... 		doldur[80]=2; 
0008A:  MOVLW  02
0008C:  MOVWF  55
.................... 		doldur[89]=2; 
0008E:  MOVWF  5E
.................... 		doldur[90]=2; 
00090:  MOVWF  5F
.................... 		doldur[91]=2; 
00092:  MOVWF  60
.................... 		doldur[92]=2; 
00094:  MOVWF  61
.................... 		doldur[93]=2; 
00096:  MOVWF  62
.................... 		doldur[94]=2; 
00098:  MOVWF  63


mplab simule kodunda doldur[89] = 2 için c kodunda tanımladığın
sacma adlı char değişkenin adresine yazmaya çalıştığını göreceksin.
PIC18 CPU Source kod adlı asm penceresindeki 0096 nolu satıra iyi bak
0096 MOVWF 000F60, F
gorduğün gibi sacma adli değişkenin locate ettiğina adresi
dikkatr edersen sadece 91 değil ondan sonrakilerde çalışmıyor :)
Kolay gelsin
Blog Sayfam: www.teknobakis.com

CaFFeiNe



bu piclerde ram'e hızlı erişim için access ram diye bir olay var(mış datasheete göz ucuyla baktım)
datasheeti iyice incelemekte fayda var, resimde görüldüğü gibi sizin probleminiz 5F ten itibaren olan adreslerde başlıyor

dizinin illede 5. adrestenmi başlaması gerekiyor, niye başlayacağı adresi belirtiyorsunuz? derleyici kendi belirlediği adresten başlatsa olmazmı? böylece diziyi diğer banklara filan kaydırabilir belki nasıl olsa dünya kadar RAM var :)

mihri

iyonosfer yazdığın her şeyin farkındayım. Yani ramda 0x60 adresine veri yazmaya çalıştığında 0xf60 yani sacma değişkenine veri yazıyo.bu durum 0x60 tan 0x7f'e kadar geçerli.

MOVLW 12
MOVWF 0x60

komutlarını kullanırsan göreceksin 12 sayısı 60 değil f60 adresine yazılıyo. Peki 0x60 ile 0x7f adresleri arasına yazmak mümkün değil mi? Evet mümkün nasıl mı?

MOVLW 12
MOVFF W,0x60

komutları ile yazılabiliyor. İşte dananın kuyruğu burda kopuyor. CCS doldur[91] yani 0x60 adresine veri yazarken ilk kod örneklerini yani MOVWF komutunu kullanıyo ve yanlış adrese veri yazılmış oluyor. Bu durumda yazdığım C programı yanlış çalışıyor.
(H-Tech ise MOVFF komutunu kullandığı için sorun çıkmıyor.) CCS'nin bu noktada bir açığı var.
Caffeine'nin de deiği gibi doldur dizisini 0x5 adresinden başlatıyorum çünkü amacım 0x60 ve 0x7f adreslerin arasını işgal edip derleyicinin bu bölgeye değişken atamasını önlemek. Böylece hatalı çalışma kısmen engellenmiş oluyor. (Tabi bu diziyi kullanmıyorum.) Aslında doldur dizisini 0x60 ten başlatmalıyım ve 0x7f te bitirmeliyim böylece daha az ram harcamış olurum.

Şimdi asıl sorumu bir daha yineleyeyim. 0x60 ve 0x7f adresleri arasının sırrı nedir? Yukarıda anlatılan durumun sebebi nedir?  Ram' de böyle bir alan oluşturmanın programcıya faydası nedir?
"Eppur si muove!"

iyonosfer

@mihri
rapid'e attiğin kodlardaki asembly .lst file'daki kodlarda sorun yok. 05h-06h olayı PIC'in extended instruction opsiyonunun açık olup olmamasıyla alakalı. C kodunda #FUSES NOXINST satırı var yani extended instaruction kapalı demişsin.

Kodu simule ettiğin yerde bu ayar açık olabilir mi? Extended instruction açık olduğunda yazdığın bölgenin <=5h   veya >=60h olması sonucu etikiliyor datasheet'in dediğine göre.
Blog Sayfam: www.teknobakis.com

mihri

Kapalı yada açık denedim istersen sende dene? Sonuç aynı.
"Eppur si muove!"