Ir ao conteúdo
  • Cadastre-se

Como desabilitar a resposta de PING do Arduino


Posts recomendados

Olá pessoal, estou fazendo um monitor de temperatura e preciso que ele pare de responder a um pedido de PING externo para seu IP(do arduino) quando a temperatura chegue a um valor.

 

Seria algo do tipo

 

if(temp > 30) {desabilita resposta ao ping}

else {habilita resposta ao ping}

Alguém sabe algum comando desses?

Se não houver um comando específico para o PING, pode ser algo que desabilite o shild de internet tb, não será usado pra mais nada.

 

Uso o Shild padrão. Wiznet W5100, acho que é esse o nome.. rs

Link para o comentário
Compartilhar em outros sites

nada gente? Kd a galera do forum? rsrsrs

 

Fiz os seguintes testes, mudei o estado do PINO 10 para alto, segundo li, ele é quem habilita o módulo, o ping ficou perdendo pacote mas não parou de todo. Desabilitei o SPI com esse comando "SPI.end()" mas não teve nenhum efeito, o PC continuou pingando pro arduino.

Alguma ideia?

Link para o comentário
Compartilhar em outros sites

13 minutos atrás, ViniciusKruz disse:

Segundo o datasheet, é o bit 4 do registrador MR (Mode Register) quem controla o ping.

 

Veja na página 19:

 

Datasheet W5100

 

Olhei aqui e vi isso.

 

Ping Block Mode
0 : Disable Ping block
1 : Enable Ping block
If the bit is set as ‘1’, there is no response to the ping request.

 

Agora vou mudar a pergunta... rsrs

 

Qual seria o comando pra Habilitar ou desabilitar esse BIT ?

Link para o comentário
Compartilhar em outros sites

Amigo, eu revirei esta biblioteca e não encontrei nada que fizesse referência ao registrador de habilitação do PING, logo, você terá que implementar esta função ou então encontrar alguma opção onde ela já tenha sido criada por alguém. 

 

Para criar a função, não sei se vai te ajudar, mas encontrei um site onde o cara mexe nestas opções com umas funções criadas por ele, veja o site completo:

https://mcuoneclipse.com/2014/01/07/frdm-with-arduino-ethernet-shield-r3-part-2-ping/

 

Só que esse exemplo aí não foi feito para Arduíno, então você precisará pegar as funções dele e adaptá-las para o seu sistema, pelo que analisei, você vai precisar dos seguintes códigos dele:

 

Função para escrever nos registradores:

uint8_t W5100_MemWriteByte(uint16_t addr, uint8_t val) {
  W5100_GetBus();
  SPIWriteByte(W5100_CMD_WRITE);
  SPIWriteByte(addr>>8); /* high address */
  SPIWriteByte(addr&0xff); /* low address */
  SPIWriteByte(val); /* data */
  W5100_ReleaseBus();
  return ERR_OK;
}

 

Função para ler os registradores:

uint8_t W5100_MemReadByte(uint16_t addr, uint8_t *val) {
  W5100_GetBus();
  SPIWriteByte(W5100_CMD_READ);
  SPIWriteByte(addr>>8); /* high address */
  SPIWriteByte(addr&0xff); /* low address */
  *val = SPIReadByte(); /* data */
  W5100_ReleaseBus();
  return ERR_OK;
}

 

Definição do registrador do PING:

#define W5100_MR    0x00 /* MR (Mode Register */
#define W5100_MR_BIT_IND    (1<<0) /* indirect bus interface mode */
#define W5100_MR_BIT_AI     (1<<1) /* address auto-increment in indirect bus interface, 1 to enable */
#define W5100_MR_BIT_PPPoE  (1<<3) /* PPPoE mode, 1 to enable */
#define W5100_MR_BIT_PB     (1<<4) /* ping block bit, 1 to block pings */
#define W5100_MR_BIT_RST    (1<<7) /* reset bit, 1 to reset internal registers */

 

Função para resetar o módulo:

CLS1_SendStr((unsigned char*)"Reset W5100.\r\n", CLS1_GetStdio()->stdOut);
/* reset device */
if (W5100_MemWriteByte(W5100_MR, W5100_MR_BIT_RST)!=ERR_OK) {
  CLS1_SendStr((unsigned char*)"Failed to reset device!\r\n", CLS1_GetStdio()->stdErr);
}

 

Esta função de reset, será praticamente a mesma para habilitar/desabilitar o PING, só precisa alterar um pouquinho: o endereço passaria de W5100_MR_BIT_RST  para W5100_MR_BIT_PB.

 

Como eu disse antes, esses códigos NÃO SÃO PARA ARDUÍNO, e precisarão ser adaptados, mas de qualquer forma a lógica é a mesma.

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Ok amigo, vou estudar esse site e esses códigos. Vou ver se sai algo.

Mas meu nível que programação ainda é fraco. Parece ser complicado.

Mas de qualquer forma obrigado pelo tempo dedicado a me ajudar, vou esforçar aqui pra ver se sai algo. Qualquer dúvida posto aqui.

se eu resolver tb... rs

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

23 minutos atrás, ViniciusKruz disse:

Encontrei esta opção: https://github.com/lstoll/arduino-libraries/tree/master/Ethernet/utility

 

Nos arquivos tem o w5100.c e .h, e estes são para arduíno, com eles é possível acessar os registradores.

 

No arquivo  w5100.h tem as seguintes linhas de código

 

/* MODE register values */
#define MR_RST			0x80 /**< reset */
#define MR_PB			0x10 /**< ping block */
#define MR_PPPOE		0x08 /**< enable pppoe */
#define MR_LB  			0x04 /**< little or big endian selector in indirect mode */
#define MR_AI			0x02 /**< auto-increment in indirect mode */
#define MR_IND			0x01 /**< enable indirect mode */

Creio que a linha que preciso seria essa:

#define MR_PB      0x10        /**< ping block */

 

Por onde eu começaria a inserir isso no código?

Tenho que baixar esses arquivos e substitui-los? (Me parece que já existem eles na pasta \libraries\Ethernet\src\utility)

pelo menos o W5100.h tem. Ou devo colocar eles em outro lugar e indicar no começo do código os dois?

 

Desculpe tantas perguntas.. rs

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...