Buon pomeriggio a tutti
ho notato in alcuni sorgenti in rete questa riga:
dato equ 20h
mi chiedevo se stavo passando un valore (20h) alla variabile "dato" ? Oppure sto indicando la posizione nella memoria ram ?
grazie
Domanda imbarazzante istruzione EQU
Moderatore:
Paolino
12 messaggi
• Pagina 1 di 2 • 1, 2
4
voti
Stai assegnando il valore 20h alla label di nome "dato" che diventa in questo modo una costante.
Se poi quel 20h (quindi dato) sia un indirizzo della memoria ram o un valore da utilizzare in qualche altro modo dipende dall'utilizzo che se ne fa.
Esempio, se scrivi:
significa salvare il registro W nell'indirizzo di memoria di indirizzo indicato da dato (quindi 20h).
Ma se scrivi
significa caricare in W il valore 20h, quindi non un indirizzo di memoria.
Se poi quel 20h (quindi dato) sia un indirizzo della memoria ram o un valore da utilizzare in qualche altro modo dipende dall'utilizzo che se ne fa.
Esempio, se scrivi:
- Codice: Seleziona tutto
movwf dato
significa salvare il registro W nell'indirizzo di memoria di indirizzo indicato da dato (quindi 20h).
Ma se scrivi
- Codice: Seleziona tutto
movlw dato
significa caricare in W il valore 20h, quindi non un indirizzo di memoria.
Fabio
5
voti
Non e` una istruzione, e` una assegnazione per l'assemblatore. Assegna al simbolo "dato" il valore 20H. Il simbolo "dato" non e` una variabile del programma ma solo un valore per l'assemblatore. L'informazione va nella tabella dei simboli dell'assemblatore.
Se vuoi caricare nel registro A il valore 20H puoi scrivere
LD A, 20H oppure LD A,DATO l'assemblatore traduce esattamente nello stesso modo.
Oppure puoi usarla come indirizzo, ad esempio JP DATO: il processore salta all'indirizzo 20H. Invece l'istruzione LD (DATO), HL carica all'indirizzo 20H il contenuto del registro HL, esattamente come fa con LD 20H, HL.
Se vuoi caricare nel registro A il valore 20H puoi scrivere
LD A, 20H oppure LD A,DATO l'assemblatore traduce esattamente nello stesso modo.
Oppure puoi usarla come indirizzo, ad esempio JP DATO: il processore salta all'indirizzo 20H. Invece l'istruzione LD (DATO), HL carica all'indirizzo 20H il contenuto del registro HL, esattamente come fa con LD 20H, HL.
Per usare proficuamente un simulatore, bisogna sapere molta più elettronica di lui
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
0
voti
Grazie per le vs risposte, semplici e utilissime.
Tuttavia ho bisogno, a questo punto, ancora del vs aiuto.
Innanzitutto il micro con il quale sto lavorando è il PIC16F677 e la domanda è:
come è possibile assegnare ad una variabile un indirizzo di memoria che decido io?
Oggi con la riga:
"dato RES 3"
riservo tre registri nella memoria RAM ma non so come (se è possibile) decidere la locazione di memoria.
grazie
Tuttavia ho bisogno, a questo punto, ancora del vs aiuto.
Innanzitutto il micro con il quale sto lavorando è il PIC16F677 e la domanda è:
come è possibile assegnare ad una variabile un indirizzo di memoria che decido io?
Oggi con la riga:
"dato RES 3"
riservo tre registri nella memoria RAM ma non so come (se è possibile) decidere la locazione di memoria.
grazie
1
voti
devi far precedere alla definizione di dato l'indirizzo di partenza di quei 3 byte.
Nell'ipotesi di voler far posizionare quei byte a partire dalla locazione 35h:
Attenzione: così facendo non ci sono garanzie di non sovrapponibilità di variabili diverse
Nell'ipotesi di voler far posizionare quei byte a partire dalla locazione 35h:
- Codice: Seleziona tutto
org 35h
dato res 3
Attenzione: così facendo non ci sono garanzie di non sovrapponibilità di variabili diverse
Fabio
0
voti
Perfetto !!
pertanto avrei come risultato che la mia variabile "dato" impegna la locazione 035h,036h e 037h!
Quindi, a prescindere su quale banco sto lavorando, indicando da quale locazione di memoria voglio iniziare l'assegnazione posso "mappare" le mie variabili.
Grazie 1000
pertanto avrei come risultato che la mia variabile "dato" impegna la locazione 035h,036h e 037h!
Quindi, a prescindere su quale banco sto lavorando, indicando da quale locazione di memoria voglio iniziare l'assegnazione posso "mappare" le mie variabili.
Grazie 1000

