Pagina 1 di 2
Assegnazione valori in celle sequenziali

Inviato:
18 dic 2014, 16:01
da mros
Salve a tutti
esiste un modo, in assembler, per azzerare il contenuto delle "variabili" utilizzando un ciclo anzichè azzerare singola variabile?
questa è l'operazione che oggi faccio:
CLRF var1
CLRF var1+1
--------------
CLRF var1+n
grazie
Re: Assegnazione valori in celle sequenziali

Inviato:
18 dic 2014, 17:17
da c1b8
Sarebbe molto utile sapere quale micro stai utilizzando, nell'ipotesi sia un PIC 16F la cosa è molto semplice.
L'esempio che segue pulisce 20 locazioni di memoria a partire dalla posizione della var1, si utilizza una variabile in memoria per il conteggio del loop da effettuare (loop_count):
- Codice: Seleziona tutto
movlw 20
movwf loop_count
movlw var1
movwf FSR
next: clrf INDF
incf FSR
decfsz loop_count,F
goto next
Re: Assegnazione valori in celle sequenziali

Inviato:
18 dic 2014, 18:15
da mros
esattamente il PIC16F677.
mille grazie
Re: Assegnazione valori in celle sequenziali

Inviato:
19 dic 2014, 13:29
da mros
Pertanto......volendo registrare nella eeprom interna di un PIC 16F677 - 90 valori partendo dall'indirizzo x00 e utilizzando il codice che hai condiviso, questa funzione dovrebbe andar bene:
- Codice: Seleziona tutto
REG_EE
CLRF PARC
MOVLW 90 ;AZZERO 90 VARIABILI
MOVWF loop_count
MOVLW T0
MOVWF FSR
next2
Bank2
MOVLW INDF
MOVWF EEDATA
INCF FSR,1
Bank0
MOVF PARC,W
INCF PARC,F
Bank2
MOVWF EEADR
CALL SCRIVI
Bank0
DECFSZ loop_count,F
GOTO next2
RETURN
giusto??

Re: Assegnazione valori in celle sequenziali

Inviato:
19 dic 2014, 13:50
da c1b8
Se lo scopo è quello di leggere 90 valori a partire dalla variabile T0 e scriverli nella EEPROM a partire dall'indirizzo 0, direi che ci sei quasi ma c'è un piccolo errore:
- Codice: Seleziona tutto
MOVLW INDF
questa istruzione non legge il contenuto della T0 (e successivamente delle altre locazioni di RAM), ma legge l'indirizzo del registro INDF.... dovrebbe essere:
- Codice: Seleziona tutto
MOVW INDF, W
Se lo scopo è altro allora...
Re: Assegnazione valori in celle sequenziali

Inviato:
19 dic 2014, 14:39
da mros
ancora grazie per la dritta......ho capito dove ho sbagliato
Re: Assegnazione valori in celle sequenziali

Inviato:
23 dic 2014, 12:06
da mros
Ciao, purtroppo il micro quando esegue il seguente codice si blocca......
- Codice: Seleziona tutto
MOVLW 92 ;AZZERO 92 VARIABILI
MOVWF loop_count
MOVLW T0
MOVWF FSR
next
CLRF INDF
INCF FSR,1
DECFSZ loop_count,F
GOTO next
dove sbaglio??
Re: Assegnazione valori in celle sequenziali

Inviato:
23 dic 2014, 12:43
da c1b8
Difficile a dirsi dove possa essere il problema.
Alcune domande:
1) In quale banco di memoria si trova l'area di 92 byte da azzerare ed in quale banco la variabile loop_count che serve al controllo del loop?
2) loop_count è prima o dopo i 92 byte da azzerare?
Ipotesi possibile: con il codice che riporti loop_count e l'area di 92 byte devono essere nello stesso banco di memoria, e per il 16F677 che stai utilizzando, devono stare nel banco 0. Nello stesso banco possono stare solo altri 3 byte. Se così non fosse allora il loop è imprevedibile.
Altra possibilità: hai definito la loop_count e l'area di 92 byte nel banco 0, ma la loop_count è dopo l'area di 92 byte e questa è in realtà non riservata correttamente. In questo caso il tuo loop cancella la loop_count portandoti ad un loop imprevedibile.
Re: Assegnazione valori in celle sequenziali

Inviato:
23 dic 2014, 14:28
da mros
Grazie Fabio, effettivamente ho commesso l'errore che dicevi:
- Codice: Seleziona tutto
cblock 0x20
Count:3 ;PER IL RITARDO
PARC
T0:2
T1:2
T2:2
T3:2
T4:2
T5:2
T6:2
T7:2
T8:2
T9:2
T10:2
T11:2
T12:2
T13:2
T14:2
T15:2
T16:2
T17:2
T18:2
T19:2
T20:2
T21:2
T22:2
T23:2
T24:2
T25:2
T26:2
T27:2
T28:2
T29:2
T30:2
T31:2
T32:2
T33:2
T34:2
T35:2
T36:2
T37:2
T38:2
T39:2
T40:2
T41:2
T42:2
T43:2
T44:2
T45:2
loop_count
RIF:2
ENDC
a questo punto però ne approfitto ....... la memoria interna del pic16f677 è di 128 byte e io ne ho riservato meno...perché allora mi crea casini??
comunque grazie sei un grande
Re: Assegnazione valori in celle sequenziali

Inviato:
23 dic 2014, 14:32
da mros
.....ho ri-letto il datasheet e adesso mi è chiaro.....il problema è che ho solo 96 byte sul banco 0.