Omar2 Inserito: 6 febbraio 2004 Segnala Inserito: 6 febbraio 2004 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: 0x0ce voglio che il risultato diventi l'indirizzo di un registro...come posso fare?
dlgcom Inserita: 6 febbraio 2004 Segnala Inserita: 6 febbraio 2004 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 scrivereMOVLW 0X0CMOVWF FSRMOVF INDF,Walla fine in W avrai il contenuto della locazione di memoria 0X0CSe invece vuoi scrivere nella locazione devi fare cosiMOVLW 0X0CMOVWF FSRMOVLW 0X00 ( scriviamo il numero 0 )MOVWF INDFAlla fine nella locazione 0X0C ci sara' il valore 00
Omar2 Inserita: 6 febbraio 2004 Autore Segnala Inserita: 6 febbraio 2004 Non ci siamo capiti....mettiamo di avere... questo pezzo di programma così come lo scritto funziona?MEMORIZZAZIONI EQU 0X2FMEMADDRESS EQU 0X2EINIT1 MOVLW 0X0B MOVWF MEMORIZZAZIONI MOVLW 0X0B MOVWF MEMADDRESSINIT2 DECFSZ MEMORIZZAZIONI GOTO MAIN GOTO RESETMAIN INCF MEMADDRESS MOVLW PORTB MOVWF MEMADDRESS GOTO INIT2
dlgcom Inserita: 7 febbraio 2004 Segnala Inserita: 7 febbraio 2004 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 costantiMEMORIZZAZIONI EQU 0X2FMEMADDRESS EQU 0X2Enon 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 PORTBMOVWF MEMADDRESScarichi nella locazione 2e il valore 06.....Non so perche'Prova a spiegare bene cosa vuoi fare cosi ti posso aiutare
Omar2 Inserita: 7 febbraio 2004 Autore Segnala Inserita: 7 febbraio 2004 lo scopo di quel programma sarebbememorizzare il conetenuto di portb partendo dall'indirizzo 0x0c per 10 volte quindila prima volta scrivo il contenuto di portb in 0x0c poi in 0x0d e vi dicendo....
dlgcom Inserita: 7 febbraio 2004 Segnala Inserita: 7 febbraio 2004 Ti preparo una piccola routine poi la posto qui...
dlgcom Inserita: 7 febbraio 2004 Segnala Inserita: 7 febbraio 2004 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 loopCome 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 0X16Spero di essere stato chiaro , se hai dubbi ... solo chiedere
Omar2 Inserita: 7 febbraio 2004 Autore Segnala Inserita: 7 febbraio 2004 cacchio!! troppo semplice!! e io che ci ho perso un settimana per trovare un metodo.... comunque ho un dubbio o meglio una domanda da porti...cosa sta a significare Fincf FSR,Fnon riesco a capire cosa serva....ciao
Omar2 Inserita: 7 febbraio 2004 Autore Segnala Inserita: 7 febbraio 2004 Anche la funziona indf non l'ho capita bene!
dlgcom Inserita: 7 febbraio 2004 Segnala Inserita: 7 febbraio 2004 I due registri indf e FSR lavorano come i puntaturi di una posizione di memoria.Nel nostro programma vogliamo scrivere nella posizione 0X0CAllora 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...
Omar2 Inserita: 7 febbraio 2004 Autore Segnala Inserita: 7 febbraio 2004 GRAZIE MILLE MI SEI STATO MOLTO D'AIUTOCIAO
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora