Vai al contenuto
PLC Forum


Ma La Eeprom Interna Del Pic 16f84 Non Dovrebbe Essere Non Volatile?


larks

Messaggi consigliati

Ciao ragazzi ho bisogno di fare questo algoritmo: (scusate la lunghezza ma è solo dimostrativo)

PROCESSOR 16F84 ;definisce il tipo di chip usato

RADIX DEC ;i numeri senza notazione si intendono decimali

INCLUDE "P16F84.INC" ;include nel sorgente il file relativo al chip usato

__CONFIG 3FF3H ;configura i fuses

ORG 0CH ; scrittura var

;------------------------------------------------------------

; cpu equates (memory map)

status equ 0x03

portb equ 0x06

eedata equ 0x08

eeadr equ 0x09

address equ 0x0c

byte equ 0x0d

trisb equ 0x86

eecon1 equ 0x88

eecon2 equ 0x89

;------------------------------------------------------------

; bit equates

rd equ 0

wr equ 1

wren equ 2

rp0 equ 5

;------------------------------------------------------------

ORG 00H ; inizio programma

bsf STATUS,RP0 ;seleziona il banco1 di memoria

movlw 00011111B ;configura le linee di I/O RA

movwf TRISA

movlw 11000000B ;configura le linee di I/O RB

movwf TRISB

bcf STATUS,RP0 ;seleziona il banco0 di memoria

movlw 0

movwf PORTB

start:

call read ;read test byte from data EEPROM

movwf portb ;display test byte via LEDs

; testedit:

; btfss PORTB,7 ;leggi lo stato degli ingressi e se si desidera andare in edit salta se viene premuto

; goto testedit

store:

movlw 0x0f ;test data

movwf byte

movlw 0x00 ;test address

movwf address

call write ;write test byte to data EEPROM

bsf status,rp0 ;to bank 1

wrcompl

btfsc eecon1,wr ;test write complete?

goto wrcompl

bcf status,rp0 ;back to bank 0

goto start

;------------------------------------------------------------

read movf address,w ;get address

movwf eeadr ;address to register

bsf status,rp0 ;bank 1

bsf eecon1,rd ;read data EEPROM (RD bit will

; be cleared in hardware)

bcf status,rp0 ;return to bank 0

movf eedata,w ;data into W

return ;return with data in W

;------------------------------------------------------------

write movf address,w ;get address

movwf eeadr ;address to register

movf byte,w ;get data

movwf eedata ;data to register

bsf status,rp0 ;to bank 1

bsf eecon1,wren ;enable write

movlw 0x55 ;define 0x55 (per data book)

movwf eecon2 ;to register

movlw 0xaa ;define 0xaa (per data book)

movwf eecon2 ;to register

bsf eecon1,wr ;set WR bit to trigger write

bcf eecon1,wren ;disable write (won't effect

; this one)

bcf status,rp0 ;back to bank 0

return

END ;fine programma

all'inizio legge un dato nella eeprom (ind 0), poi quando viene spinto RB7 in pratica prende un dato da memorizzare (byte) e lo scrive nella eeprom interna (val=3) , poi al giro dopo lo visualizza leggendolo appunto, e in effetti funziona, il problema è che quando stacco l'alimentazione e la riattacco il dato memorizzato non c'è +, cioè non mi viene visualizzato subito come dovrebbe. Ma non dovrebbe essere non volatile? Sbaglio qualcosa? Magari c'è da settare qlc per renderla permanente?.Vi prego aiutatemi. Grazie in anticipo.

Link al commento
Condividi su altri siti


?_? Ma se non sto prendendo un granchio nella EEPROM, su quel processore salvi solo il programma; la memoria interna che usi è una Ram. Disalimentando il processore, chiaramente il programma resta, ma la ram si volatilizza, con tutti i suoi dati! Per fare quello che dici potresti archiviare il dato su una EEPROM esterna tipo le 27C, in IIC bus.

Link al commento
Condividi su altri siti

Attento alla scrittura, il pic impiega unn po' per farla, per scrivere nuovamente devi attendere che wr sia riportato a 0...Ti giro una rout che avevo scritto io

;Prova di scrittura della EEPROM

processor 16f628

LIST P=16F628, f=INHX8M

