Mplab 6.3

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Mplab 6.3

Inlägg av gvs »

Komplierar en kod och får följande varning: Invalid RAM location specified
Den beror på att jag inte säger var i minnet variablerna ska ligga, är det nåt att bry sig om? det är ju bara en varning. Kod:

;***** RAM ASSIGNMENT


CBLOCK 0x0C
KeyBufferTail ; where the last byte in buffer is..
clkCount ; used for clock timing
Saved_Pclath ; Saved registers during interrrupt
.....
ENDC
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg av AsmN »

CBLOCK 0x0C

anger minnesplats 0C och framåt vilket tydligen inte är en bra plats...
Detta beror säkert på vilken processor du använder men åtminstone i 16F877 kan man bara använda 0x20-0x7F själv från bank0 de som finns före är register som används av PIC:en... Kolla i databladet...

Sen sådana variabler som skall sparas under interrupt skall vara (helst) i shared memory (vilket delas över alla banker). Detta är 0x70-0x7F i 16F877.
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Inlägg av gvs »

Oki, liten miss där får fixa minnes platsen, men själva konceptet ska alltså inte vara nåt fel med....

Det går att lägga alla i det gemensamma minnet va? alla fick plats där så jag ser ingen mening med att inte göra så.
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg av AsmN »

Annars ser det bra ut. Ifall alla ryms i gemensamma minnet är är det helt klart bättre, då behöver du ju inte byta bank.
egh01
Inlägg: 58
Blev medlem: 18 september 2003, 11:25:33

Inlägg av egh01 »

Jag har en fråga som jag tror skulle kunna passa i den här tråden. Frågan gäller var i minnet variabler/konstanter hamnar när man deklarerar/initialiserar dem med 'variable', 'set', constant', 'equ' eller 'cblock'. Är det från första lediga minnespositionen? För närvarande håller jag på att programmera en PIC18F452 men jag är även intresserad av hur det fungerar i de andra PIC:arna.
Och när det gäller 'cblock' så är det konstantens värde som man anger och som ökar med 1 för varje ny deklarering eller är det positionen i minnet man anger? Är det verkliga konstanter man deklarerar med hjälp av 'cblock'? Det står det i manualen men jag tror att jag har använt dom som variabler utan att få några varningsmeddelande eller några problem med koden.
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg av AsmN »

Jag har itne läst vad som står i manualer m.m. på en bra tid så det kan hända att jag missat nån bit, dvs det kan finnas fler "finesser" med dessa kommandon än vad jag skriver...

cblock allokerar minnesplatser, om du kollar på exemplet ovan som gvs har så finns KeyBufferTail i minnesplats 0c och clkCount i minnesplats 0d o.s.v. (dessa minnesplatser fungerar ju inte men det var ju en annan historia :))
Dock så initialiseras minnesplatserna inte till någonting.
Om man skiver KeyBufferTail:2 så allokeras 2 minnesplatser för KeyBufferTail.

EQU sätter värdet på en konstant.
T.ex.:
LED1 EQU 2 ;konstanten LED1 får värdet 2

Detta kan ju sen användas tex i följande situation:
BSF PORTB,LED1 ;Sätter PORTB,2 till 1

Detta tar inte upp någon minnesplats utan används bara för att göra det överskådligare för den som programmerar...

De andra har jag inte användt så jag lämnar dem åt någon annan... ;)
egh01
Inlägg: 58
Blev medlem: 18 september 2003, 11:25:33

Inlägg av egh01 »

Det där med 'cblock' är vad jag trodde också från början men jag läste nu i manualen och där står det såhär:

"cblock [<expr>]

<label>[:<increment>][,<label>[:<increment>]]

endc


Define a list of named constants. Each <label> is assigned a value of one higher than the previous <label>
...
<expr> indicates the starting value for the first name in the block."

På det här verkar det ju som om det är ett värde på konstanterna man anger som "uttryck".

Om någon vet var variabler ('variable' & 'set') hamnar så är jag fortfarande intresserad. Jag har fått känslan (i mplab) att de hamnar på första minnespositionen först när de används. Men jag om någon vet hur det är så...
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg av AsmN »

Detta hittade jag när jag sökte på google:

While you can use a number for a register is is more common to name them using EQU or the cblock directive. For example:

temp equ 0x70
movlw 0x10
movwf temp
The cblock directive allows you to define several bytes together. For example:

cblock 0x70
temp
x, y
endc
This bit of assembler defines 3 bytes that will be at locations 0x70 (temp), 0x71 (x), and 0x72 (y). Note that if you put multiple items on the same line, you need a comma between them.

When using cblock, you can also specify an increment by using a colon after each name. So for example:

cblock 0x70
temp:0, temp_hi, temp_lo
x, y
endc
This snippet creates a variable called temp at 0x70. The variable temp_hi is also at 0x70 and temp_lo is at 0x71 (x and y are at 0x72 and 0x73). Presumably, we meant for temp to hold 16 bits in this example. You might write:

cblock 0x70
temp
x, y
arraybase:0x10
ptr
endc
This would put ptr 0x10 bytes after arraybase.


Så jag hade tydligen fel när jag sa att cblock allokerar minnet. Så det går att använda på många sätt.

EQU går tydligen att använda på samma sätt som cblock förutom det sätt som jag nämnde tidigare...
Skriv svar