Tips & Tricks - PIC

 

 


7.- Definire la memoria.

Passiamo ora alla definizione dell' uso della memoria RAM.
Ogni famiglia di PIC dispone di memoria RAM organizzata in modo e in quantità differente. Occorrerà quindi conoscere questi dati per poter configurare esattamente questa sezione.

Ecco, ad esempio, la definizione della RAM per un PIC18F. Da notare che, per evitare inutili calcoli manuali, nel sorgente è inserita una piccola procedura di verifica per assicurare che le assegnazioni non superino la capacità dei singoli blocchi.

;####################################################################
;====================================================================
;=                           MEMORY USAGE                           =
;====================================================================
;--------------------------------------------------------------------
;---------  ACCESS BANK  ---------
;---------------------------------
; first 128 bytes
; -----------------

; esempi di assegnazione
 
CBLOCK 0x00  ; bank 0
 
bcdubuf:6    ; BCD unpacked buffer, big endendian, 6 bytes
 
LCDbuf:16    ; LCD data buffer, 16 bytes
 
flag         ; general flags

; automatismo anti overflow
 
end_Accbank0:0          ; dummy for overrun check
 
ENDC
 
#if end_Accbank0 > 0x7F ; check for overrun
   
error "Access Bank space overrun"
 
#endif

;--------------------------------------------------------------------
;----------- BANK 0 ----------
;-----------------------------
; second 128 bytes (not Accces Bank)
  CBLOCK 0x80
 
ENDC

; esempio di assegnazione di area di salvataggio del contesto per
; interrupt a bassa priorità 
 #if INTRPRIORITY == 1   ; se interrupt con priorità attivo
 
CBLOCK 0xFD            ; definisce area di salvataggio dei
 
wreg_lp : 1            ; registri sensibili per interrupt
 
bsr_lp  : 1            ; a bassa priorità
 
status_lp : 1
 
#endif

; automatismo anti overflow
 
end_bank0:0             ; dummy for overrun check
 
ENDC
 
#if end_bank0 > 0xFF    ; check for overrun
   error "Bank 0 space overrun"
 
#endif

 
;--------------------------------------------------------------------
;----------- BANK 1 ----------
;-----------------------------
; 256 bytes
; -------------
 
CBLOCK 0x100

; automatismo anti overflow  
 
  end_bank1:0
            ; dummy for overrun check
 
ENDC
 #if end_bank1 > 0x1FF
   ; check for overrun
  
error "Bank 1 space overrun"
 #endif

;--------------------------------------------------------------------
;----------- BANK 15 --------
;----------------------------
; 128 bytes
; -------------
  CBLOCK 0xF00

; automatismo anti overflow   
  end_bank15:0
           ; dummy for overrun check
 
ENDC
 #if end_bank15 > 0xF7F
; check for overrun
  
error "Bank 15 space overrun"
 #endif

Ovviamente le definizioni potranno anche utilizzare gli statement relativi alle assegnazioni di memoria per oggetti rilocabili. Ad esempio:

; Esempio di uso della GPR Uninitialized Data
; variabili uetente posizionate dal linker

GPR_VAR UDATA 0x20

MYVAR1 res
MYVAR2 res 1
MYVAR3 res 1
MYFLAG res 1

E' possibile anche qui utilizzare una forma "grafica" per visualizzare meglio una definizione di memoria:

;====================================================================
; definizione dei flag nel byte MYFLAG
;| 7  |  6  |  5   |  4   |  3  |   2  |  1  |  0  |
;|----|-----|------|------|-----|------|-----|-----|
;|    |     |i2cdok|totovf|undff|by3ovf|taokf|wedgf|

;
#define wedgf  MYFLAG,0 ; waiting transition (1st=0 2nd=1)
#define taokf  MYFLAG,1 ; tacho data ok
#define by3ovf MYFLAG,2 ; byte3 counter overflow
#define undff  MYFLAG,3 ; sub underf
#define totovf MYFLAG,4 ; totalizer overflow
#define i2cdok MYFLAG,5
;#define  
     MYFLAG,5 : spare
;#define      
MYFLAG,7 ; spare

In questa sezione andrà definita, se usata, anche la EEPROM, ad esempio precaricandola:

;====================================================================
; DATI PRECARICATI IN EEPROM
;====================================================================

DATAEE ORG 0xF000

eep0 DE "Questo è un messaggio" ; testo in eeprom
eep1 DE 0xAA, 0xFF, 0x55        ; valori in eeprom

TXTE_EE  EQU low (eep0)    ; indirizzo relativo del messagggio
VAL1_EEP EQU low (eep1)    ; indirizzo relativo del primo valore
VAL2_EEP EQU low (eep1+1)  ; indirizzo relativo del secondo valore
VAL3_EEP EQU low (eep1+2)  ; indirizzo relativo del terzo valore

 


 

Copyright © afg . Tutti i diritti riservati.
Aggiornato il 16/05/12 .