#include p16f628.inc

__config h'3f6d'

org 0x0

goto ii

org 0x10

ii: clrwdt

movlw 0x80

movwf 0x21

bsf STATUS,RP0 ;seleziono banco 1

movlw 0x00 ;indirizzo base eeprom

movwf EEADR ;

bcf STATUS,RP0

movlw 0x00 ;inizializzazione locazione 20 che

movwf 0x20 ;sarà scritta in eeprom

i: movf 0x20,0 ;metto il dato da scrivere da 20 in w

bsf STATUS,RP0 ;seleziono banco 1

bsf EECON1,WREN ;abilito scrittura

movwf EEDATA ;carico il dato da scrivere

bcf INTCON,GIE ;disabilito int

movlw 0x55 ;

movwf EECON2 ;procedura da fare sempre per scrivere

movlw 0aah ;in eeprom

movwf EECON2 ;

bsf EECON1,WR ;comando scrivi,wr sarà messo a 0 al termine

;della scrittura

bsf INTCON,GIE ;riabilito int

bcf EECON1,WREN ;disabilito scrittura

btfsc EECON1,WR ;attesa che la scrittura sia completata

goto $-1 ;(WR riportato a 0)

incf EEADR ;incremento l'indirizzo

bcf STATUS,RP0 ;riseleziono banco 0

clrwdt

incf 0x20

decf 0x21

skpz ;controllo se ho scritto 128 locazioni

goto i ;se vero salto istruzione dopo

s: nop

clrwdt

goto s

end

Link al commento
Condividi su altri siti

Grazie mille andry per la rout in effetti mi serviva proprio, ma comunque è vero che la eeprom interna ovvero che renda permanenti le modifiche è solo per la parte di programma? Quindi se voglio salvare dei dati in modo permanente devo per forza interfacciargli una eeprom esterna?

Link al commento
Condividi su altri siti

Quindi se voglio salvare dei dati in modo permanente devo per forza interfacciargli una eeprom esterna?
Link al commento
Condividi su altri siti

Il pic16f84 ha 64 byte di eeprom, garantisce 1.000.000 di cicli lettura scrittura e ritenzione dati di 40 anni.

A mio parere la logica del pulsante su RB7 è meglio invertirla (pull-up, che va a zero quando premuto) altrimenti all'accensione si corre il rischio di riscrivere la eeprom con un dato casuale contenuto in address.

In tal caso naturalmente la riga di test diventa:

testedit:

btfsc PORTB,7 ;leggi lo stato degli ingressi e se si desidera andare in edit salta se viene premuto

goto testedit

Ciao

Link al commento
Condividi su altri siti

Funzionaaaaaaaaaaaaaaa grande amici sono al settimo cielo mi sa che quella storia del bit tenuto a zero mi andava proprio a compromettere il prog. QUINDI ANCHE IL PIC 16F84 HA MEMORIA NON VOLATILE (testato personalmente cavando l'alimentazione).GRAZIE A TUTTI SIETE GRANDI.

Link al commento
Condividi su altri siti

Buono a sapersi!

Visto che qui ci sn tanti esperti (io posto nella sezione Tv e Monitor e qui seguo poco) chiedo anch'io una consulenza!

Io ho il programmatore PicStart Plus, comprato originale con i suoi cd e tutto il resto. Funzionava egregiamente su un Pentium 60 con sistema operativo Win 98.

Come mai che ora su questo AMD, con Win 2K, succede che quando vado a programmare un PIC16F84, anche nuovo, ricevo una sfilza di errori e dove per esempio dovrebbe scrivere FFFF scrive FF3F, fallendo quindi la programmazione e la relativa verifica? Qualcuno sa consigliarmi? Mi spiace dovere gettare via tutto :(

Link al commento
Condividi su altri siti

Ciao Randy76, ma la comunicazione se la fai in seriale, con che baudrate la effettui, potrebbe essere un problema di velocità, prova ad abbassarla.

Ciao

Link al commento
Condividi su altri siti

Dovrebbe essere lo standard 9600.. hai per caso le impostazioni della porta seriale, baud rate, parità, ecc ecc da impostare nel pannello di controllo, per essere certo che sia compatibile con il mio picstart plus?

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...