Ir ao conteúdo

Modulo ENC28J60 - Como usar PIC na Ethernet?


chacalgbi

Posts recomendados

Postado

Depois de muuuuuito pesquisar sobre esses módulos abaixo cheguei a duas conclusões:

ENC28J60.jpg

1°: Comparado a outros periféricos de microcontroladores, não existe quase nada em português sobre uso de PICs e módulos de rede.

2°: Acho que nós que curtimos sobre o assunto de programação de microcontroladores devemos explorar mais essa área. Eu creio que o futuro da comunicação de microcontroladores será nessa interface. Poder controlar uma automação ligada direto a um roteador sem a necessidade de um Computador dedicado é muito promissor!

Comprei um módulo ENC28J60 e comprei um PIC18F4550 e todos os periféricos para começar a explorar isso. Mas estou tento uma grande dificuldade para começar a aprender.

Eu programo com o PCWHD Compiler 4.078 da CCS.

Alguém tem algum exemplo? Poderia compartilhar ai algumas informações para nortear meu início?

Vou postar aqui algumas dúvidas iniciais:

1°: Eu liguei esse módulo em meu roteador e alimentei com 3,3V. Depois eu usei um programinha para dar um ping da faixa de IP 192.168.0.1 até 192.168.0.254. Só para ver o que acontecia, o LED que indica atividade ficou piscando enquanto o programinha procurava IPs nessa faixa acima. Achei positivo o resultado. Ai surgiu uma dúvida: esses módulos vem com IPs pré estabelecidos? Se não, é pelo programa do PIC que se define isso?

Na sequencia vou colocando outras dúvidas.

Tenho notado muita dificuldade por parte da maioria dos internautas, vamos fazer com que esse tópico seja de ajuda para todos!

Fiz uma placa de testes, olhem na imagem abaixo:

9th8.jpg

Usei um Cristal de 40Mhz

O PIC18F4550

Fiz a ligação como num projeto do MatheusLPS, olhem na imagem abaixo;

wa24.jpg

Agora preciso começar a fazer testes!!

Postado

Eu não utilizai ainda na prática a conexão TCIP com PIC,vai ser minha próxima brincadeira,mas observe alguns detalhes:

voce vai ter que definir um IP para o sistema e se tiver usando roteador(mais de um ponto),vai ter que ou fazer DMZ para o circuito do PIC ou redirecionar as portas para o IP da do circuito.

Postado
Eu não utilizai ainda na prática a conexão TCIP com PIC,vai ser minha próxima brincadeira,mas observe alguns detalhes:

voce vai ter que definir um IP para o sistema e se tiver usando roteador(mais de um ponto),vai ter que ou fazer DMZ para o circuito do PIC ou redirecionar as portas para o IP da do circuito.

Olá, valeu por ter respondido.

1°: Não entendi direito o que é DMZ.

2°: Colocando o IP fixo no módulo preciso definir uma porta no roteador para ele? Não sei se entendi sua explicação.

Postado

Sempre me interessei por esse módulo.

Como você pôde perceber, só pude trabalhar com ele na simulação. Uma pena.

Mas pelo exemplo q passei, você consegue começar. Veja que no exemplo tem muita coisa q não sei como funciona direito. Fui montando pedaços de códigos q achava por aí até funcionar.

Não tive tempo de ler o datasheet.

Agora estou sem tempo total de me aventurar em algo novo e meio complexo.

Mas o assunto é bem legal.

Teria que ver como enviar dados entre 2 PICs conectados via ethernet. Aí sim seria bem útil. Pois a princípio, o que vejo de útil seria você ter um sistema de monitoramento e poder ver ele Online sem precisar de um computador dedicado para isso.

Falou

Postado

Bem, era mais ou menos isso que eu queria MatheusLPS.

Vamos ver no que dá, vou continuar procurando informações e tentar fazer algum testes.

MatheusLPS, naquele exemplo que você colocou nesse tópico eu tentei simular aqui, mas dá vários Warnigs e no Proteus da o erro da tela abaixom olha ai:

3mwj.jpg

você sabe me dizer como proceder para eu consegui simular?

Postado
1°: Não entendi direito o que é DMZ.

Seria setar o modem,se estiver no modo Router,para quando receber aquisições de um certo IP,deixar todas as informações passaram para este IP,sem ser bloqueado pelo FireWall.

