Pagina 1 di 2

Assegnazione valori in celle sequenziali

MessaggioInviato: 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

MessaggioInviato: 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

MessaggioInviato: 18 dic 2014, 18:15
da mros
esattamente il PIC16F677.


mille grazie

Re: Assegnazione valori in celle sequenziali

MessaggioInviato: 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

MessaggioInviato: 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

MessaggioInviato: 19 dic 2014, 14:39
da mros
ancora grazie per la dritta......ho capito dove ho sbagliato

Re: Assegnazione valori in celle sequenziali

MessaggioInviato: 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

MessaggioInviato: 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

MessaggioInviato: 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

MessaggioInviato: 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.