Ir para conteúdo
  • Cadastre-se

resolvido arduino uno + modulo enc28j60, travando

Avalie este tópico:


alexandrerazr

Posts em destaque

projetei esse circuito para abrir portao eletronico com o celular, mias o projeto esta travando, queria saber se tem algo de errado no meu codigo que possa esta causando esse travamento, e tambem queria saber como coloca uma funçao de reset automatico nele, para que ele reinciace quando estivesse com o codigo travado, li em algums forum sobre o whatdog, mais nao achei como colocar ele no meu codigo

 

codigo fonte 

 


 #include <EtherEncLib.h>

 const int rele1 = 8;
 const int rele2 = 7;

EtherEncLib lib(80);

static unsigned char ipaddr[] = { 192, 168, 1, 202 };
static unsigned char macaddr[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x25 };

void setup()
{

   lib.begin(ipaddr, macaddr);

    pinMode(rele1, OUTPUT);
    pinMode(rele2 OUTPUT);
    digitalWrite(rele1, LOW);
    digitalWrite(rele2, LOW);
       
    Serial.println("EtherEncLib.h started!");
}
 
void loop()
{

    if (lib.available())
    {

        char *params = lib.getParams();
        
        Serial.print("Params: ");
        Serial.println(params);
        

        lib.print("<HTML>");
        lib.print("<HEAD><TITLE>Automacao Alexandre</TITLE></HEAD>");
        lib.print("<BODY>");

        lib.print("<h3>Pronto para uso!</h3>");
        
        
          
      if (strcmp(params, "?rele1=on") == 0){
            digitalWrite(rele1, HIGH);
            delay(1500);
            digitalWrite(rele1, LOW);
            
      }
      
      
      else if(strcmp(params, "?rele2=on") == 0){
            digitalWrite(rele2, HIGH);   
            delay(1500);
            digitalWrite(rele2, LOW );                     
      }
    
        lib.print("</BODY>");
        lib.print("</HTML>");

        lib.close();
    }
}

Editado: por alexandrerazr
Link para o comentário
Compartilhar em outros sites

Inclua a linha abaixo logo na declaração das libs:

#include <avr/wdt.h>

 

Em setup, defina o tempo do watchdog: Ex:

 

wdt_enable(WDTO_8S); // Watchdog a cada 8 segundos!!! << depende do mcu, nem todos tem esta opção!!!!

 

wdt_enable(WDTO_4S); // Watchdog a cada 4 segundos!!! << depende do mcu, nem todos tem esta opção!!!!

 

wdt_enable(WDTO_2S); // Watchdog a cada 2 segundos!!!

 

wdt_enable(WDTO_1S); // Watchdog a cada 1 segundo!!!

 

wdt_enable(WDTO_500MS); // Watchdog a cada 500 milisegundos!!!

 

...{ tem outros valores aqui neste intervalo}...

 

wdt_enable(WDTO_15MS); // Watchdog a cada 15 milisegundos!!! << menor tempo de watchdog

 

O arquivo wdt.h fica localizado dentro da pasta onde a IDE do Arduino foi instalada + \hardware\tools\avr\avr\include\avr\!!!!

 

Exemplo: C:\Program Files\Arduino\hardware\tools\avr\avr\include\avr\

 

Dentro dele tem as especificações de tempos a serem utilizados!!!

 

E no código loop, inclua a linha que diz ao watchdog que está tudo em ordem... que continue a execução:

 

wdt_reset();

Flw...

 

 

Editado: por nagkiller
Link para o comentário
Compartilhar em outros sites

11 minutos atrás, nagkiller disse:

Inclua a linha abaixo logo na declaração das libs:

#include <avr/wdt.h>

 

Em setup, defina o tempo do watchdog:


void setup() {
      wdt_enable(WDTO_2S);
}
 

Amigo esse comando não vai dar pau na minha atemega ? Pq li em alguns fórum que dizem que depois de fazerem isso não conseguiram mais gravar nada no chip pq ele reinicia antes passar o código, 

Agora, alexandrerazr disse:

Amigo esse comando não vai dar pau na minha atemega ? Pq li em alguns fórum que dizem que depois de fazerem isso não conseguiram mais gravar nada no chip pq ele reinicia antes passar o código, 

E a biblioteca onde consigo 

Link para o comentário
Compartilhar em outros sites

A lib já é padrão do AVR!!! Vem junto com o Arduino!!!

 

Durante o código tem que prever o local correto, onde deverá avisar ao  watchdog (cão de guarda), receberá a informação que está tudo ok!!!