2°: Colocando o IP fixo no módulo preciso definir uma porta no roteador para ele? Não sei se entendi sua explicação.

Veja,a maioria das pessoas tem conexão com a internet usando modem roteado,isso quer dizer que se voce tentar enviar algum pacote de dados,ele vai ser bloqueado pelo FireWall ou desviado.

Para se conectar em um modem roteado,é preciso alterar as configurações do modem ou voce não conseguirá conexão específica para um dispositivo.

De uma lida sobre DMZ e Direcionamento de portas.

Postado

Esse erro que está tendo é do WinPcap.

é um aplicativo q você precisa instalar no seu computador para que o proteus possa emular uma conexão ethernet.

Nas versões mais novas do proteus ele vem junto do programa. Só instalar. você encontra ele em iniciar> todos os programas> proteus. Ele vai estar lá.

Falou

Postado

Fiz alguns avanços.

Consegui usar o código do MatheusLPS e fiz poucas modificações e deu certo.

Mudei o IP do programa para 192.168.0.10 porque meu pc é 192.168.0.51 e meu roteador é 192.168.0.1

Olhem os testes que fiz ai.

0j3p.jpg

Mais tarde vou ver se consigo chegar onde quero. E volto pra mostrar ou perguntar mais.. rsrs

Postado

Alguém sabe como faço para meu conjunto PIC + ENC28J60 dá um PING num IP e se tiver sucesso incrementar uma variável?

Procurei no DataSheet e não sei que comando seria esse. :o

Postado

Abra um terminal no seu PC(menu iniciar/Executar) e digite CMD.

Dentro do DOS (esse CMD que abriu) digite 'ipconfig'.

Confitme qual é o GateWay padrão.

Clicke no link embaixo e anote seu IP geral:

-> meu IP<-

Anote,é este que voce vai usar para conectar,mas ele muda a cada conexão do seu Modem.

Agora falta redirecionar as portas para responder a uma chamada ao IP 192.168.0.10 .

Lembre-se,fazer ping apenas testa uma porta ICMP,que é genérica e testa a conexãop geral apenas.

Se eu tiver tempo,dou uma olhada no código para descobrir como configurar a conexão.

PS:Pode ser que esse esquema usando o PIC utilize a porta padrão 80,neste caso não vai precisar redirecionar portas no modem.

Não teria como voce fazer o teste de um PC fora de sua rede?

Postado
Abra um terminal no seu PC(menu iniciar/Executar) e digite CMD.

Dentro do DOS (esse CMD que abriu) digite 'ipconfig'.

Confitme qual é o GateWay padrão.

Clicke no link embaixo e anote seu IP geral:

-> meu IP<-

Anote,é este que voce vai usar para conectar,mas ele muda a cada conexão do seu Modem.

Agora falta redirecionar as portas para responder a uma chamada ao IP 192.168.0.10 .

Lembre-se,fazer ping apenas testa uma porta ICMP,que é genérica e testa a conexãop geral apenas.

Se eu tiver tempo,dou uma olhada no código para descobrir como configurar a conexão.

PS:Pode ser que esse esquema usando o PIC utilize a porta padrão 80,neste caso não vai precisar redirecionar portas no modem.

Não teria como voce fazer o teste de um PC fora de sua rede?

Amigo, do meu PC eu consigo pingar o módulo com o comando ping -t 192.168.0.10

O que eu quero é o inverso, quero que o meu conjunto PIC + Módulo ENC28J60 faça algo que seja parecido com um PING!! Na verdade eu quero que meu módulo fique testando um determinado IP, ou seja, se um aparelho esteja ligado na rede e funcionando, se não estiver, meu PIC vai executar uma ação entendeu?

Talvez até tenha uma modo mais fácil e eu tô bestando.

Eu acho que usa a porta 80, olha aqui uma parte da configuração:


#include "tcpip/stacktsk.c"

#define MY_HTTP_SOCKET 80

int8 HTTPSocket=INVALID_SOCKET;

// Microchip VendorID, MAC: 00-04-A3-XX-XX-XX
void MACAddrInit(void)
{
MY_MAC_BYTE1=0x00;
MY_MAC_BYTE2=0x04;
MY_MAC_BYTE3=0xA3;
MY_MAC_BYTE4=0x00;
MY_MAC_BYTE5=0x00;
MY_MAC_BYTE6=0x01;
}

void IPAddrInit(void)
{
//IP Direto
MY_IP_BYTE1=192;
MY_IP_BYTE2=168;
MY_IP_BYTE3=0;
MY_IP_BYTE4=10;

//Porta de Enlace
MY_GATE_BYTE1=192;
MY_GATE_BYTE2=168;
MY_GATE_BYTE3=0;
MY_GATE_BYTE4=1;

//Mascara de Subred
MY_MASK_BYTE1=255;
MY_MASK_BYTE2=255;
MY_MASK_BYTE3=255;
MY_MASK_BYTE4=0;
}

Postado

Eu ainda não lí o código e os exemplos,mas veja,voce postou fotos com uma página HTML com um botão e a funcão de acender um Led e isso é feito pela rede através de um PC onde a placa do PIC,conectado numa rede,vai receber o pedido e 'ligar' um Led.

Se voce quer que o PIC se comporte como um servido de Web,aó é diferente mas depende das configurações é códigos.

De uma pesquisada em 'Pic WEB' ou procure no youtube exemplos:

->PIC web server<-

Postado

Sobre o PIC pingar ainda não descobri. Mas veja como é chato ter q configurar o IP do modulo via código.

Já li em algum lugar q tem como configurar ele par receber IP automático pelo DHCP. Acho q tem um arquivo .C no CCS TCP/IP stack. Só não cheguei a ver como funciona.

Estou achando esse ping muito alto para um dispositivo na rede interna. Seria bom ver como diminuir esse tempo.

Mas você já teve bons avanços. O tópico esta ficando cada vez melhor.

Falou

Postado
Sobre o PIC pingar ainda não descobri. Mas veja como é chato ter q configurar o IP do modulo via código.

Já li em algum lugar q tem como configurar ele par receber IP automático pelo DHCP. Acho q tem um arquivo .C no CCS TCP/IP stack. Só não cheguei a ver como funciona.

Estou achando esse ping muito alto para um dispositivo na rede interna. Seria bom ver como diminuir esse tempo.

Mas você já teve bons avanços. O tópico esta ficando cada vez melhor.

Falou

Pois é cara, tô fritando os neurônios aqui.

achei um site que fala um pouco sobre o dispositivo PINGAR, é esse aqui LINK. Lá diz que para pingar tem que habilitar o ICMP Client e o ICMP Server que são, nas palavras do próprio criador do site: Os dois ICMP são necessários para que a aplicação possa fazer PING em computadores e para que ela possa também responder a este comando, muito útil para verificar a conectividade de dispositivos.

Isso fica no programa TCPIPConfig.exe da microchip, acho que vem junto com o MPLABX ou com o Compilador C18.

Dá uma olhada ai no link, se você tiver uma luz ai, vai ajudando....

Quanto ao ping, vou ver o como diminuir. Será que tem a ver com o clock? O cristal do módulo é de 25Mhz e o do PIC é 40Mhz.

Acho que é o tempo mesmo que o PIC leva para executar todo o código. O tempo do ping tá em 8ms eu dei um delay aqui dentro do While de 1000ms e o tempo do ping ficou em 1008ms. Se eu diminuir o código e colocar um cristal de 48mhz deve cair bastante o ping.

Analisando aqui o arquivo icmp.h dentro da pasta tcpip eu vi dois comandos que eu acho que são para o ping.


// Windows ping uses 32 bytes, while MAC uses 56 bytes.
//#define MAX_ICMP_DATA (32)
#define MAX_ICMP_DATA (64)

Interessante isso porque eu tentei pingar com 65 bytes e não vai, pinga no máximo com 64, como na definição acima.


/*
* Input: remote - Remote node info
* code - ICMP_ECHO_REPLY or ICMP_ECHO_REQUEST
* data - Data bytes
* len - Number of bytes to send
* id - ICMP identifier
* seq - ICMP sequence number
* Note: A ICMP packet is created and put on MAC.
*/
void ICMPPut(NODE_INFO *remote,
ICMP_CODE code,
BYTE *data,
BYTE len,
WORD id,
WORD seq);

O Comando PUT sempre é para enviar informações.


