Newsgroup: it.hobby.elettronica.digitale
Titolo: [Help PIC] problemi con RES

Sto implementando un programma in cui riservo spazio in memoria per le mie
variabili utilizzando la direttiva RES (es. ByteCountT RES 1).
Prima domanda: come posso debuggare il contenuto delle mie variabili?
Attualmente utilizzo la finestra di watch e metto l'indirizzo che leggo nel
Program Memory; e' corretto?
Seconda domanda: se sposto l'ordine con il quale attualmente ho dichiarato
le mie variabili il programma non funziona e assume comportamenti assurdi.
Non riesco a spiegarmi come possa accadere.

Non riesco a spiegarmi come possa accadere.
Hai evidentemente fatto qualche errore nel tuo programma
In qualche punto probabilmente sovrascrivi le variabili
Se le variabili che utilizzi influiscono in maniera diversa
sull'esecuzione del programma è ovvio come spostando le definizioni
delle variabili cambi quelle che sovrascrivi e quindi il funzionamento
del programma
Spero di esserti stato di aiuto
Ciao
Marcello

 ha scritto nel messaggio
news:6g9c80hgilcansllk...@4ax.com...


Ronnie
di nulla
:)

 sarà buffer+34=0x21+.34=0x43


Vedremo!
Prova a fare una cosa:
disabilita gli interrupt relativi alla tastiera e prova solo quello
relativo ad RB0 e vedi se funziona
esegui nella routine di interrupt qualche semplice funzione come
verifica come far accendere un led
fammi sapere i risultati
;)
ciao

 ha scritto nel messaggio
news:qglc80ps9letk5tcb...@4ax.com...


 >Il prossimo problema da risolvere sarā il doppio interrupt, come ho


 MOVLW  RS232       ;W=indirizzo dell'array
Il massimo valore memorizzabile in 8 bit e'0xFF, assegnando 0x150 a W l'1
iniziale (il nono bit) viene tagliato via e rimane 0x50.
Sarebbe corretto fare:
  LFSR   FSR0,RS232
  MOVF   ByteCount,W
  ADDWF  FSR0L,F,A
  BTFSC  STATUS,C,A
  INCF   FSR0H,F,A
  MOVF   ShiftReg,W
  MOVWF  INDF0,A
  INCF   ByteCount,F
  GOTO   MainLoop
Claudio F

 ha scritto nel messaggio
news:9DAhc.85591$hc5.3...@news3.tin.it...


 ha scritto nel messaggio
news:9DAhc.85591$hc5.3...@news3.tin.it...


 appare giusto...come mai?
Perche' e' giusto;) La confusione mi pare nasca dall'idea che in qualche
modo i registri vengano "riservati", mentre in realta' con RES o EQU vengono
solo fatte delle associazioni tra etichette e valori, valori che possono
oppure no essere degli indirizzi a seconda di come e dove vengono usati, e
che per lo stesso motivo in alcuni casi (come nel watch) sono considerati
per l'intero valore, in altri si considerano solo 8 bit. EQU e RES si
possono anche non mettere se nelle singole istruzioni si specificano
esplicitamente gli indirizzi su cui devono lavorare.
Se scrivi RS232 EQU 0x150 per il simulatore/assemblatore quello e' il valore
associato all'etichetta RS232, per cui il watch ti fara' vedere l'indirizzo
0x150. Ma se provi a caricare RS232 in W (con una MOVLW RS232) in realta'
vai a caricare in W solo gli 8 bit bassi (e' come scrivere MOVLW 0x150), in
W verra' caricato solo il 0x50.
Gli array possono essere messi dove ti pare, ma il puntatore e' formato da
due registri, quindi o li carichi separatemente (scomponendo l'indirizzo a
mano, oppure usando i prefissi HIGH e LOW per estrarre le parti alta e
bassa), o in un colpo solo con LFSR.
Il watch che dici e' giusto, e' la tua routine che va a scrivere da un'altra
parte perche' non gestisce correttamente l'indirizzo. Oltre che sommare
ByteCount alla parte bassa di RS232 avresti dovuto anche caricare la parte
alta dell'indirizzo in FSR0H, e verificare che la somma con ByteCount sulla
parte bassa non generasse un overflow (dovendo cosi' incrementare quella
alta). I 18F da questo punto di vista sono molto piu' comodi dei 16F perche'
basta caricare in FSR0 l'indirizzo una sola volta all'inizio:
  LFSR    INDF0,0x150
e poi scrivere sequenzialmente i dati nel registro POSTINC0:
  MOVF   ShiftReg,W
  MOVWF  POSTINC0,A
  INCF   ByteCount,F
Claudio F

 > register č comunque nel punto giusto il mio array, nel watch


 la mia variabile in quel registro ed usarla liberamente?
Forse e' meglio per un attimo dimenticare le EQU/RES e le variabili (che in
assembler sono solo un'astrazione) e scendere un po' piu' vicino
all'hardware.
Ci sono solo i registri, ciascuno con il suo indirizzo. Vi si puo' accedere
in due modi, indirettamente (tramite i registri puntatori) o direttamente
(scrivendone l'indirizzo nelle istruzioni).
Nel primo caso tutta la ram puo' essere vista in modo lineare, e' cioe'
possibile scrivere in FSRx un qualsiasi indirizzo a 16 bit tramite
l'istruzione LFSR ed accedere alla cella puntata tramite INDFx.
Nel secondo caso va invece ricordato che le istruzioni accettano solo la
parte bassa dell'indirizzo completo, mentre la parte alta va scritta nel
registro BSR tramite l'istruzione MOVLB. In pratica la ram e' suddivisa in
tanti banchi da 256 bytes ciascuno selezionabili tramite il registro BSR.
Questo vuol dire che se si effettua l'operazione MOVF 256,W e il banco
attivo e' l'1 si legge effettivamente il contenuto dell'indirizzo 256, ma se
il banco attivo e' un'altro si legge il primo byte di quel banco, questo
accade perche' nell'istruzione il 256 (100000000) viene limitato a 8 bit
(00000000) e usato come "offset" all'interno del banco attivo.
Nei 18F vi e' poi l'ulteriore modalita' "access ram" che permette di vedere
come un unico blocco i primi 128 bytes della ram e gli ultimi 128 (che
contengono i registri di controllo dell'hardware, lo STATUS ecc), questa
modalita' di indirizzamento si ottiene scrivendo ,A alla fine delle
istruzioni e andrebbe sempre usata quando si accede ai registri di controllo
perche' evita di dover selezionare il banco con MOVLB.
Il resto, cioe' le EQU ecc, e' un'aggiunta che semplifica il lavoro. Se si
vuole usare un registro all'indirizzo 300 (100101100) si puo' benissimo
scrivere PIPPO EQU 0x12C per dare un nome a quell'indirizzo, ma per
accedervi direttamente con un'istruzione bisogna prima selezionare il banco
in cui si trova con MOVLB 1, altrimenti, nell'ipotesi che sia attivo lo 0 si
accede alla cella 44 (000101100).
Detto tutto questo e' evidente che le definizioni con RES o EQU non sono
l'equivalente delle variabili dei linguaggi ad alto livello, ma solo
aggiunte che evitano di doversi ricordare a memoria la funzione di ogni
indirizzo. In ogni caso va sempre considerata la realta' fisica che regola
l'indirizzamento... dopotutto siamo in assembler...... e microchip per
giunta.......
Claudio F