Dúvida sobre variável global que não perde seu valor mesmo se o arduino for resetado [RESOLVIDO]

Boa noite Garagistas!

Tenho uma dúvida. Me desculpem se é muito simplória.

No arduino é possível manipular uma variável global em uma função dentro do loop de modo que ela não perca o valor setado no desenrolar do código, mesmo se o arduino for resetado?

Encontrei a PROGMEM mas segundo a documentação ela só funciona se a variável for declarada como const (read-only). Dessa forma não tem como modificá-la ao longo do código.

https://www.arduino.cc/reference/pt/language/variables/utilities/pr...

Obrigado.

Exibições: 507

Responder esta

Respostas a este tópico

Ola.

  Os microcontroladores em geral tem ao menos 3 tipos de memoria:

ROM, EPROM ou FLASHEPROM, que é onde fica o código. Se vc quiser colocar algum dado lá vc pode usar o PROGMEM.

Ela as vezes pode ser acessada para escrita, depende do modelo do microcontrolador. Ela permanece com o ultimo dado colocado se vc desligar.

RAM, que é memoria para dados, onde vc le e escreve a vontade, mas seu valor não é preservado se vc desliga e religa o microcontrolador.

EEPROM, é uma memória em que vc pode escrever ou ler, tudo que for gravado nela sobrevive ao reset. Exige certo cuidado ao usar pq o numero de escritas é finito. Se vc colocar em loop para escrever nela vai estragar rapido.

Muitas vezes  a EEPROM é na verdade uma pagina (parte) da flash do microcontrolador que fica disponivel como se fosse uma eeprom, exige os mesmos cuidados.

Solução clássica:

  - Ao ligar vc le os seus dados (geralmente configurações) da eeprom para suas variáveis em RAM.

  - Sempre que alguma variável é modificada em RAM vc grava o novo valor também na eeprom.

Obs1. Vc disse reset, mas entendi que quis dizer desligar e religar. A RAM não se perde no reset do botão, mas os dados recuperados não são confiáveis (eu não confiaria). 

Obs2. Na verdade alguns microcontroladores tem mais tipos, como os registradores, mas não vem ao caso.

Olá, Rodrigo.

   Complementando a resposta do Eduardo Henrique, se você pretende manter o valor da variável após desligar a alimentação do µC, não tem jeito, tem que usar memória não volátil ( EPROM, EEPROM, SEEPROM, FLASH, etc. ).

   Se, entretanto, você quiser manter o valor da variável entre resets do µC, sem desligar a alimentação, então existe um jeito.

   Os compiladores tem "maneiras" de permitir que o programador use as coisas do seu jeito. Uma delas é permitir que ele, o programador e não o compilador, escolha quais variáveis ele quer que o compilador inicialize ou não.

   Uma forma de fazer o que você quer, é colocar a variável em uma secção especial que diz ao compilador que aquelas variáveis não devem ser inicializadas por ele.

   Teste o código abaixo e veja se eu entendi o que você quer. Se for e funcionar ( ou não ), como sempre, não esquece de contar para a gente, pelo que te agradeço desde já.

   Abração!

uint16_t contadorDeResets __attribute__ ((section (".noinit")));

void setup() {
// put your setup code here, to run once:

Serial.begin( 115200 ) ;

contadorDeResets++ ;

Serial.print( F("Resets ate entao: ") ) ;

Serial.println( contadorDeResets ) ;

}

void loop() {
// put your main code here, to run repeatedly:

}

Boa tarde.

Vivendo e aprendendo.

Resolvi o problema implementando a escrita e leitura na EEPROM do arduino.

Mais um pra conta...

Obrigado demais garagistas!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço