Bom dia a todos.

Estou com alguns problemas com meu projeto de carregador de baterias tiristorizado.

É a primeira vez que trabalho com o arduino. Estou usando,

Uma placa GARAGINO. 

Um display 16x2.

Cinco teclas, duas para navegação entre as telas, duas para edição de valores e uma para entrar e sair do modo de edição.

     Todas as rotinas que testei até agora funcionaram como deveria, mas quando comecei a juntar as rotinas verifiquei que quando cheguei perto dos 70% de utilização da memória, algumas rotinas deixaram de funcionar corretamente e quando vou navegar entre minhas telas elas se apresentam corrompidas e por vezes conforme a tela que eu acesso a placa reseta sozinha.

     Quando cancelo parte do programa elas voltam a funcionar.

     Alguém já se deparou com uma situação semelhante?

 

Exibições: 1368

Responder esta

Respostas a este tópico

Isso pode ser acarretado por problemas de falta de memória ram ou falta de liberação de memória alocada (que no final são a mesma coisa), os 70% que você se refere deve ser de espaço para os programas.

Sim. Os 70% é referente ao espaço para programas.

Tem algo que eu possa experimentar para solucionar este problema?

Eu sugiro você rever o uso de variáveis no seu programa, como você disse, você tem várias "TELAS" então deve estar usando vários  arrays de char para armazenar as telas ou informações, isso pode ser umas das causas.

Estou usando alguns arrays, mas não para as telas.

É minha primeira aplicação. Sou programador de PLC e supervisórios.

Nunca havia programado em C. Creio que nem todas as minhas soluções são as melhores, mas fiz conforme as idéias vieram, falta lapidar.

Não sei se dá para enviar o arquivo, ele está meio grande.

Se der pra ver, me dê sua opinião. Posso melhorar em alguma coisa? 

Anexos

Deu uma passada de olhos, e o que vi são muitos lcd.print(", cada um deles, o texto que você usa, também consome memória do uC, talvez o melhor seja você dar um estudada na library PROGMEM,

assim, você vai liberar memória RAM mas sacrifica memória de armazenamento de programas.

     Com certeza os textos ocupam espaço na memória de programa. Mas ainda tenho uma reserva.

     Com relação ao espaço ocupado pelo programa e a memória RAM livre, eu não consegui ver a relação, pois até aqui o que eu entendi é que o programa fica em uma memória FLASH e não tem a ver com a memória RAM.

     Mas como disse esta é minha primeira aplicação e tenho muito ainda a aprender.

     Vou dar uma olhada na biblioteca que você citou para ver oque ela pode me acrescentar ao projeto.

     Por enquanto muito obrigado pela atenção... Continuarei experimentando. 

Não, os lcd.print(" ocupam, tanto a memória de programa  "FLASH", quanto a SRAM, que armazena as variáveis.

Então vejo sentido no que me disse...

Dei uma rápida olhada e entendi o funcionamento do PROGMEM. Vou estudá-lo para aplicar no projeto. Depois relato se deu certo.

Novamente, muito obrigado. Agora tenho algo a experimentar.

A propósito... Você tem uma outra forma mais inteligente para que eu crie minhas telas???

Li sobre a biblioteca e utilizei o seguinte.

lcd.print(F("Texto") - Para armazenar diretamente na FLASH.

Aparentemente funcionou... Vou continuar experimentando, mas creio que este problema não irá me atrapalhar novamente...

Muito obrigado pelo auxilio.

Ola Luiz, estou com o mesmo problema que você, poderia me informar como conseguiu validar o comando lcd.print(F("Texto"), estou utilizando a biblioteca LiquidCrystal.h e a mesma não aceita este comando.

Olá rodrigo. Desculpe-me a demora...
Eu usei a mesma biblioteca que você. Verifique se não há uma versão mais atual.
Abaixo está o trecho onde a biblioteca é incluída e a apresentação de duas telas do projeto, onde é usado o recurso.
Verifique também se a sua grafia está correta.

Espero que tenha lhe ajudado. Dê um retorno se funcionou ou não.

Até mais...

#include <TimerOne.h> // inclui biblioteca Timer1
#include <EEPROMEx.h> // Para criar memórias retentivas
#include <LiquidCrystal.h> // Inicializa a biblioteca com os números dos pinos de interface

LiquidCrystal lcd(13, 12, 11, 10, 9, 8); // Cria um objeto lcd e atribui os pinos

// -------------------------------------------------------------

void TELA_14() { // Indicação do ângulo de disparo

lcd.setCursor(0,0);
lcd.print(F(" ANGULO DISPARO"));
lcd.setCursor(0,1);
lcd.print(F(" DEG:"));
lcd.print(Angulo_disparo);
lcd.write(3); // Simbolo do grau
lcd.print(F(" "));
JOY(); // Rotina do JOYSTICK
EI_Edicao = LOW;
}

// -------------------------------------------------------------

void TELA_22() { // TEMPO

lcd.setCursor(0,0);
lcd.print(F("FASE CARGA ["));
lcd.print(FASE_PRG + 1);
lcd.print(F("]"));
lcd.setCursor(0,1);
lcd.print(F("TEMPO:"));
lcd.print(Receita[FASE_PRG].Tempo);
lcd.print(F(" min "));
lcd.setCursor(6-Col,1);
Minimo = 0;
Maximo = 9999;
Valor = Receita[FASE_PRG].Tempo;
JOY(); // Rotina do JOYSTICK
if (EI_Senha) Receita[FASE_PRG].Tempo = Valor;
}

// -------------------------------------------------------------

Ola Luiz, obrigado por responder, já solucionei meu problema otimizando meu código, mas agradeço mesmo assim por ter respondido. Acredito que possa ser que minha biblioteca sege antiga mesmo, pois minha grafia esta correta sim.

Obrigado.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço