Mplab 6.3
Mplab 6.3
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
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
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.
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.
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.
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.
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...
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...

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å...
"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å...
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...
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...