Newsgroup: it.hobby.radioamatori
Titolo: EEPROM PIC16F84

Ho scritto un programma per il pic 16F84 che tra le altre cose utilizza
l'EEPROM interna per dei dati. La lettura non ha alcun problema ma per la
scrittura è una tragedia. Ho seguito fedelmente quanto riportato anche sui
data(cambio banco, EECON1 con bit WREN settato,interrup disabilitati), ma
senza risultato. Visto al simulatore, tutto procede bene fino al punto in
cui si deve caricare 55h e AAh in EECON2. A questo punto non avviene nulla,
invece di avere il trasferimento da W a EECON2, quest'ultimo registro rimane
inesorabilmente a zero ed ovviamente non vi è scrittura. Ho provato a
simulare un programma scaricato da internet ed avviene la stessa cosa. Pare
che sia l'MPLAB IDE v.7.11 che utilizzo a impedire l'operazione. Non sembra
un solo problema di simulazione perché, caricato fisicamente il programma
nel chip, funziona tutto meno che la scrittura. Qualcuno sa svelare il
problema?
73, 3balle
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 scrittura è una tragedia.
[cut]
Ti consiglio di postare il problema su it.hobby.elettronica.digitale
Lì è  più probabile che ti possano consigliare al meglio.
73
                Antonio

... cmq, a parte il consiglio precedente, ho dato uno sguardo al
datasheet
del 16F84A. A pag. 13 si legge: 'EECON2 (not phisically implemented)'.
Ciò significa che EECON2 è solo un registro virtuale per cui ciò che
vi scrivi
non viene realmente memorizzato ma interpretato direttamente dalla
circuiteria
del uC. Questo probabilmente giustifica la mancata lettura dei valori
inviati a
EECON2 in fase di emulazione.
Per quanto concerne la scrittura in EEPROM, a pag. 16 vi è un esempio
(il 3-2)
che, si legge, deve essere riportato alla lettera nel proprio programma
per ogni
byte che si intende scrivere in EEPROM:
BSF STATUS, RP0 ; Bank 1
BCF INTCON, GIE ; Disable INTs.
BSF EECON1, WREN ; Enable Write
MOVLW 55h ;
MOVWF EECON2 ; Write 55h
MOVLW AAh ;
MOVWF EECON2 ; Write AAh
BSF EECON1,WR ; Set WR bit
; begin write
BSF INTCON, GIE ; Enable INTs.
Inoltre, nell'esempio 3-3 si raccomanda di testare l'avvenuta scrittura
del byte,
eventualmente replicandola in caso di mancato successo, aggiungo io:
BCF STATUS,RP0 ; Bank 0
: ; Any code
: ; can go here
MOVF EEDATA,W ; Must be in Bank 0
BSF STATUS,RP0 ; Bank 1
READ
BSF EECON1, RD ; YES, Read the
; value written
BCF STATUS, RP0 ; Bank 0
;
; Is the value written
; (in W reg) and
; read (in EEDATA)
; the same?
;
SUBWF EEDATA, W ;
BTFSS STATUS, Z ; Is difference 0?
GOTO WRITE_ERR ; NO, Write error
Di solito adopero i uC ST626x (vecchiotti ma non mi hanno mai dato
problemi),
ma appena possibile farò qualche test sui PIC.
73 rinnovati
                       Antonio


Grazie Antonio dei consigli. Mi rendo conto che forse il posto in cui ho
domandato non sia dei più adatti, ma ormai il confine tra l'uso di
determinate tecnologie si assottiglia. infatti a me serve per gestire un
transverter, apparecchio poco...digitale e molto radioamatoriale (HI !).
Si, sono al corrente che si tratta di un registro virtuale e proprio per
questo ho deciso alla fine di memorizzare comunque il programma per
verificare se era solo un problema di simulazione, ma purtroppo non è così.
Ora, con calma, ricontrollo il tutto, partendo dalla creazione del foglio di
lavoro.
Grazie ancora, se ne vengo a capo lo riporterò nel newsgroup affinché
qualcun altro non ripeta il mio sbaglio.
Grazie ancora


Come promesso faccio seguito al mio messaggio. Il problema l'ho risolto,
dopo aver visto su internetet di esse in buona compagnia (ma nessuno a
postato soluzioni al riguardo). Semplicemente il simulatore tiene conto, al
pari dell'hardware, che ci vuole tempo per scrivere in EEPROM (circa 10ms).
E' necessario implementare una microscopica routine che attende dal micro
l'avviso di avvenuta scrittura, leggendo l'apposito bit di EECON1. Fatto
questo la scrittura avviene regolarmente sia al simulatore che nella realtà.
Questo non toglie che nel registro virtuale EECON2 del simulatore comunque
non appare né 55h né tantomeno AAh.
