home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


Pic16F1618346 - NVMREG WRITE TO EEPROM
     
Autore Messaggio opzioni
agric





postato il:
23.03.2019, alle ore 03:06

if(!MemWrite)
{
NVMCON1.NVMREGS=1; //Seleziono EEprom
NVMCON1.WREN=1; //Abilito scrittura
INTCON.GIE=0; //Disabilito interrupts
NVMCON2=0x55; //Procedura unlock
NVMCON2=0xaa; //Procedura unlock
NVMADRH=0x70; //Specifico indirizzo
NVMADRL=0x00;
NVMDAT=SavedAttn; //Scrivo dati
NVMCON1.WR=1; //Attivo scrittura
MemWrite=1; //Memoria scrittura attivata
INTCON.GIE=1; //Abilito interrupts


L'interrupt viene DISABILITATO prima della procedura unlock.
e riabilitato dopo la scrittura

Ciò che vedo di DIVERSO dal flowchart nei datasheet è di aver specificato l'indirizzo dopo la procedura UNLOCK

quello che effettivamente non capisco è se l'interrupt deve rimanere disattivato fino a scrittura terminata (circa 2 mS) verificando il flag specifico



meglio essere un granello di pepe che una cacca d'asino
Ottavo





postato il:
23.03.2019, alle ore 07:47
Ciao a tutti e grazie per la collaborazione.

Per quanto riguarda il GIE, ho seguito le indicazioni riassunte nell'esempio 10-2

di pagina 123.

Al momento non ricordo più dove, ma da qualche parte nel documento è riportato che la conclusione della procedura di scrittura è da considerarsi tale, quando il bit NVMCON1.WR ritorna a zero e a ciò pensa l'hardware, così come avviene per il bit di lettura.

Fin qui sembra che tutto sia conforme a quanto indicato nel ds.

L'unica difformità consiste, come correttamente fattomi notare da agric, nella dichiarazione dell'indirizzo.

Con altri pic non ho mai avuto problemi di sorta, anche perché facevo uso delle funzioni di libreria, ma con questo PIC mi trovo in una situazione un po' anomala.

Non posso usare MPLAB perché nella versione che ho, ottimizza poco e male la memoria che invece a me serve fino all'ultimo bit, altrimenti non avrei scelto un pic con 28k di program flash memory.



detesto citazioni, massime e aforismi nella firma
Ottavo





postato il:
23.03.2019, alle ore 08:02
Essendo un amatore, la versione migliore di MPLAB è per me un impegno economico non giustificabile.
Fra le varie possibilità ho trovato MikroC for pic che aveva un costo notevolmente inferiore e per di più - Una Tantum -
Rispetto all'abbonamento mensile di MPLAB che a quel tempo veniva offerto - ora non so se la politica è rimasta tale - sembrava un bel risparmio, così ho acquistato la licenza e anche la EasyPic7Pro.

Solo successivamente ho scoperto che con i PIC più recenti,
le librerie funzionano male o non funzionano per niente, anche quelle più stupide. Senza librerie, mi ritrovo a scrivere tutto...

Che fregatura!




detesto citazioni, massime e aforismi nella firma
picmicro675




una ogni 10 livelli


postato il:
23.03.2019, alle ore 08:33
agric:
[L'interrupt viene DISABILITATO prima della procedura unlock.
e riabilitato dopo la scrittura

Devo ammettere che ho avuto una terribile svista.
Ottavo:
Essendo un amatore, la versione migliore di MPLAB è per me un impegno economico non giustificabile.

Se cerchi qualcosa che funziona allora pensa al FOSS.
https://en.wikipedia.org/wiki/Free_and_open-source_software
Non è certo completo come quelli professionali, ma sono discreti e permettono di raggiungere lo scopo. Rimane sempre lo scoglio che i PIC non sono ben supportati da librerie come gli AVR.
Mi par evidente che la politica di Microchip e di mungere anche dalla parte del software. Tant'è vero che l'XC è basato su un compilatore open source, solo che hanno aggiunto alcune deviazioni per ciucciare dei soldi.
Come amatore, se vuoi spendere credo che la spesa minore sia con Boost, senza andare alla versione Pro, si ha un bel pacchetto a 69 USD.
http://www.sourceboost.com/Products/BoostC/Overview.html
Oppure potresti optare per SDCC. Lo trovo che gli manca qualcosa di documentazione, in particolare per i PIC.
Ottavo:
Solo successivamente ho scoperto che con i PIC più recenti,
le librerie funzionano male o non funzionano per niente


Direi che se non hai programmi con la benda all'occhio, allora è meglio che scegli gli AVR o altri micro, come gli Esperssif, che sono supportati da Arduino IDE e risolvi in ``tre balletti``.



Anno nuovo, forum nuovo.
Mi sa che lascio.
Ottavo





postato il:
23.03.2019, alle ore 09:04
Al momento non posso cambiare.
Ho già bruciato 500€ per compilatore e scheda di sviluppo e inoltre per questo progetto l'hardware è completo, già montato e funzionante. Mi è costato altri 200€.

MikroC for pic veniva incensato anche su ElettronicaIN; io l'avevo già comprato anni prima (2015) Ma i loro tutorial sono sempre al limite dell'inutilità o copiati di sana pianta dalla documentazione e poi tradotti.

inoltre ho una considerevole scorta di pic vari che supera i 100 pezzi.
Nonostante tutto, tra mille difficoltà sono sempre riuscito a raggiungere lo scopo.

Per quest'applicazione mi manca solo la scrittura di qualche word in EEprom o in Flash dove ancora c'è un po'di spazio.

Non posso abbandonare adesso...a costo di aggiungere quelle 4 righe in assembly.
Voglio capire perché non va e solo dopo magari brucio tutto o distruggo a mazzate.
Ma PRIMA voglio capire.

Comunque ho provato a scrivere l'indirizzo prima...ma nulla di fatto.
Il bit si azzera correttamente ma se spengo e riaccendo i dati non rimangono.



detesto citazioni, massime e aforismi nella firma
picmicro675




una ogni 10 livelli


postato il:
23.03.2019, alle ore 12:39
Capisco che l'investimento c'è stato e anche corposo.
Per questo caso, non so se conosci le possibilità di debug della scheda. Il micro è nuovo, non ho tanta conoscenza, ma penso che sia della famiglia ehnanced e quindi ha un fuse per attivare il debug a bordo. Visto il foglio dati dovrebbe essere il bit 13 della config2.

Per questo con MPLAB si dovrebbe ottenere le informazioni della situazione al punto che si possa mettere un breakpoint. Allora dovresti cercare di fermare dopo la scrittura e leggere il contenuto se è stato scritto ``sul serio``.
Infine potrebbe esserci qualcosa che determina di ricaricare la copia salvata quando si fa un riavvio (a caldo o a freddo). Oppure hai impostato la protezione dei dati che impediscono la scrittura. Vedi paragrafo 11.4 .
Writing to the EEPROM is accomplished by the
following steps:
1.
Set the NVMREGS and WREN bits of the
NVMCON1 register.
2.
Write the desired address (address +7000h) into
the NVMADRH:NVMADRL register pair
(Table 11-2).
3.
Perform the unlock sequence as described in
Section 11.4.2 “NVM Unlock Sequence”.

Allora la sequenza sono di pochi passi, ma va tenuto conto di sbloccare la NVM, dopo i primi due punti. Tenuto conto che all'indirizzo si deve aggiungere l'offset di 7000h.
Se stai scrivendo in flash, allora la descrizione è quella del paragrafo 11.4.5.
Sono cose che vanno lette e rilette per capire bene come si deve procedere, per evitarsi dei grattacapi.



Anno nuovo, forum nuovo.
Mi sa che lascio.
Ottavo





postato il:
23.03.2019, alle ore 14:02
Ti ringrazio per l'aiuto.
Si la EasyPic ha l'In-curcuit debugger oltre al programmer, non è il massimo ma funziona quasi decentemente.




detesto citazioni, massime e aforismi nella firma
rcc.roberto



[pagine pubblicate]

postato il:
23.03.2019, alle ore 14:40
Ottavo:
Che strazio, il forum mi va in sqlerror.
Ho risolto ma non riesco a pubblicare il codice o scrivere più di 2 righe


Questo succede quando utilizzi le virgolette (doppi apici), non usarli più.

mentre per i post vuoti, probabilmente, premi più volte l'invia, e magari non vedi subito il post vuoto perché il browser ci mette un po' ad aggiornarsi.
Ottavo





postato il:
23.03.2019, alle ore 14:44
Quindi devo scrivere in italiano correggiuto per poter pubblicare un messaggio?

         LocAdr=0;

        if(RqRead)                    //Richiesta lettura
          {
            switch(RStep)
             {
               // Leggo Byte alto
               case 0:  if(!MemRead)
                         {
                           NVMCON1.NVMREGS=1;        //Seleziono EEprom
                           NVMADRH=0x70;             //Specifico MSB indirizzo
                           NVMADRL=LocAdr;           //Specifico LSB indirizzo
                           NVMCON1.RD=1;             //Attivo lettura
                           MemRead=1;                //Setto memoria
                         }
                        if(MemRead &!NVMCON1.RD)
                         {
                           AppRd[1]=NVMDATL;         //Trasferisco dati letti
                           MemRead=0;                //Resetto memoria
                           RStep=1;
                          }
                        break;
               
               // Leggo Byte basso
               case 1:  if(!MemRead)
                         {
                           NVMCON1.NVMREGS=1;        //Seleziono EEprom
                           NVMADRH=0x70;             //Specifico MSB indirizzo
                           NVMADRL=LocAdr+1;         //Specifico LSB indirizzo
                           NVMCON1.RD=1;             //Attivo lettura
                           MemRead=1;                //Setto memoria
                         }
                        if(MemRead &!NVMCON1.RD)
                         {
                           AppRd[0]=NVMDATL;         //Trasferisco dati letti
                           MemRead=0;                //Resetto memoria
                           RStep=2;
                          }
                        break;
               
               case 2:  SavedAttn=AppRd[1]<<8;
                        SavedAttn=SavedAttn| AppRd[0];
                        MemReadOk=1;                 //Memoria lettura eseguita
                        RqRead=0;                    //Resetto richiesta lettura
                        RStep=0;
             }
          }

        if(RqWrite)                   //Richiesta scrittura
          {
           
           //Scompongo la word in due Bytes
           AppWr[0]=SavedAttn &0xff;
           AppWr[1]=SavedAttn>>8;

           switch(RStep)
             {
              // Scrivo Byte alto
              case 0:   if(!MemWrite)
                         {
                           MemWriteOk=0;
                           NVMCON1.NVMREGS=1;     //Seleziono EEprom
                           NVMDATL=AppWr[1];      //Scrivo MSB dati
                           NVMDATH=0;             //azzero LSB registro
                           NVMADRH=0x70;          //Specifico indirizzo
                           NVMADRL=LocAdr;        //Specifico indirizzo
                           INTCON.GIE=0;          //Disabilito interrupts
                           NVMCON1.WREN=1;        //Abilito scrittura
                           NVMCON2=0x55;          //Procedura unlock
                           NVMCON2=0xaa;          //Procedura unlock
                           NVMCON1.WR=1;          //Attivo scrittura
                           MemWrite=1;            //Memoria scrittura attivata
                         }
                        if(MemWrite&!NVMCON1.WR)
                         {
                          MemWrite=0;             //resetto Memoria scrittura
                          NVMCON1.WREN=0;         //disabilito scrittura
                          RStep=1;
                         }
                        break;
                        
              // Scrivo Byte basso
              case 1:   if(!MemWrite)
                         {
                           NVMCON1.NVMREGS=1;     //Seleziono EEprom
                           NVMDATL=AppWr[0];      //Scrivo LSB dati
                           NVMDATH=0;             //azzero LSB registro
                           NVMADRH=0x70;          //Specifico MSB indirizzo
                           NVMADRL=LocAdr+1;      //Specifico LSB indirizzo
                           INTCON.GIE=0;          //Disabilito interrupts
                           NVMCON1.WREN=1;        //Abilito scrittura
                           NVMCON2=0x55;          //Procedura unlock
                           NVMCON2=0xaa;          //Procedura unlock
                           NVMCON1.WR=1;          //Attivo scrittura
                           MemWrite=1;            //Memoria scrittura attivata
                         }
                        if(MemWrite&!NVMCON1.WR)
                         {
                          MemWrite=0;             //resetto Memoria scrittura
                          RStep=2;
                         }
                        break;

              case 2:  INTCON.GIE=1;              //Abilito interrupts
                       NVMCON1.WREN=0;
                       RqWrite=0;                 //Resetto richiesta scrittura
                       MemWrite=0;                //Resetto memoria scrittura
                       MemWriteOk=1;              //Memoria lettura eseguita
                       RStep=0;                   //disabilito scrittura                     
                       break;
             }
          } 





detesto citazioni, massime e aforismi nella firma
Ottavo





postato il:
23.03.2019, alle ore 14:46
In seguito lo sintetizzerò


detesto citazioni, massime e aforismi nella firma
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale