Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Domanda imbarazzante istruzione EQU

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Domanda imbarazzante istruzione EQU

Messaggioda Foto Utentemros » 2 ott 2013, 13:51

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
Avatar utente
Foto Utentemros
10 1 5
Frequentatore
Frequentatore
 
Messaggi: 131
Iscritto il: 28 giu 2010, 9:23

4
voti

[2] Re: domanda imbarazzante istruzione EQU

Messaggioda Foto Utentec1b8 » 2 ott 2013, 14:09

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:
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
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

5
voti

[3] Re: domanda imbarazzante istruzione EQU

Messaggioda Foto UtenteIsidoroKZ » 2 ott 2013, 14:11

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.
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
Avatar utente
Foto UtenteIsidoroKZ
121,2k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 21059
Iscritto il: 17 ott 2009, 0:00

0
voti

[4] Re: domanda imbarazzante istruzione EQU

Messaggioda Foto Utentemros » 2 ott 2013, 14:38

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
Avatar utente
Foto Utentemros
10 1 5
Frequentatore
Frequentatore
 
Messaggi: 131
Iscritto il: 28 giu 2010, 9:23

1
voti

[5] Re: domanda imbarazzante istruzione EQU

Messaggioda Foto Utentec1b8 » 2 ott 2013, 14:47

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:
Codice: Seleziona tutto
          org  35h
dato   res  3

Attenzione: così facendo non ci sono garanzie di non sovrapponibilità di variabili diverse
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[6] Re: domanda imbarazzante istruzione EQU

Messaggioda Foto Utentemros » 2 ott 2013, 15:03

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 :ok:
Avatar utente
Foto Utentemros
10 1 5
Frequentatore
Frequentatore
 
Messaggi: 131
Iscritto il: 28 giu 2010, 9:23

2
voti

[7] Re: domanda imbarazzante istruzione EQU

Messaggioda Foto Utentec1b8 » 2 ott 2013, 16:19

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
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[8] Re: domanda imbarazzante istruzione EQU

Messaggioda Foto Utentemros » 3 ott 2013, 17:07

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)??
?%
Avatar utente
Foto Utentemros
10 1 5
Frequentatore
Frequentatore
 
Messaggi: 131
Iscritto il: 28 giu 2010, 9:23

1
voti

[9] Re: domanda imbarazzante istruzione EQU

Messaggioda Foto Utentec1b8 » 4 ott 2013, 18:53

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:
Codice: Seleziona tutto
    BAKSEL    dato110
    movwf     dato110
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[10] Re: Domanda imbarazzante istruzione EQU

Messaggioda Foto Utentemros » 17 dic 2013, 18:21

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
Avatar utente
Foto Utentemros
10 1 5
Frequentatore
Frequentatore
 
Messaggi: 131
Iscritto il: 28 giu 2010, 9:23

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti