Newsgroup: it.hobby.elettronica.digitale
Titolo: [Help PIC] Gestione Array

Salve a tutti,
In una routine di ricezione RS232 devo salvare sequenzialmente dei Byte
ricevuti in un array cosě definito:
RS232    res    35        ;array di dati ricevuti
Ho definito inoltre delle variabili:
ShiftReg            res       1        ;Carattere appena ricevuto
ByteCount        res        1        ;contatore dei bytes ricevuti
Dopo la ricezione di ogni singolo byte, vorrei andare a  memorizzare il
contenuto di ShiftReg nell'array RS232  (Bytecount viene incrememtato dopo
la ricezione di ogni byte).
Lo vorrei fare cosě:
    movf        ShiftReg,W
    movwf     RS232+ByteCount        ;problema!!!
    incf          ByteCount,F
Ho riscontrato che per memorizzare il dato non posso usare la seconda
istruzione qui riportata, (il compilatore non mi ha segnalato errori!?!?) ma
l'istruzione funziona solo se scritta nei seguenti modi:
    movwf     RS232
    movwf     RS232+1
    movwf     RS232+2
    ecc.
Ma questo non mi permette di utilizzare un ciclo.
Come potrei far passare dinamicamente la variabile +ByteCount???
Grazie a tutti per l'aiuto.
Ronnie

 incf      ByteCount,F
MOVLW  RS232        ;W=indirizzo dell'array
ADDWF  ByteCount,W  ;Ci somma l'indice
MOVWF  FSR          ;lo mette nel puntatore FSR
MOVF   ShiftReg,W   ;W=valore ricevuto
MOVWF  INDF         ;Lo muove all'indirizzo puntato
INCF   ByteCount,F  ;ecc...
L'indice (il valore di bytecount) deve partire da 0, se lo vuoi far partire
da 1 allora la prima riga deve essere MOVLW RS232-1.
Claudio F

Grazie Claudio,
queste dei puntatori sono finezze che non avrei immaginato, ora provo
immediatamente...
Grazie!!!
Ronnie
Claudio F ha scritto nel messaggio ...


 queste dei puntatori sono finezze che non avrei immaginato,
In assembler piu'evoluti l'accesso indiretto alla ram tramite registri
puntatori e' la prassi, mentre e' ridotta la capacita' di indirizzamento
diretto. Nei pic e' il contrario, in tutte le istruzioni si accede ai
registri (celle ram) in modo diretto specificandone l'indirizzo, ma
l'accesso indiretto e' molto piu'limitato. La situazione migliora un po'con
i 18F che dispongono di 3 registri indice a 16 bit in grado di puntare
qualsiasi locazione di memoria e permettono funzionalita' di pre/post
incremento/decremento automatiche. La versione per PIC18F se non sbaglio
dovrebbe essere la seguente:
MOVLW   LOW RS232
MOVWF   FSR0L,A
MOVLW   HIGH RS232
MOVWF   FSR0H,A
MOVF    ByteCount,W,1
ADDWF   FSR0L,F,A
BTFSC   STATUS,C,A
INCF    FSR0H,F,A
MOVF    ShiftReg,W,1
MOVWF   INDF0,A
INCF    ByteCount,F,1
Claudio F

...


 automatici?
Normalmente per scrivere o leggere nella locazione puntata da FSRx (x da 0 a
2) si scrive o legge nel registro INDFx. Invece scrivendo o leggendo in
POSTINCx il valore del puntatore FSRx viene successivamente incrementato di
1, scrivendo leggendo in POSTDECx viene decrementato, scrivendo leggendo in
PREINCx il valore viene incrementato prima. In sostanza il tuo ciclo di
ricezione potrebbe anche essere semplicemente:
MOVF    ShiftReg,W,1
MOVWF   POSTINC0,A
INCF    ByteCount,F,1
Naturalmente all'inizio andra' impostato in FSR0H:FSR0L l'indirizzo di
partenza dell'array. Il valore di ByteCount qui non entra piu' in gioco nel
calcolo dell'indirizzo, serve solo a sapere quanti bytes hai memorizzato.
Claudio F

 Siccome non e' possibile assegnare direttamente un valore a 16 bit
ho scritto una razzata... i 18F ho appena cominciato a guardarli anch'io...
c'e' l'istruzione apposita LFSR, quindi all'inizio basterebbe scrivere:
LFSR   FSR0,RS232
Claudio F

 ha scritto nel messaggio
news:ZB08c.114247$O31.4...@news4.tin.it...
