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
Assegnazione valori in celle sequenziali
Moderatore:
Paolino
13 messaggi
• Pagina 1 di 2 • 1, 2
3
voti
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):
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
Fabio
0
voti
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:
giusto??
- 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??

1
voti
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:
questa istruzione non legge il contenuto della T0 (e successivamente delle altre locazioni di RAM), ma legge l'indirizzo del registro INDF.... dovrebbe essere:
Se lo scopo è altro allora...
- 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...
Fabio
0
voti
Ciao, purtroppo il micro quando esegue il seguente codice si blocca......
dove sbaglio??
- 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??
1
voti
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.
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.
Fabio
1
voti
Grazie Fabio, effettivamente ho commesso l'errore che dicevi:
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
- 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
13 messaggi
• Pagina 1 di 2 • 1, 2
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 6 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


