Vai al contenuto
PLC Forum


Incremento Indirizzo Registri 16f84 - 16f84


Messaggi consigliati

Inserito:

Ciao,

sono nuovo del forum,

il mio problema è che non riesco a scrivere un programma che faccia questa cosa che vi spiegherò adesso....

io eseguo dei calcoli matematici..... oppure incremento di uno un numero es: 0x0c

e voglio che il risultato diventi l'indirizzo di un registro...

come posso fare?


Inserita:

Ciao e benvenuto nel forum,

Devi usare due registri speciali che sono FSR e INDF.

Per esempio se vuoi leggere il contenuto del registro con indirizzo 0X0C devi scrivere

MOVLW 0X0C

MOVWF FSR

MOVF INDF,W

alla fine in W avrai il contenuto della locazione di memoria 0X0C

Se invece vuoi scrivere nella locazione devi fare cosi

MOVLW 0X0C

MOVWF FSR

MOVLW 0X00 ( scriviamo il numero 0 )

MOVWF INDF

Alla fine nella locazione 0X0C ci sara' il valore 00

Inserita:

Non ci siamo capiti....

mettiamo di avere... questo pezzo di programma così come lo scritto funziona?

MEMORIZZAZIONI EQU 0X2F

MEMADDRESS EQU 0X2E

INIT1

MOVLW 0X0B

MOVWF MEMORIZZAZIONI

MOVLW 0X0B

MOVWF MEMADDRESS

INIT2

DECFSZ MEMORIZZAZIONI

GOTO MAIN

GOTO RESET

MAIN

INCF MEMADDRESS

MOVLW PORTB

MOVWF MEMADDRESS

GOTO INIT2

Inserita:


MEMORIZZAZIONI EQU 0X2F
MEMADDRESS EQU 0X2E


INIT1
    MOVLW 0X0B                       ; carichi in w 0b
    MOVWF MEMORIZZAZIONI    ; carichi 0b all'indirizzo 2f
    MOVLW 0X0B                       ; carichi in w 0b
    MOVWF MEMADDRESS          ; carichi 0b  all'indirizzo 2e

INIT2
    DECFSZ MEMORIZZAZIONI,F; decrementi il contenuto dell'indirizzo 2f 
    GOTO MAIN
    GOTO RESET

MAIN
    INCF MEMADDRESS,F
    MOVLW PORTB
    MOVWF MEMADDRESS
    GOTO INIT2


RESET

Cosi il programma funziona... ma non so che cosa devi fare .

Nel tuo programma definendo le due costanti

MEMORIZZAZIONI EQU 0X2F

MEMADDRESS EQU 0X2E

non fai altro che associare ad un nome un numero..

Quindi il tuo programma fara' le operazioni su due locazioni di memoria 2e 2f

Con questa operazione

MOVLW PORTB

MOVWF MEMADDRESS

carichi nella locazione 2e il valore 06.....

Non so perche'

Prova a spiegare bene cosa vuoi fare cosi ti posso aiutare

Inserita:

lo scopo di quel programma sarebbe

memorizzare il conetenuto di portb partendo dall'indirizzo 0x0c per 10 volte quindi

la prima volta scrivo il contenuto di portb in 0x0c poi in 0x0d e vi dicendo....

Inserita:

Questa e' la routine che ti serve naturalmente tralascio la parte di configurazione , gli include ecc..

INIZIOMEM    EQU    0x0C               ; indirizzo di inizio della tuo banco di memoria
CONTA          EQU    0X20               ; variabile locale per il conteggio del loop




                MOVLW    .10                  ;  carico 10 in W
                MOVWF    CONTA            ; carico W in CONTA = 10
                MOVLW    INIZIOMEM      ; carico l'indirizzo di inizio memoria
                MOVWF    FSR                 ; nel registro FSR , che e' il puntatore alla memoria
LOOP
                MOVF        PORTB,W        ; carico il contenuto della porta B in W
                MOVWF     INDF               ; trasferisco W nella locazione di memoria puntata da FSR
                                                      ; quindi nel primo loop sara' 0x0C
                INCF         FSR,F              ; incremento il puntatore , esempio passera' a 0x0D
                DECFSZ    CONTA            ; decremento CONTA e salto se 0
                GOTO        LOOP              ; se non zero allora torno a fare il loop

Come puoi vedere io ho usato i due registri speciali che ti avevo detto nella mia prima risposta .

Questa routine fa come dici :

Carica il valore della porta b e lo scrive in registri seccessivi da 0X0C a 0X16

Spero di essere stato chiaro , se hai dubbi ... solo chiedere

Inserita:

cacchio!! troppo semplice!! e io che ci ho perso un settimana per trovare un metodo.... :D

comunque ho un dubbio o meglio una domanda da porti...

cosa sta a significare F

incf FSR,F

non riesco a capire cosa serva....

ciao

Inserita:

I due registri indf e FSR lavorano come i puntaturi di una posizione di memoria.

Nel nostro programma vogliamo scrivere nella posizione 0X0C

Allora carichiamo in FSR il Valore 0X0C e quindi diciamo al pic che vogliamo puntare a questa posizione di mem.

Per leggere quella posizione usiamo INDF che conterra' il falore della posizione scritta in FSR.

Non hai altra soluzione perche' se usi una EQU come nel tuo pergramma , in verita' stai scrivendo in una posizione fissa che e' il valore che hai assegnato tu.

Ricorda che solo questi due registri hanno questa funzione particolare...

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...