Tutorials - PIC 

 

PIC16F526


Flash dati

L'area della Flash dati è accessibile in lettura e scrittura durante lo svolgimento del programma. Non fa parte della mappa di memoria indirizzabile direttamente, ma deve essere indirizzata indirettamente.
Le operazioni di lettura della flash dati si svolgono in un normale ciclo istruzione, mentre la scrittura richiede un tempo maggiore (2-5 ms).
La Flash dati consente un numero elevato di operazioni di scrittura (1M di volte mediamente), ma se la temperatura di lavoro è elevata il numero si riduce rapidamente (10 volte meno se >85°C).

Le operazioni si basano su tre registri dedicati, che si trovano nel Banco1 della RAM:

  • EECON  : questo registro contiene i bit di controllo delle operazioni sulla flash dati 
  • EEDATA : questo registro contiene il dato in lettura o scrittura
  • EEADR : questo registro è un puntatore che contiene l' indirizzo della locazione su cui operare

Il foglio dati non fa parola della struttura del registro di controllo, che dovrebbe essere questa:

EECON

bit

7 6 5 4 3 2 1 0

nome

-

-

-

FREE

WRERR

WREN

WR

RD

funzione

R/W R/W R/W R/W R/W R/W R/W R/W

default

- - - 0 x 0 0 0
  • bit 7:5   non utilizzati 
                 in lettura  : 0
                 in scrittura: nessun effetto

  • bit 4  FREE : forza la cancellazione di una riga
                1 = abilita cancellazione
                0 = lettura

  • bit 3  WRERR 1 = scrittura terminata in modo errato (MCLR, WDT, ecc)
                 0 = nessun errore

  • bit 2  WREN 1 = abilita scrittura
                0 = impedisce la scrittura

  • bit 1  WR   1 = avvia una scrittura
                0 =
    scrittura completata

  • bit 0  RD   1 = avvia una lettura
                0 =
    lettura completata

I bit di comando FREE, WREN, WR e RD sono riportati a 0 in hardware una volta eseguita l' operazione o se le sequenze di accesso non sono eseguite in modo corretto (vedi esempi successivi).

Il foglio dati è avaro di informazioni sulla gestione della Flash dati, che ,per sua definizione, non è la classica EEPROM integrata negli altri PIC non Baseline. In particolare:

  • non ci sono indicazioni sulla funzionalità del bit WRERR
  • non viene considerata negli esempi forniti la rilettura dei flag WR/RD per verificare la conclusione dell' operazione

Vediamo comunque quanto suggerito per la scrittura e la lettura della Flash dati.


Lettura della Flash dati.

Per leggere una locazione di memoria flash dati l'utente deve: 

  • Scrivere nel registro EEADR l' indirizzo della locazione voluta
  • Impostare il bit RD del registro EECON. Questa operazione fa si che il contenuto della cella puntata da EEADR sia trasferito nel registro EEDATA
  • Leggere il contenuto della locazione voluta nel registro EEDATA

L'esecuzione del programma è sospesa mentre il ciclo di lettura è in corso. Ecco un esempio di codice:

   BANKSEL EEADDR          ; banco 1
   movf    EE_ADDR, W      ; w = indirizzo da leggere
   movwf   EEADR           ; al puntatore
   bsf     EECON, RD       ; legge contenuto flash dati
   movf    EEDATA, W       ; W = contenuto dell' indirizzo puntato

Il foglio dati specifica che la chiave per la lettura è l' istruzione  bsf EECON,RD e che altre sequenze di istruzioni non sono accettate. 


Scrittura della Flash dati.

L' operazione di scrittura è leggermente più complessa. La memoria flash dati è organizzata in una matrice di 8 file di 8 bytes ciascuna.  Occorre cancellare le celle prima di scriverle: viene cancellata una riga alla volta e scritta un byte alla volta. Occorre cancellare tutta una riga anche solo per scrivere una locazione.
In generale, la procedura per scrivere un byte di dati è:

  1. Individuare la riga che contiene l'indirizzo dove il byte verrà scritto.
  2. Se ci sono altre informazioni in quella riga che devono essere salvate, copiare i byte della riga dalla flash dati alla RAM
  3. Eseguire una cancellazione di riga della riga 
  4. Scrivere il nuovo byte di dati e i byte salvati negli indirizzi appropriati della Flash dati

Per prevenire la corruzione accidentale della Flash dati, è implementato un sistema di protezione che richiede una sequenza di sblocco da avviare ogni volta si cancelli o scriva nella Flash.

Per cancellare una riga, occorre effettuare le seguenti operazioni:

  1. Caricare in EEADR un indirizzo della riga che deve essere cancellata.
  2. Impostare a 1 il bit FREE del registro EECON
  3. Impostare a 1 il bit WREN di EECON per consentire l'accesso in scrittura
  4. Impostare a 1 il bit WR di EECON per avviare il ciclo di cancellazione.

Eseguita la fase 4, il ciclo di cancellazione richiede un certo tempo (da 2 a 4 ms), durante il quale il processore resterà fermo in attesa della conclusione dell'operazione sulla Flash prima di riprendere l'esecuzione del programma.
Ecco un esempio di codice:

   BANKSEL EEADDR          ; banco 1
   movf    EE_ADDR, W      ; w = indirizzo da cancellare
   movwf   EEADR           ; al puntatore
   bsf     EECON, FREE     ; chiave di abilitazione
 
  bsf     EECON, WREN     ;  
   bsf     EECON, WR       ; attesa cancellazione

La chiave per la cancellazione è data dalla sequenza delle istruzioni.
Se il bit WREN non è impostato nel ciclo di istruzione dopo il bit FREE, questo verrà cancellato in hardware, impedendo l' operazione.
Se il bit WR non viene impostato nel ciclo di istruzioni dopo WREN, questo verrà cancellato in hardware, impedendo l' operazione.

Una volta che una cella è cancellata, nuovi dati possono essere scritti. 
La sequenza seguente deve essere eseguita per un singolo byte da scrivere:

  1. Caricare EEADR con l'indirizzo.
  2. Caricare EEDATA con i dati da scrivere.
  3. Impostare il bit WREN per consentire l'accesso in scrittura alla Flash.
  4. Impostare il bit WR per avviare il ciclo di scrittura .

Eseguita la fase 4, l' esecuzione del programma è sospesa in attesa della fine del ciclo di scrittura, che richiede dai 2 a 5ms per completarsi.

Ecco un esempio di codice:

   BANKSEL EEADDR          ; banco 1
   movf    EE_ADDR, W      ; w = indirizzo da scrivere
   movwf   EEADR           ; al puntatore
  
movf    EE_DATA, W      ; w = dato da scrivere 
   movwf   EEDATA          ; al puntatore
   bsf     EECON, WREN     ;  
   bsf     EECON, WR       ; attesa scrittura

La chiave per la scritura è data dalla sequenza delle istruzioni:
- si può utilizzare solamente la sequenza di bsf indicata
- se il bit WR non viene impostato nel ciclo di istruzioni dopo che il bit 'WREN è impostato, questo verrà cancellata in hardware, impedendo l' operazione.

Una volta effettuata una scrittura, è buona norma verificare che il dato sia stato correttamente scritto.

Ecco un esempio di codice, da accodare la precedente:

   movf    EEDTA  , W      ; l'indirizzo è quello
                           ; della precedente scrittura

   bsf     EECON, RD       ; lettura
  
xorw    EEDATA, W       ; comparazione con XOR 
   movwf   EEDATA          ; al puntatore
   btfss   STATUS, Z       ; se uguali, salta istruzione successiva
   goto    EEWRERR         ; se no gestisci l' errore

L' abilitazione della protezione del codice da rilettura con _CP_ON in CONFIG non ha effetto sulla Flash dati.
Per ottenere la protezione di questa area occorre agire sul bit _CPDF.


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 18/10/13.