Newsgroup: it.hobby.elettronica.digitale
Titolo: pic 16f876 con PICC di HI-TECH

Sto programmando il pic 16F876 con il compilatore C dell HI-TECH .
Dichiarando una nuova variabile globale ricevo questo errore:
Error[000]   : Can't find 0x1 words (0x1 withtotal) for psect xtemp
in
segment BANK0
e non capisco perchè visto le percentuali di memoria usata prima
della
dichiarazione della nuova variabile
Program statistics:
Total ROM used     4976 words (60.7%)
Total RAM used       96 bytes (26.1%)
grazie

 ha scritto nel messaggio

La memoria non è tutta contigua ma è suddivisa in banchi.
96 byte è proprio la dimensione del banco 0 della RAM, quindi è già tutta
piena prima della modifica.
Le sezioni generate dal linker non possono stare un pezzo in un banco e un
pezzo in un altro banco.
Con la modifica aumenti la dimensione della sezione xtemp generata dal
linker e questa non ci sta più nel banco 0. Sul banco 0 probabilmente sono
già state allocate anche altre sezioni.
Quindi devi rivedere come allocare le sezioni, ad esempio spostare la
sezione xtemp nel banco 1. Volendo si può agire in altri modi.

 ha scritto nel messaggio

Scusa la mia ignoranza ma non conosco l'argomento, puoi darmi altre
informazioni oppure degli esempi per risolvere il problema.
Grazie

"tibe02" ha scritto


Non ho capito se ti riferisci ai banchi di memoria del micro in oggetto o
alle sezioni generate dal linker o ad entrambe le cose.
*** banchi di memoria ***
Il micro PIC16F876 ha la RAM suddivisa in banchi (vedi fig. 2.3 di pag.17
del datasheet
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2057&ty=&dty=Data+Sheets&section=Data+Sheets&ssUserText=PIC16F876A
).
In totale hai 368 byte di RAM suddivisa in 4 banchi:
- banco 0: 96 byte (address 20h - 7Fh)
- banco 1: 80 byte (address A0h - EFh)
- banco 2: 96 byte (address 110h - 16Fh)
- banco 3: 96 byte (address 190h - 1EFh)
*** sezioni  ***
Qua ti dò una descrizione molto semplificata e non completa, che quasi
sicuramente non sarà molto chiara.
Quando scrivi del codice in C il compilatore crea delle "sezioni" (forse qui
le chiamano "settori").
Ad esempio:
- sezione ".text": contiene le istruzioni
- sezione ".bss": contiene le variabili globali non inizializzate
- sezione ".data": contiene le variabili globali inizializzate
Poi ce ne sono delle altre.
Anche se scrivi in assembly crei delle sezioni, per le istruzioni, per le
variabili, .... In questo caso devi crearle in modo esplicito, in C lo fa il
compilatore C in automatico.
E' possibile anche creare delle proprie sezioni personali a cui assegnare un
nome da te scelto con una direttiva per l'assemblatore (non ricordo con
l'assemblatore che usi come si chiama questa direttiva, forse ".sect").
La sezione .text deve essere allocata in ROM perchè contiene le istruzioni.
La sezione .bss deve essere allocata in RAM perchè contiene variabili,
quelle non inizializzate.
La sezione .data viene allocata in ROM (ci sono i valori di inizializzazione
delle variabili), ma in fase di esecuzione del programma è allocata in RAM
(ci sono le variabili, quelle inizializzate) (è un po' difficile da spiegare
con poche parole).
Nella routine di boot del micro che lavora con un programma scritto in C
(questa routine è scritta in assembly) c'è una parte di codice che azzera le
variabili della sezione .bss (questa parte ha volte può non esserci) e che
inizializza la sezione .data. In questo modo che al termine del boot ti
trovi in RAM le variabili non inizializzate tutte con valore zero e le
variabili inizialzzate con valore pari al valore con cui le hai
inizializzate nel codice.
Se quando lanci in linker ti fai creare anche il map file e lo vai a
guardare (te lo consiglio), vedi come il linker ha mappato le varie sezioni
nelle memorie (ossia a che indirizzi le ha posizionate). In realtà se tu che
dici al linker come mapparle. Nel map file vedi il risultato. Il map file
contiene anche altre informazioni utili.
Ovviamente perchè non ci siano errori nella fase di link, le varie memorie
del micro devono essere sufficientemente grandi da contenere le varie
sezioni. Se una sezione sfora l'indirizzo finale di una memoria, si ha un
messaggio di errore simile a quello che hai avuto.
Nel caso in oggetto si hanno 368 byte di RAM, però suddivisi in 4 blocchi
distinti. Quindi ad esempio non possono essere allocate in RAM sezioni di
dimensione maggiore di 96 byte.
Leggi quanto ti ho scritto, approfondisci con la documentazione del micro e
in particolare con quella dell'assemblatore/compilatore/linker dove tutte le
cose che ti ho detto sono descritte con estrema completezza. Sono concetti
generali che riguardano qualsiasi micro e assemblatore/compilatore/linker,
quindi sono concetti importanti che dovresti imparare.
Se hai altri dubbi, chiedi.
Ciao e buona lettura