istruzione movwf TRISB & 7Fh

salve vorrei porvi 2 quesiti sulla programmazione in assembler del pic16f876

1) in molti sorgenti si trovano istruzioni del tipo movlw 11111111b movwf TRISB & 7Fh queste servono per configurare tutti i pin del portb come ingressi ma qual'è il significato di & 7Fh ?? 2) se definisco una variabile tipo: pippo EQU A0h la direttiva banksel pippo mi seleziona il banco di memoria ram in cui si trova il registro pippo ??

grazie 1000

Reply to
Gabriele Viscardi
Loading thread data ...

Il giorno Sun, 07 Mar 2004 08:26:44 GMT, "Gabriele Viscardi" ha scritto:

Dovrebbe essere un and di 01111111 con il registro TRISB, se è così serve a mantenere a 0 il bit 7 di TRISB, ovvero a configurare il pin B-7 come uscita.

Effettivamente dal punto di vista sintattico è un po' brutto e anche ambiguo.

Stando all'help di MPLab si, pippo deve essere una variabile.

Reply to
Luigi C.

"Luigi C." ha scritto nel messaggio news: snipped-for-privacy@4ax.com...

pic16f876

[CUT]

registro

in realtà non definisci una variabile, ma solo un associazione fra una label pippo ed un valore A0h, non è EQU che rende pippo una variabile, infatti EQU non riserva memoria, in sostanza pippo diventa una variabile quando la utilizzi con operatori in grado di lavorare con le variabili, ma rimane sempre il fatto che è una associazione fra la label pippo ed il valore definito a destra di EQU.

Ciao Pow

Reply to
POWERMOS

Il giorno Sun, 07 Mar 2004 16:16:57 GMT, "POWERMOS" ha scritto:

Infatti io ho detto "pippo deve essere una variabile", mentre la dichiarazione di Gabriele è relativa ad una costante.

Reply to
Luigi C.

"Luigi C." ha scritto nel messaggio news: snipped-for-privacy@4ax.com...

ha

label

dichiarazione

OK, però forse non è chiaro a Gabriele il perchè la cosa non è rigorosamente corretta:

la scrittura presuppone che da qualche altra parte nel codice si sia riservata memoria alla locazione A0h oppure che la locazione venga utilizzata solo per rappresentare una variabile infatti da MPASM (non MPLAB che è solo l'IDE) si ha:

EQU - Define ad assembler constant

fatta questa precisazione il pezzo di codice seguente:

effettivamente fa quello che si chiede Gabriele, ovviamente a patto che pippo sia una variabile, come giustamente hai detto tu.

L'unica cosa che mi premeva precisare è che molte volte si tende ad associare alla EQU una variabile, il che non è corretto, si definisce solo una label. Per identificare una variabile infatti si hanno diversi metodi, io in genere preferisco utilizzare CBLOCK, ad esempio:

CBLOCK 0x20 ; Locazione RAM da dove inizia la memorizzazione dei registri (in ordine crescente)

w_temp ; Variabile per salvataggio registro W status_temp ; Variabile per salvataggio registro STATUS pcl_tmp ; Variabile per salvataggio registro PCLATH fsr_tmp ; Variabile per salvataggio registro FSR

temp ; Variabile deposito dati temporanei temp1 ; altra variabile temporanea

ENDC

in questo modo sei sicuro che temp e temp1 sono variabili definite nel banco0 (inizia da 0x20 e finisce a 7Fh) per il PIC16F87x.

Nel caso dell'EQU, volendolo proprio usare per definire una variabile, allora di potrebbe scrivere:

iniram res 20h temp res 2 ; deposito dati temporanei datai res 1 ; registro deposito dati in ingresso datao equ datai ; registro deposito dati in uscita

in questo caso si definisce l'inzio della RAM al registro 20h (quindi la prima locazione disponibile nel banco 0), in seguito si richiede di riservare 2 byte per la variabile temp, in seguito si riserva 1 byte per la variabile datai, nella riga successiva si utilizza EQU per associare a dato0 l'indirizzo di datai, in sostanza NON si definisce una nuova variabile, ma si definisce un nome che usato con istruzioni di gestione delle variabili mi farà accedere alla locazione relativa alla variabile datai.

Era solo una precisazione, non una critica.

Ciao Pow

Reply to
POWERMOS

"Luigi C." ha scritto

Non proprio, e' un and ma non con il contenuto di TRISB, bensi' con il suo indirizzo. Perche'? TRISB si trova all'indirizzo 86H (10000110), pero' l'opcode dell'istruzione MOVWF puo' contenere solo i 7 bit meno significativi. Con &7FH si forza a 0 il bit piu' significativo. A cosa serve questa operazione? Assolutamente a nulla perche' questo bit viene gia' ignorato al momento dell'assemblaggio. In sostanza mettere quell'and o non metterlo non cambia nulla in termini di codice generato, fa solo si che un certo tipo di warning in assemblaggio sparisca (cosa che si puo' fare anche disabilitando i warnings)... o mi e' sfuggito un motivo importante della sua presenza (magari importante per altri tipi di PIC) o e' una cosa demenziale....

Claudio F

Reply to
Claudio F

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.