Supondo que o watchdog não seja executado e trave, na hora de enviar uma nova scketch para o mcu, pode dar um reset... assim, o mcu entrará em inicialização do bootloader...

Uma dica é antes de habilitar o watchdog, é inserir um delay de 2s ou mais... assim, pode-se ter algum tempo antes de que o primeiro evento de watchdog ocorra por falha de software.

 

Pode ainda com a ajuda de outro Arduino, em modo de gravação por ICSP, realizar a regravação do bootloader.

 

Flw...

Editado: por nagkiller
Link para o comentário
Compartilhar em outros sites

2 minutos atrás, nagkiller disse:

Durante o código tem que prever o local correto, onde deverá avisar ao  watchdog (cão de guarda), receberá a informação que está tudo ok!!!


Supondo que o watchdog não seja executado e trave, na hora de enviar uma nova scketch para o mcu, pode dar um reset... assim, o mcu entrará em inicialização do bootloader...

Uma dica é antes de habilitar o watchdog, é inserir um delay de 2s ou mais... assim, pode-se ter algum tempo antes de que o primeiro evento de watchdog ocorra por falha de software.

 

Flw...

Ok, vc saberia me dizer onde eu coloco no meu codigo? Eu não manjo muito de arduino, estou aprendendo agora, eu tenho um circuito pra acender as lâmpadas aqui de casa, nunca deu problema nem travo, mais eu uso a que ethernet shild que tem entrada pra cartão de memória, resolvi pegar esse enc28j60 por causa do tamanho, mais acho que não valeu a pena 

Link para o comentário
Compartilhar em outros sites

Analise os códigos abaixo:

 

 

Exemplo de sistema "seguro":

#include <avr/wdt.h>

#define ledVerde  7

void setup() {
  delay(2500);  // tempo de inicialização para salvar mcu...
  pinMode(ledVerde, OUTPUT);
  wdt_enable(WDTO_500MS);
}

void loop() {
  wdt_reset();
  delay(100);  // Tempo menor que o tempo do próximo watchdog 
  digitalWrite(ledVerde, digitalRead(ledVerde)^1); // Lógica para inverter estado do pino
}

 

Quase o mcu não reponde mais:

 

#include <avr/wdt.h>

#define ledVerde  7
#define ledAzul   8

void setup() {
  delay(2500);  // tempo de inicialização para salvar mcu...
  pinMode(ledVerde, OUTPUT);
  pinMode(ledAzul, OUTPUT);
  wdt_enable(WDTO_500MS);
}

void loop() {
  delay(200);  // Tempo menor que o tempo do próximo watchdog 
  digitalWrite(ledVerde, digitalRead(ledVerde)^1); // Lógica para inverter estado do pino
  delay(200);  // Tempo menor que o tempo do próximo watchdog 
  wdt_reset();
  digitalWrite(ledAzul, digitalRead(ledAzul)^1); // Lógica para inverter estado do pino
  delay(200);  // Tempo menor que o tempo do próximo watchdog 
  wdt_reset();  // Reset adicional para não exceder o tempo de watchdog
}

 

 

Exemplo ruim (delay maior que o tempo de watchdog):

 

#include <avr/wdt.h>

#define ledVerde  7

void setup() {  
  pinMode(ledVerde, OUTPUT);
  wdt_enable(WDTO_500MS);
}

void loop() {
  wdt_reset();
  delay(1000);  // MCU não responde mais!!! tempo maior que o tempo de resposta do watchdog
  digitalWrite(ledVerde, digitalRead(ledVerde)^1); // Lógica para inverter estado do pino
}

 

Em regra de uso, não é uma boa prática a utilização de delay()... pois ele "trava" o processo... o ideal é utilizar os Timers!!!

 

Flw...

 

Editado: por nagkiller
  • Joinha 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Participe agora da conversa!

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, faça login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Restaurar formatação

  Apenas 75 emoticons máximos são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir apenas como um link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Você não pode colar imagens diretamente. Envie ou insira imagens do URL.

SOBRE O ELETRÔNICABR

EletrônicaBR é o melhor fórum técnico online, temos o maior e mais atualizado acervo de Esquemas, Bios e Firmwares da internet. Através de nosso sistema de créditos, usuários participativos têm acesso totalmente gratuito. Os melhores técnicos do mundo estão aqui!
Técnico sem o EletrônicaBR não é um técnico completo! Leia Mais...
×
×
  • Criar Novo...