- Messaggi: 105
- Ringraziamenti ricevuti 5
Memoria dati e memoria programma PIC16F84A
Allora per il microcontrollore in questione la memoria programma è composta da 1024 locuzioni di 14 bit ciascuno indirizzate da 0000h ad 3FFh, mentre la memoria dati è suddivisa in due banchi Bank0-Bank1 ciascuno a sua volta suddiviso nelle aree SFR e GPR dove l'area SFR ovvero le prime 12 locuzioni di ogni banco serve per monitorare e controllare le periferiche, mentre l'area GPR è costituita da 68 locuzioni nel banco0 e altre 68 nel banco1, dove quelle del banco0 iniziano da 0Ch e quelle del banco1 iniziano da 8Ch.
Detto ciò i miei dubbi riguardano la direttiva ORG in quanto nel programma è inserita una prima ORG del tipo:
ORG 0Ch
per la quale il libro dice che questa serve per definire un'area dati in cui memorizzare variabili e contatori durante l'esecuzione del programma, e fin qui ci sono, poi inserisce un'altra ORG del tipo:
ORG 00h
per la quale dice che questa fa riferimento ad un indirizzo di area programma anzichè in area dati.
Il mio dubbio a questo punto è il seguente, visto che sia l'area dati che l'area programma iniziano dall'indirizzo 00h, perchè si ha la certezza che scrivendo quella ORG si fà riferimento all'area programma e non a quella dati ?
E' vero che la prima locuzione di memoria, all'indirizzo zero, deve contenere la prima istruzione che il microcontrollore esegue al reset e per questo viene chiamata Reset Vector, però io non risco a capire come il microcontrollore non si confonda tra area dati e programma se queste hanno gli stessi indirizzi.
Grazie per le eventuali risposte
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mikysmcv
- Autore della discussione
- Premium Member
la direttiva assembly ORG dice semplicemente dove posizionare il codice che segue o una variabile.
In particolare assegni un indirizzo di partenza.
Per le variabili in RAM c'e' un'altra direttiva che ora non ricordo (mi sembra EQU) [Errato e' RES]
In ogni modo nessuno ti vieta di scrivere delle costanti in flash che considerai come memoria dati.
quando scrivi ORG 00h
e scrivi dieci NOP
poi scrivi ORG 05h, e scrivi altro codice...
...hai sovrapposizione del programma.
Se memoria non mi inganna ti viene segnalato come errore in fase di compilazione.
E' da quasi 10 anni che non programmo un PIC16 in assembly!
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
ORG 0CH
Count RES 2
ORG 00H
dicendo che la prima definisce un'area dati all'interno del PICmicro ovvero un'area in cui memorizzare variabili e contatori durante l'esecuzione del programma, la seconda indica al compilatore di riservare un certo numero di byte, mentre la terza fa riferimento ad un indirizzo in area programma anzichè in area dati.
Ora da quello che ho capito ( o credo di aver capito ) la prima ORG fà riferimento all'area dati perchè l'area GPR della memoria dati inizia proprio dall'indirizzo 0CH, mentre la seconda ORG fà riferimento alla memoria programma in quanto la prima locuzione di memoria, all'indirizzo zero, deve contenere la prima istruzione che il PICmicro deve eseguire al reset e non può essere un'indirizzo dell'area dati in quanto l'indirizzo 00H dell'area dati fà riferimento alla SFR ovvero all'area riservata alle funzioni speciali per il funzionamento del PICmicro e non possono essere utilizzate per altri scopi.
Quante cavolate ho detto ?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mikysmcv
- Autore della discussione
- Premium Member
- Messaggi: 105
- Ringraziamenti ricevuti 5
Quindi sembrerebbe esserci una sovrapposizione.
Il tutto funziona perche' la memoria Flash e RAM hanno un bus indirizzi diversi (Architettura Harvard ).
Se memoria non mi inganna tutto quello che scrivi prima di ORG 00H rappresentano indirizzi EEPROM e RAM.
In ogni modo ORG non definisce un area bensi dice solo al linker dove posizionare le variabili o istruzioni che ha generato il compilatore.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Mauro Laurenti ha scritto: Bisogna fare attenzione la memoria flash ha anche l'indirizzo 0CH che e' quello che tu hai detto essere della RAM.
Quindi sembrerebbe esserci una sovrapposizione.
Il tutto funziona perche' la memoria Flash e RAM hanno un bus indirizzi diversi (Architettura Harvard ).
Adesso le cose mi sono un pò più chiare, infatti non riuscivo a capire come mai non ci fossero problemi una volta caricato il programma, il quale sicuramente superava l'indirizzo 0CH e quindi si sarebbe andato ad accavallare allo spazio riservato nell'area dati, GRAZIE
Mauro Laurenti ha scritto: In ogni modo ORG non definisce un area bensi dice solo al linker dove posizionare le variabili o istruzioni che ha generato il compilatore.
Questo il libro non lo riportava e quindi non lo sapevo GRAZIE anche per questo.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mikysmcv
- Autore della discussione
- Premium Member
- Messaggi: 105
- Ringraziamenti ricevuti 5
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.