Queimar ciclos da EEPROM - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)2024-03-28T16:45:34Zhttps://labdegaragem.com/forum/topics/queimar-ciclos-da-eeprom?commentId=6223006%3AComment%3A875498&feed=yes&xn_auth=noEu me interesso por este assu…tag:labdegaragem.com,2021-10-09:6223006:Comment:8757122021-10-09T09:34:48.369ZAdemilton da Silva Leitehttps://labdegaragem.com/profile/AdemiltondaSilvaLeite
<p>Eu me interesso por este assunto porque faço a re-programação de rádios INTRACO que exige o conhecimento de memórias EPROM e E2PROM.</p>
<p>No meu fórum no CLUBE do HARDWARE há um post sobre um programa que faz a divisão de memória ou re-paginação delas para facilitar o uso do espaço disponível de acordo com sua capacidade e espaço de memórias disponíveis.</p>
<p></p>
<p>E sugiro visitarem meu BLOG no: …</p>
<p>Eu me interesso por este assunto porque faço a re-programação de rádios INTRACO que exige o conhecimento de memórias EPROM e E2PROM.</p>
<p>No meu fórum no CLUBE do HARDWARE há um post sobre um programa que faz a divisão de memória ou re-paginação delas para facilitar o uso do espaço disponível de acordo com sua capacidade e espaço de memórias disponíveis.</p>
<p></p>
<p>E sugiro visitarem meu BLOG no: <a rel="nofollow noopener" href="http://www.clubedohardware.com.br" target="_blank">www.clubedohardware.com.br</a></p>
<p></p>
<p>Ao entrar digite no campo BUSCA : INTRACO 7000</p>
<p></p>
<p>Vale lembrar que no FÓRUM há um vasto seguimento de assuntos e que para incluir todos eles, foi necessária a criação de 2 páginas que poderá passar despercebida caso o leitor ou visitante não se atente ao fato.</p>
<p></p>
<p>PU4ASL - 73</p> sim,
isso mesmo Antonel…tag:labdegaragem.com,2021-10-06:6223006:Comment:8754982021-10-06T03:54:01.991ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">sim,</span></p>
<p><span style="font-size: 12pt;"> isso mesmo Antoneli, vai ocorrer exatamente como vc descreveu.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Ou seja, o que conta é o <strong><em>número de vezes</em></strong> que vc chama o <strong><em>"put()"</em></strong>, desde que algum valor no objeto que vc está passando ao <em><strong>"put"</strong></em> seja diferente do valor que está armazenado na…</span></p>
<p><span style="font-size: 12pt;">sim,</span></p>
<p><span style="font-size: 12pt;"> isso mesmo Antoneli, vai ocorrer exatamente como vc descreveu.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Ou seja, o que conta é o <strong><em>número de vezes</em></strong> que vc chama o <strong><em>"put()"</em></strong>, desde que algum valor no objeto que vc está passando ao <em><strong>"put"</strong></em> seja diferente do valor que está armazenado na <em><strong>EEPROM</strong></em>.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> E não há no hardware do Processador (em mais de 35 anos nessa área, eu nunca vi), um contador dos ciclos de gravação já executados. Ou seja, caso vc queira saber quanto já "queimou" de ciclos de gravação, terá que fazer essa contagem por sua conta mesmo (e claro, vc tem que detectar que a cada chamada ao <strong><em>"put"</em></strong>, algum dado do "objeto passado" foi alterado, já que o próprio <strong><em>"put"</em></strong> não te informa se de fato ele efetivamente gravou). Mas lembre-se: vc terá que armazenar essa contagem em uma memória também não volátil, e o caminho mais óbvio é a própria <em><strong>EEPROM</strong></em>, ou seja, na estrutura de dados que vc gravar vc precisaria reservar um campo justamente para sempre armazenar a contagem de ciclos (algo que é incomum de se ver por aí, e aí também está <span style="text-decoration: underline;"><em>um dos</em></span> empecilhos pra que encontremos algo semelhante implementado no próprio Hardware de um Processador).</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> E note que alguns Processadores tem uma <strong><em>EEPROM</em> </strong><span style="text-decoration: underline;"><em>emulada</em></span> através de <em><strong>Flash</strong></em>, caso por exemplo do <em><strong>ESP8266</strong></em>. Assim a contagem máxima de ciclos depende desta Flash (chip separado do ESP), é um <strong><em>parâmetro de fábrica</em></strong> do chip de Memória. E no caso do <em><strong>ESP8266</strong></em>, quem manda na <em><strong>contagem de ciclos</strong></em> é o <strong><em>"commit"</em></strong>, pois é esta função que de fato grava na <em><strong>Flash</strong></em> (o <em><strong>"put"</strong></em> apenas coloca os dados a serem gravados em um Vetor que foi reservado quando vc criou o <em><strong>"objeto EEPROM"</strong></em>).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Outra observação interessante, é que uma <strong><em>Flash</em> </strong>é na verdade um "tipo" de <em><strong>EEPROM</strong></em>, porém menos robusta. Explicando: o <em><strong>Transistor</strong> </em>que é usado para armazenar um <strong>bit</strong> na Flash, é fisicamente menor que o <em><strong>Transistor</strong> </em>em uma <strong>EEPROM</strong> "autêntica", e por isso menos robusto, tendo uma vida útil menor. Por consequência, o limite máximo de ciclos é menor em uma <em><strong>Flash</strong></em> (pois os <em><strong>Transistores</strong> </em>sendo menores, aguentam menos as "pancadas" da <em><strong>tensão</strong> <strong>"VPP"</strong></em> gerada no processo de gravação). Por outro lado, como na Flash o referido Transistor é menor, a Flash também tem uma capacidade de armazenamento (tamanho da Memória, em bits) bem maior que na EEPROM.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Primeiramente obrigado pela r…tag:labdegaragem.com,2021-10-06:6223006:Comment:8753642021-10-06T01:36:30.133ZAntoneli Tokarskihttps://labdegaragem.com/profile/AntoneliTokarski
<p>Primeiramente obrigado pela resposta.</p>
<p></p>
<p>Vamos ver se entendi, então se eu precisar alterar um vetor de 50 bytes e por exemplo os 50 bytes forem</p>
<p>alterados de A para B sendo que atualmente na EEPROM os 50 bytes possuem o valor A.</p>
<p></p>
<p>byte vetor[50];</p>
<p></p>
<p>for(int i=0; i<50; i++)</p>
<p> vetor[i]='B';</p>
<p></p>
<p>se fizer isso:</p>
<p>EEPROM.PUT(0, vetor) ; -> aqui eu utilizo apenas 1 ciclo pois estou fazendo 1 único put de 50bytes "ao mesmo…</p>
<p>Primeiramente obrigado pela resposta.</p>
<p></p>
<p>Vamos ver se entendi, então se eu precisar alterar um vetor de 50 bytes e por exemplo os 50 bytes forem</p>
<p>alterados de A para B sendo que atualmente na EEPROM os 50 bytes possuem o valor A.</p>
<p></p>
<p>byte vetor[50];</p>
<p></p>
<p>for(int i=0; i<50; i++)</p>
<p> vetor[i]='B';</p>
<p></p>
<p>se fizer isso:</p>
<p>EEPROM.PUT(0, vetor) ; -> aqui eu utilizo apenas 1 ciclo pois estou fazendo 1 único put de 50bytes "ao mesmo tempo", embora esteja alterando 50 bytes.</p>
<p></p>
<p>ou se fizer isso:</p>
<p>for(int i=0; i<50; i++)</p>
<p> EEPROM.put(vetor[i]); -> aqui eu utilizo 50 ciclos?</p>
<p></p>
<p></p>
<p></p>
<p>Att.</p>
<p>Antoneli</p>
<p></p>
<p></p>
<p></p>
<p></p> ah, tentando ser ainda mais…tag:labdegaragem.com,2021-10-06:6223006:Comment:8755862021-10-06T01:11:45.578ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">ah, tentando ser ainda mais claro:</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Tomando o código de exemplo que vc postou, se for feita naquela sequencia, contará como <strong>2 ciclos de gravação</strong>. Isto porque quando vc chama o <em><strong>"put"</strong></em> pela segunda vez, vc alterou o Vetor em relação ao que estava já gravado (primeira chamada ao <em><strong>"put"</strong></em>), então o <em><strong>"put"</strong></em> detecta…</span></p>
<p><span style="font-size: 12pt;">ah, tentando ser ainda mais claro:</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Tomando o código de exemplo que vc postou, se for feita naquela sequencia, contará como <strong>2 ciclos de gravação</strong>. Isto porque quando vc chama o <em><strong>"put"</strong></em> pela segunda vez, vc alterou o Vetor em relação ao que estava já gravado (primeira chamada ao <em><strong>"put"</strong></em>), então o <em><strong>"put"</strong></em> detecta a diferença dos dados (nem que seja um único bit que mudou) e então executa um novo <strong><em>ciclo de gravação</em></strong> (ou "queima" de um ciclo de gravação, se vc prefere dizer assim).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Assim naquele seu exemplo, ao chamar o <em><strong>"put"</strong></em> pela segunda vez, não faz diferença se vc alterou só um byte ou mais bytes no seu Vetor, pois como vc alterou algum dado no Vetor, a segunda chamada ao <strong><em>"put"</em></strong> contará como um ciclo adicional de gravação.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Então fique atento à taxa que vc chama o <em><strong>"put"</strong></em> (claro, só será executado um <strong><em>ciclo de gravação</em></strong> se algum dado mudou em relação ao que está na <strong><em>EEPROM</em></strong>).</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Boa noite AT. (se não gosta q…tag:labdegaragem.com,2021-10-05:6223006:Comment:8756532021-10-05T23:06:26.885Zmineirin RVhttps://labdegaragem.com/profile/RuiViana
<p>Boa noite AT. <em><strong>(se não gosta que te chame pelas iniciais, avise).</strong></em></p>
<p></p>
<p>A função EEPROM.put() realmente utiliza a função EEPROM.update() para gravar os dados na EPROM.</p>
<p>A função EEPROM.put() identifica quantos bytes serão gravados na EEPROM em função do tipo da variável</p>
<p>a ser gravada.</p>
<p></p>
<p>Se você definir a vaiável como byte, a função EEPROM.put() vai gravar somente um byte.</p>
<p>Se definir o tipo como int ou unsigned int, ela vai…</p>
<p>Boa noite AT. <em><strong>(se não gosta que te chame pelas iniciais, avise).</strong></em></p>
<p></p>
<p>A função EEPROM.put() realmente utiliza a função EEPROM.update() para gravar os dados na EPROM.</p>
<p>A função EEPROM.put() identifica quantos bytes serão gravados na EEPROM em função do tipo da variável</p>
<p>a ser gravada.</p>
<p></p>
<p>Se você definir a vaiável como byte, a função EEPROM.put() vai gravar somente um byte.</p>
<p>Se definir o tipo como int ou unsigned int, ela vai gravar 2 bytes,</p>
<p>se definir o tipo como long, unsigned long ou float, ela vai gravar 4 bytes.</p>
<p></p>
<p>Como a função EEPROM.put() usa a função EEPROM.update() para esta gravação, se a variável for byte ela vai verificar se o valor é ou não igual ao guardado.</p>
<p></p>
<p>RV mineirin</p> olá Antoneli.
Observe…tag:labdegaragem.com,2021-10-05:6223006:Comment:8755802021-10-05T21:46:28.570ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">olá Antoneli.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Observe que o vetor <strong>"teste[]"</strong> tem um tamanho que vc definiu (2 bytes no seu exemplo). E quando vc chama o <strong>"put()"</strong>, vc passa o endereço inicial onde quer que seja gravado na <strong>EEPROM</strong>, além de um Ponteiro para o objeto que será gravado (neste caso o próprio <strong>"test[]"</strong>). Lá dentro da função <strong>"put"</strong> é então…</span></p>
<p><span style="font-size: 12pt;">olá Antoneli.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Observe que o vetor <strong>"teste[]"</strong> tem um tamanho que vc definiu (2 bytes no seu exemplo). E quando vc chama o <strong>"put()"</strong>, vc passa o endereço inicial onde quer que seja gravado na <strong>EEPROM</strong>, além de um Ponteiro para o objeto que será gravado (neste caso o próprio <strong>"test[]"</strong>). Lá dentro da função <strong>"put"</strong> é então obtido o tamanho em bytes, do objeto a ser gravado (usando a função <strong><em>"sizeof"</em></strong>), e em seguida cada byte é lido da <strong>EEPROM</strong> a partir do endereço que vc informou no <strong>"put()"</strong>. E cada byte lido, é comparado com o correspondente byte do objeto que vc apontou (o <strong>"teste[]"</strong>). Se a função <strong>"put"</strong> encontra um byte diferente, então ela procede à gravação propriamente dita da <strong>EEPROM</strong>, e isto é considerado <em><strong>um ciclo de gravação</strong></em> (independente da quantidade total de bytes no Vetor <strong>"teste[]"</strong>, ou da quantidade de bytes que vc alterou naquele Vetor).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Ou seja, se possível evite alterar um byte apenas no seu Vetor e já proceder à gravação (mesmo que esteja usando o <strong>"put()"</strong>), pois se de fato o Vetor ficou diferente do que está atualmente na <strong>EEPROM</strong>, então o processo de gravação será efetivo e um ciclo da vida útil da EEPROM estará sendo contado.</span></p>
<p><span style="font-size: 12pt;"> Assim, o mais interessante (c<span>laro, isto se a funcionalidade do seu Sistema permitir) </span>seria vc só iniciar uma gravação (via <strong>"put"</strong> por exemplo), quando tiver alterado vários bytes no seu Vetor <strong>"teste[]"</strong>, pois se <em>um único byte estiver diferente</em> do que está na <strong>EEPROM</strong>, fará o <strong>"put"</strong> executar um <em><strong>ciclo de gravação</strong></em>.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> <strong><em>Em outras palavras:</em></strong> <span style="text-decoration: underline;"><em>cada chamada</em></span> à <em>função</em> <strong>"put"</strong> <span style="text-decoration: underline;"><em>corresponderá</em></span> a <strong><em>um único ciclo de gravação</em></strong>, desde que <em><span style="text-decoration: underline;">pelo menos um byte</span></em> do seu objeto de dados <em><span style="text-decoration: underline;">seja diferente</span></em> do que está gravado na <strong><em>EEPROM</em></strong>. Ou ainda: <span style="text-decoration: underline;"><em>não é</em></span> a quantidade de bytes alterados que determina a contagem dos <strong><em>ciclos de gravação</em></strong>, mas sim cada chamada ao <strong>"put()"</strong> (desde que ao menos um byte tenha sido alterado).</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Há mais detalhes interessantes sobre o ciclo de gravação da <strong>EEPROM</strong> (embora alguns detalhes dependam do Processador da plataforma). Como por exemplo o fato de que efetivamente somente os <strong>"0"</strong> são gravados e que um apagamento é necessário apenas quando um bit qualquer estiver em <strong>"0"</strong> e precisar "voltar" pra <strong>"1"</strong>. Na maioria dos Processadores, existe uma <em><strong>Máquina de Estados</strong></em> em <em><strong>Hardware</strong></em> (ou seja, um <strong><em>"Controlador da EEPROM"</em></strong>) que conduz o processo de gravação e interage com a execução do código pelo Processador . E ainda há outros detalhes curiosos sobre o processo de gravação.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Espero ter ajudado.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p>