2
voti
mros ha scritto:Quindi, a prescindere su quale banco sto lavorando, indicando da quale locazione di memoria voglio iniziare l'assegnazione posso "mappare" le mie variabili.
non sono molto sicuro che sia così, o almeno non so se intendiamo la stessa cosa...
facciamo un paio di esempi:
- Codice: Seleziona tutto
org 70h
dato_0 res 3
org 170h
dato_2 res 3
Se scrivi così intendendo che dato_0 deve essere mappata sul banco 0 e dato_2 sul banco 2 devi sapere che dato_0 e dato_2 vengono utilizzate nell'indirizzamento come se avessero lo stesso valore ovvero 70h.
Quindi scrivere:
- Codice: Seleziona tutto
movwf dato_0
oppure scrivere
- Codice: Seleziona tutto
movwf dato_2
non significa salvare W sulla locazione del banco 0 (prima istruzione) e salvare W sulla locazione del banco 2 (seconda istruzione), ma significa per entrambe salvare W sulla locazione 70h del banco corrente.
Devi quindi sempre preoccuparti tu di impostare il giusto banco prima.
Non so se fosse questo quello che intendevi.
Fabio
0
voti
Bene !
mi sembrava troppo semplice
A questo punto mi viene un altro dubbio. In un firmware per un PIC 16F877 devo utilizzare c.a. 110 varibili. Fregandomene per un'istante che non mi interessa mappare in memoria queste ultime, la prima cosa che mi viene in mente di fare è di riservare loro dello spazio utilizzando le seguenti istruzioni:
org 20h
dato1 res 1
dato2 res 1
.....
dato110 res 1
Mi chiedo a questo punto per leggere/scrivere nell'ultima variabile devo impostare sembre il banco di appartenenza (che in questo caso è Banco 4)??

mi sembrava troppo semplice
A questo punto mi viene un altro dubbio. In un firmware per un PIC 16F877 devo utilizzare c.a. 110 varibili. Fregandomene per un'istante che non mi interessa mappare in memoria queste ultime, la prima cosa che mi viene in mente di fare è di riservare loro dello spazio utilizzando le seguenti istruzioni:
org 20h
dato1 res 1
dato2 res 1
.....
dato110 res 1
Mi chiedo a questo punto per leggere/scrivere nell'ultima variabile devo impostare sembre il banco di appartenenza (che in questo caso è Banco 4)??

1
voti
Devi indicare il banco su cui si trova la variabile, ma non solo, devi anche dichiarare le variabili in modo opportuno.
Parlando del PIC16F877 potrai notare che ha 96 byte (a partire da 20h) sul banco 1, quindi 80 byte (a partire da A0h) nel banco 2, ecc...
Scrivere le variabili consecutive come hai fatto non va bene perché le prime 96 avrebbero l'indirzzo giusto, la 97° variabile avrebbe indirizzo 80h che non è corretto, ecc.
devi quindi dichiare opportunamente anche l'inizio dei diversi blocchi con la org.
La dato110 secondo me dovrebbe essere sul banco2 e non sul 4.
Per il cambio di banco conviene utilizzare la BANKSEL:
Parlando del PIC16F877 potrai notare che ha 96 byte (a partire da 20h) sul banco 1, quindi 80 byte (a partire da A0h) nel banco 2, ecc...
Scrivere le variabili consecutive come hai fatto non va bene perché le prime 96 avrebbero l'indirzzo giusto, la 97° variabile avrebbe indirizzo 80h che non è corretto, ecc.
devi quindi dichiare opportunamente anche l'inizio dei diversi blocchi con la org.
La dato110 secondo me dovrebbe essere sul banco2 e non sul 4.
Per il cambio di banco conviene utilizzare la BANKSEL:
- Codice: Seleziona tutto
BAKSEL dato110
movwf dato110
Fabio
0
voti
Buonpomeriggio
ho ripreso questo messaggio....e mi sono reso conto che ho sempre commesso un errore....
utilizzo un pic16f677 e l'indirizzo del banco 0 utile per le varibili RAM parte da 40h ....e io scrivo:
cblock 0x20
...
...
endc
ma la cosa buffa è che funziona bene....come si spiega questa cosa?
ciao
ho ripreso questo messaggio....e mi sono reso conto che ho sempre commesso un errore....
utilizzo un pic16f677 e l'indirizzo del banco 0 utile per le varibili RAM parte da 40h ....e io scrivo:
cblock 0x20
...
...
endc
ma la cosa buffa è che funziona bene....come si spiega questa cosa?
ciao
12 messaggi
• Pagina 1 di 2 • 1, 2
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 4 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



