• Welcome to LusoRobótica - Robótica em Português.
 

ENC28J60 e MFRC522

Started by CBX, 11 de March de 2014, 18:42

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

CBX

Não, apenas respostas aos pings

Njay

Podes estar a ter um problema de stack. O stack começa no final da RAM "utilizável" e cresce para baixo. As variáveis estáticas estão armazenadas no inicio da RAM. Eventualmente o crescimento do stack pode corromper as variáveis estáticas. Acho que podes dizer ao GCC para ligar um "stack checker", mas com o ambiente de Arduino não sei se te safas ;P . Tenta eliminar ou encolher o tamanho de variáveis estáticas, evitar chamadas eliminando funções e metendo o código inline em vez da chamada, reduzir ou eliminar o número de parametros de funções, encolher ou eliminar variáveis locais, ...

CBX

usei esta função para verificar a RAM livre:

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}


estão 1210 bytes livres

Já tentei diminuir o tamanho do buffer do TCP para metade, mas não adiantou em nada, começo a ficar frustrado com isto  :(

zedlav

Testa com este. Eu não tenho maneira de testar.

#include <SPI.h>
#include <MFRC522.h>
#include <EtherCard.h>

MFRC522 mfrc522(10, 14); // Create MFRC522 instance.

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // Endereço MAC
static byte myip[] = { 192,168,2,2 }; // Endereço IP
static byte gwip[] = { 192,168,2,1 }; // Endereço GW
static byte hisip[] = { 192,168,2,1 }; // Endereço servidor remoto
char website[] PROGMEM = "192.168.2.1"; // Nome do servidor remoto
byte Ethernet::buffer[500];   // Buffer do TCP/IP
String id, lastId;

unsigned char end_tcp_resp = 0;
static uint32_t timer;


void setup()
{
  Serial.begin(57600);
  ether.begin(sizeof Ethernet::buffer, mymac, 8);
  ether.staticSetup(myip, gwip);
  ether.copyIp(ether.hisip, hisip);
  SPI.begin();
  mfrc522.PCD_Init();
}

void loop()
{
 
  ether.packetLoop(ether.packetReceive());
 
  id = "";
 
 

  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() && end_tcp_resp == 0){
    for (int i = 0; i < 4; i++)
    {
     
      if (mfrc522.uid.uidByte[i] < 0x10) //adds a leading zero
        id += "0";
     
      id += String(mfrc522.uid.uidByte[i], HEX);
     
    }
   

    mfrc522.PICC_HaltA();
    delay(1000);
  }
 
 
   if (id != lastId && end_tcp_resp == 0){
     
     
        end_tcp_resp = 1;
        Serial.println(id);
        ether.browseUrl(PSTR("/?id="), id, website, reply);
        //tone(9, 2300, 500);
        lastId = id;
timer = millis() + 5000;


   }else{
   
     
        if (millis() > timer && end_tcp_resp == 1) {

     // SE entrar aqui é porque não recebemos resposta do servidor
     // por isso voltamos a por end_tcp_resp a zero
     end_tcp_resp = 0;
 
}

     /*
        tone(9, 2300, 100);
        delay(200);
        tone(9, 2300, 100);
      */
     
   }
 
 
}

// Resposta do servidor
static void reply (byte status, word off, word len)
{
  end_tcp_resp = 0;
  Serial.println((const char*) Ethernet::buffer + off);
}

CBX

não funciona, mesmo problema, vou procurar outra biblioteca para o enc28j60 não vá o problema ser daí...

senso

Presumo que isso seja só o uso de ram em compile time, porque não estou ai a ver nada que coloque um padrão(tipo AA ou 55) na ram toda e que depois vá ver até onde é que encontra esse padrão, essa seria a maneira de saber realmente a ram usada, porque tudo quanto é strings/arrays e afins são passados da flash para a ram durante a execução.
Avr fanboy

LoneWolf

boas,

Quotevou procurar outra biblioteca para o enc28j60 não vá o problema ser daí...

... é que é mesmo dai, ando a tentar fazer uma coisa deste  género e algumas bibliotecas não funcionam correctamente e ao add mais bibliotecas os problemas aumentam.

tenta uma dessas duas em anexo ( a mim so deixa fazer alguma coisa se usar a lib enc28j60)

Abraço.
Blog: A Visão do Lobo

Nick antigo: kilobyte

zedlav

Em ultimo caso comunica com a pessoa que fez a lib para o enc28j60 ele melhor do que ninguém poderá respoder qual é o problema.

CBX

Quote from: LoneWolf on 20 de March de 2014, 20:59
boas,

Quotevou procurar outra biblioteca para o enc28j60 não vá o problema ser daí...

... é que é mesmo dai, ando a tentar fazer uma coisa deste  género e algumas bibliotecas não funcionam correctamente e ao add mais bibliotecas os problemas aumentam.

tenta uma dessas duas em anexo ( a mim so deixa fazer alguma coisa se usar a lib enc28j60)

Abraço.

a enc28j60 está bastante desactualizada, tentei usar a versão mais recente, mas sem sucesso, a ethercard é a que estou a usar, tentei também usar a arduino_uip também sem sucesso...

obrigado

LoneWolf

#24
Boas,

Quotea enc28j60 está bastante desactualizada,

Obrigado pelo alerta, eu já nao toco nesse projecto a algum tempo assim que voltar a ele vou tentar usar a mais recente a ver se tem melhoras

Abraço.
Blog: A Visão do Lobo

Nick antigo: kilobyte

senso

Possivelmente maior parte do pessoal agora prefere usar os chips da Wiznet, tem muito mais coisas implementadas em hardware.
Avr fanboy

CBX

#26
é verdade, mas para a maior parte das aplicações o enc28j60 é mais do que suficiente, é menos de metade do preço e tem samples grátis  :P

em relação às bibliotecas, testei quatro, ethercard, ethershield, enc28j60 e arduino_uip, a única que com que consegui transmitir alguma coisa foi com a ehtercard e em termos de recursos penso que seja a mais bem optimizada, foi escrita de raiz, ao contrario da arduino_uip que é um port para arduino, as outras duas estão obsoletas.

Vou tentar por alguma das outras a funcionar para ter a certeza de que o problema é da biblioteca da ethernet, visto já ter testado outra para o mofulo rfid e o problema manter-se...

edit: consegui por a biblioteca arduino_uip a funcionar, assim que adiciono o código do leitor rfid deixa de funcionar, definitivamente o problema está na biblioteca do mfrc522, de volta a mergulhar no código da biblioteca  ::)

edit: finalmente luz ao fundo do túnel, continuei a insistir com a biblioteca arduino_uip e lembrei-me de adicionar um delay de 100ms, só porque sim, na linha seguinte à ultima chamada a uma função da biblioteca MFRC522 e não é que funcionou  :o

2 semanas a bater com a cabeça na parede por causa de um simples delay de 100ms...



esta biblioteca torna o código 10k maior, mas pelo menos funciona

senso

Avr fanboy

CBX

parece que a biblioteca implementa TCP, UDP, IP, ARP, ICMP e mais uns quantos protocolos daí o seu tamanho