/*
* Function: BOOL ICMPGet(ICMP_CODE *code,
* BYTE *data,
* BYTE *len,
* WORD *id,
* WORD *seq)
*
* PreCondition: MAC buffer contains ICMP type packet.
*
* Input: code - Buffer to hold ICMP code value
* data - Buffer to hold ICMP data
* len - Buffer to hold ICMP data length
* id - Buffer to hold ICMP id
* seq - Buffer to hold ICMP seq
*
* Output: TRUE if valid ICMP packet was received
* FALSE otherwise.

*/
BOOL ICMPGet(ICMP_CODE *code,
BYTE *data,
BYTE *len,
WORD *id,
WORD *seq);

E o comando GET sempre foi para receber.

acho que para matar a charada o segredo está dentro do arquivo icmp.h

Alguém sabe como implementar isso no programa do PIC?

Achei essa biblioteca para PING no ARDUINO LINK.

Mas para CCS nada que possa ajudar.

Postado

Já tinha olhado essa página.

Só que não entendi direito. Esse PingDest é uma variável?

E o ArpResolve tb não entendi.

O arquivo principal do programa é o tcpip/stacktsk.c

Dentro dele tem vários IFs

Para cada uso, o programa insere o que é necessário para o funcionamento.

Gostaria de pedir a vocês que olhassem e veja ai o que vocês conhecem e me digam para que serve.


#if STACK_USE_MAC
#include "tcpip/mac.h"
#if STACK_USE_MCPENC
#include "tcpip/enc28j60.c"
#elif STACK_USE_MCPINC
#include "tcpip/eth97j60.c"
#else
#include "tcpip/rtl8019AS.c"
#endif
#endif

#if STACK_USE_PPP
#include "tcpip/modem.c"
#include "tcpip/ppp.c"
#include "tcpip/pppwrap.c"
#endif

#if STACK_USE_SLIP
#include "tcpip/slip.c"
#ENDIF

#if STACK_USE_UDP
#include "tcpip/udp.h"
#endif

#if STACK_USE_DHCP
#include "tcpip/dhcp.h"
#endif

#if STACK_USE_SMTP
#include "tcpip/smtp.h"
#endif

#if STACK_USE_BASE64
#include "tcpip/base64.h"
#endif

#if STACK_USE_HTTP
#include "tcpip/http.h"
#endif

#if STACK_USE_FAT
#include "fat/fat_pic.c"
#endif

#if STACK_USE_MPFS
#include "mpfs/mpfs.h"
#endif

#if STACK_USE_HTTP2
#include "tcpip/http2.h"
#endif

#if STACK_USE_FTP
#include "tcpip/ftp.h"
#endif

#if STACK_USE_TFTP
#include "tcpip/tftp.h"
#endif

#if STACK_USE_DNS
#include "tcpip/dns.h"
#endif

#if STACK_USE_SNMP
#include "tcpip/snmp.h"
#endif

/*
#if STACK_USE_MPFS
#include "tcpip/mpfs.h"
#endif
*/

Depois de muito procurar eu achei um trecho de código no arquivo MainDemo.c do TCPIP Stack 4.02 da Microchip.


// ICMP Echo (Ping) example code
#if defined(STACK_USE_ICMP_CLIENT)
static void PingDemo(void)
{
static enum
{
SM_HOME = 0,
SM_GET_RESPONSE
} PingState = SM_HOME;
static TICK Timer;
SHORT ret;
IP_ADDR RemoteIP;

switch(PingState)
{
case SM_HOME:
// Send a ping request out if the user pushes BUTTON3 (left-most one)
if(BUTTON3_IO == 0)
{
// Don't ping flood: wait at least 1 second between ping requests
if((DWORD)(TickGet()-Timer) > 1u*TICK_SECOND)
{
// Obtain ownership of the ICMP module
if(ICMPBeginUsage())
{
Timer = TickGet();
PingState = SM_GET_RESPONSE;

// Send the ping request to 4.78.194.159 (ww1.microchip.com)
RemoteIP.v[0] = 4;
RemoteIP.v[1] = 78;
RemoteIP.v[2] = 194;
RemoteIP.v[3] = 159;
ICMPSendPing(RemoteIP.Val);
}
}
}
break;

case SM_GET_RESPONSE:
// Get the status of the ICMP module
ret = ICMPGetReply();
if(ret == -2)
{
// Do nothing: still waiting for echo
break;
}
else if(ret == -1)
{
// Request timed out
#if defined(USE_LCD)
memcpypgm2ram((void*)&LCDText[16], (ROM void *)"Ping timed out", 15);
LCDUpdate();
#endif
PingState = SM_HOME;
}
else
{
// Echo received. Time elapsed is stored in ret (units of TICK).
#if defined(USE_LCD)
memcpypgm2ram((void*)&LCDText[16], (ROM void *)"Reply: ", 7);
uitoa(ret, &LCDText[16+7]);
strcatpgm2ram((char*)&LCDText[16+7], (ROM char*)"ms");
LCDUpdate();
#endif
PingState = SM_HOME;
}

// Finished with the ICMP module, release it so other apps can begin using it
ICMPEndUsage();
break;
}
}

Se alguém se propor a me ajudar, diz ai que eu posto tudo que eu achei nos últimos dias para podermos implementar no código do programa.

Postado

O tempo do ping para rede interna está ótimo!

Abra o CMD no seu PC e pinga seu próprio HOST(ping 1270.0.1)e vai ver mais que 9.

Posta um link com projeto e simulação,quem sabe eu não consigo ajudar só com a emulação pois tenho bastante prática em redes.

Postado
O tempo do ping para rede interna está ótimo!

Abra o CMD no seu PC e pinga seu próprio HOST(ping 1270.0.1)e vai ver mais que 9.

Posta um link com projeto e simulação,quem sabe eu não consigo ajudar só com a emulação pois tenho bastante prática em redes.

Olá VTRX,

Aqui está o LINK com tudo o que eu consegui reunir. Ao descompactar, leia o arquivo Leia-me.txt, lá eu especifiquei tudo o que eu consegui fazer e as dúvidas.

Peço aos demais que se puderem fazer o download deste arquivo e darem uma estudada para conseguirmos solucionar e usar esse módulo ENC28J60 que é tão carente de informações na internet.

Postado

beleza, a noite vou ver se entro também, ai você vai postando e eu faço o testes aqui na bancada.

OLha esse LINK ai tem todos os Microchip TCP/IP Stack dá versão mais nova até a mais velha.

Falou

Olha esse LINK também, na página 40 fala sobre PING com o Microchip TCP/IP Stack

Postado

voce vai usar o LCD?

Qual o cristal está usando?

Eu achei a página com o código original de onde o Matheus pegou,acho que entendí o funcionamento.

Postado
voce vai usar o LCD?

Qual o cristal está usando?

Eu achei a página com o código original de onde o Matheus pegou,acho que entendí o funcionamento.

Olá!

*Não, não vou usar LCD, eu até tentei testar aqui, mas assim que eu coloco o comando lcd_init(); nada funciona, ele não é essencial. Consigo monitorar as atividades pela porta serial usando o HiperTerminal, como já tô fazendo.

* Estou usando um cristal de 40Mhz.

Conseguiu??? :D:D:D Que bom!

Qualquer coisa posta ai, vou ficar de olho aqui no forum pelo menos de hora em hora.

Falou!

Postado
* Estou usando um cristal de 40Mhz.

Tem algo errado aí não?

PIC 18F4550 com cristal de 40 MHZ??

Tem como voce usar um de 4 MHZ?

Se usar posso passar o código teste.

Me diga tambem qual os pinos que vai ligar os Leds.

Postado
Tem algo errado aí não?

PIC 18F4550 com cristal de 40 MHZ??

Tem como voce usar um de 4 MHZ?

Se usar posso passar o código teste.

Me diga tambem qual os pinos que vai ligar os Leds.

Tenho cristal de 4Mhz tb... posso trocar.

Os LEDs são esses:

LedG PIN_B7 //Led Verde (Green)

LedR PIN_B6 //Led Vermelho (Red)

LedY PIN_B4 //Led Amarelo (Yellow)

Eu pensei em colocar um LED para que toda vez que o PING fizer sua rota de ida e volta, o LED piscar, demonstrando assim o sucesso da operação. E que uma variável fosse incrementada.

Postado

Use um cristal de 4 MHZ.

Altere as pino de entrada e saída conforme o ENC28J60 usa,nó código (os TRIS).

Na teoria parece simples,eu peguei um código na net é só 'limpei' o que voce não ia usar.

Seguí os IPs que voce forneceu.

Na teoria será voce gravar o firmware,conectar o circuito do PIC no seu roteador e abrir um navegador no seu PC,e digitar 192.168.0.10,para abrir a página HTML gravada no PIC.

Se tudo der certo,vai ver os botões dos Leds na página e clicando vai responder com os Leds.

->Teste encoder<-

Arquivado

Este tópico foi arquivado e está fechado para 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!