12

Conectando Un Pic a Athernet Con La m2eth Board 205

Embed Size (px)

Citation preview

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

POR NAVAISMO

Conectando un

PIC aEthernet(M ETH-BOARD)2

Guía

1

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

Introducción.odos tenemos las necesidad de experimentar con los diferentes tipos de comunicación con

nuestros PIC’s, hemos visto gratamente como podemos implementar comunicación via USB, RF,con el Puerto serie de nuestra PC, es quizás por ello que me nació la cosquilla por comunicar esta

vez el PIC con la PC vía Ethernet..

Lasherramientasque encontrépara este finfueron el PIC18F4520, elENC28J60que es uncontrolador

ethernet alque seaccede víaSPI y elcompiladorMIKROBASIC,este ultimoposee rutinaspara

establecer

comunicacióncon elENC28J60 sinnecesidad detocar losregistros delPIC ni delENC28J60.

Por ultimo

usaremos Visual Basic para hacer nuestras aplicaciones.

Esta es unaguía quesolopersigue elpublicar misexperiencias

y unamanerasencilla deconectar unPIC a la

PC a través de un cable de red. No es nada profesional pero sirve para iniciarse en el tema.

El Hardware: M ETH-BOARD.2

El hardware

queutilizaremosse divide en2 partes. Laprimera esla interfazde la placaethernet lacual

conecta elcable deRED con elENC28J60:la M ETH-BOARD yla segundaparte es elHardwaredel PIC.

2

La M ETH-BOARD esta basada en el hardware que la misma hoja de datos del controlador propone:2

1 T

By Navaismo Página - 1 -28/08/2008 www.micros.mforos.com

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

Como en la misma hoja de datos del ENC28J60 proponen hay que cuidar los valores de lasresistencias, en mi caso uso las siguientes:

6 resistencias de 182 Ω a 1%, son usadas para los LED’s del controlador y las salidas

del SPI del controlador

1 resistencia de. 2.32K Ω a 1% para el pin RBIAS del controlador

4 resistencias de 49.9 Ω a 1% para las salidas del RJ45

Uno de losdispositivosmasdifíciles deconseguir

es elconectorRJ45 con losfiltrosintegradospero nada

quemouserelectronicsno nos

puedaresolver. Elnúmero departe demouser esel 673- J0012D21y es tal

como se ve en el esquemático.

Y por

ultimo elHardwaredel PIC,como seve en lafigura nose usaMCLRpero siustedeslo

necesitanlo

pueden activar.

By Navaismo Página - 2 -28/08/2008 www.micros.mforos.com

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

El Software del Microcontrolador

Para programarelmicrocontroladoruso Mikrobasiccomo ya lo habíacomentado, nopretendo

explicar la

librería si nodar unademostraciónde ella. Parareferirse alas librerías

esta la ayudadel manual yel ejemplo

que posee.

La libreríaquevamos ausar es laSPIEthernetLibraryestalibreríanosahorramuchotrabajopues

como

decíaanteriormentesabe dondeestán losregistros delENC28J60 locual permiteusar lassubrutinas de

manerasimple.Estalibreríanos sirvepara PICde másde 4KBde ROM yconhardwareSPI

integradopor

lo que no todos los PICs son compatibles. Para el uso de PICs de la familia 16F existen algunas

limitaciones, es por ello que uso un PIC18.

“Pingeando”

Una vez quecontamoscon elHardwarearmadonecesitamossaber sinuestraplacaresponde yque manera

massencilladehacerlosi nocon unPING, loqueequivalea un“estavivo”.Pararealizarel Pingusamos

la

subrutinaSpi_Ethernet_DoPacket(), estasubrutinarespondeautomáticamentea solicitudes ARPe

ICMP por lo que sitodo marcha biennuestro PICresponderáautomáticamente.Para hacer estoharemos

este sencillo Programa:

2

program ping‘nombre del programa

include "eth_enc28j60" ‘ Librerias que usa el compiladorinclude "eth_enc28j60_api"

dim mymacaddr as byte [6] ‘ Variables para la MAC, IP, DNS, GW y Mascara de REDdim myipaddr as byte [4]dim gwipaddr as byte [4]dim dnsipaddr as byte [4]dim ipmask as byte [4]dim i as byte

‘/// Estas 2 funciones son llamadas por la Rutina DoPacket por eso es necesario definirlas.‘////// La funcnion USERTCP sirve para la recepcion de paquetes TCP como esto solo es un ping no nos interesa y la declaramos como 0

sub function Spi_Ethernet_UserTCP(dim byref remoteHost as byte[4],dim remotePort, localPort, reqLength as word) as wordresult=0end sub

‘////// La funcnion USERUDP sirve para la recepcion de paquetes UDP como esto solo es un ping no nos interesa y la declaramos como 0sub function Spi_Ethernet_UserUDP(dim byref remoteHost as byte[4], dim remotePort, destPort, reqLength as word) as word

result=0end sub

main: ‘ Iniciamos el Programaadcon0=0 ‘ sin comparadores, sin ADC, Puerto A B y D como Salidaadcon1=15cmcon=7trisa=0porta=0trisb=0portb=0trisd=0portd=0

‘ Direccion Fisica de nuestroPIC la MAC A3:12:45:B3:22:F1mymacaddr[0]=0xA3mymacaddr[1]=0x12mymacaddr[2]=0x45

mymacaddr[3]=0xb3mymacaddr[4]=0x22mymacaddr[5]=0xf1

By Navaismo Página - 3 -28/08/2008 www.micros.mforos.com

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

myipaddr[0]=192myipaddr[1]=168‘ Direccion IP del PIC 192.168.1.20myipaddr[2]=1myipaddr[3]=20

ipmask[0]=255ipmask[1]=255 ‘ Mascara del PIC255.255.255.0ipmask[2]=255ipmask[3]=0

dnsipaddr[0]=192dnsipaddr[1]=168‘ Direccion del DNS 192.168.1.1dnsipaddr[2]=1dnsipaddr[3]=1

gwipaddr[0]=192gwipaddr[1]=168‘ Direccion del Gateway o Puerta de enlace 192.168.1.1gwipaddr[2]=1gwipaddr[3]=1

spi_init() ‘ Inicializamos el Hardware SPI del PICspi_ethernet_init(portc,0,portc,1,mymacaddr,myipaddr,1) ‘ Ponemos RC0 como Reset, RC1 Como el CS, metemos la MAC y la IP

spi_ethernet_confnetwork(ipmask,gwipaddr,dnsipaddr) ‘ Configuramos la RED del PIC

for i=0 to 2portd.7=0 ‘ Hacemos un Blink en el PORTD.0 para saber que vive el PICdelay_ms(500)portd.7=1delay_ms(500)next i

tryping: ‘ Comenzamos el programa principal

while trae ‘ Abrimos un bucle infinitospi_ethernet_dopacket() ‘ Llamamos la subrutina DoPacket la cual procesa los paquetes provenientes de la interfaz ethernetwendgoto tryping ‘ Vamos a repetirlo.end.

Para grabar nuestro programa uso el WinPIC800 y la configuración es la siguiente:

By Navaismo Página - 4 -28/08/2008 www.micros.mforos.com

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

Y el resultado es un PING contestado desde el PIC:

Jugando con el PORTD

Vamos aencender yapagar losBits delPORTDusando elprotocoloUDP, paraellonecesitamosmodificar

el programa anterior; además de usar Visual Basic para “togglear” el PORTD.

El código del PICprogram ping‘nombre del programa

include "enc_m2eth"' modulo donde se implementa el codigoinclude "eth_enc28j60"' modulo usado por el compilador

dim mymacaddr as byte [6] ‘ Variables para la MAC, IP, DNS, GW y Mascara de REDdim myipaddr as byte [4]dim gwipaddr as byte [4]dim dnsipaddr as byte [4]dim ipmask as byte [4]dim i as byte

main: ‘ Iniciamos el Programa

adcon0=0 ‘ sin comparadores, sin ADC, Puerto A B y D como Salidaadcon1=15cmcon=7trisa=0porta=0trisb=0portb=0

trisd=0portd=0

‘ Direccion Fisica de nuestro PIC la MAC A3:12:45:B3:22:F1mymacaddr[0]=0xA3mymacaddr[1]=0x12mymacaddr[2]=0x45mymacaddr[3]=0xb3mymacaddr[4]=0x22mymacaddr[5]=0xf1

By Navaismo Página - 5 -28/08/2008 www.micros.mforos.com

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

myipaddr[0]=192myipaddr[1]=168‘ Direccion IP del PIC 192.168.1.20myipaddr[2]=1myipaddr[3]=20

ipmask[0]=255ipmask[1]=255 ‘ Mascara del PIC255.255.255.0ipmask[2]=255ipmask[3]=0

dnsipaddr[0]=192dnsipaddr[1]=168‘ Direccion del DNS 192.168.1.1dnsipaddr[2]=1dnsipaddr[3]=1

gwipaddr[0]=192gwipaddr[1]=168‘ Direccion del Gateway o Puerta de enlace 192.168.1.1gwipaddr[2]=1gwipaddr[3]=1

spi_init() ‘ Inicializamos el Hardware SPI del PICspi_ethernet_init(portc,0,portc,1,mymacaddr,myipaddr,1) ‘ Ponemos RC0 como Reset, RC1 Como el CS, metemos la MAC y la IP

spi_ethernet_confnetwork(ipmask,gwipaddr,dnsipaddr) ‘ Configuramos la RED del PIC

for i=0 to 2portd.7=0 ‘ Hacemos un Blink en el PORTD.0 para saber que vive el PIC

delay_ms(500)portd.7=1delay_ms(500)next i

tryping: ‘ Comenzamos el programa principal

while trae ‘ Abrimos un bucle infinitospi_ethernet_dopacket() ‘ Llamamos la subrutina DoPacket la cual procesa los paquetes provenientes de la interfaz ethernetwendgoto tryping ‘ Vamos a repetirlo.end.

Hasta

estemomentotodopareceigual,perohemosañadidoel modulo“enc_m2eth” que

es donde

implementamosnuestro códigopara hacer quenuestro PORTDresponda, estavez la funciónUSERUDP

no seráiguala acero puessiqueremosevaluarlospaquetesquetengan

esteprotocolo.Sinembargola

función USERTCP si será igualada a cero pues no la necesitamos.

El código del modulo “enc_m2eth”module enc_m2eth‘nuestro modulo

include "eth_enc28j60_api"' Modulo del compilador

dim getRequest as byte[20]' variables de uso generaldyna as byte[30]txt as string[20]i as byte

‘/////// No evaluamos paquetes TCP por lo que la funcion es 0sub function Spi_Ethernet_UserTCP(dim byref remoteHost as byte[4], dim remotePort, localPort, reqLength as word) as wordresult=0

end sub

'/////// ' Implementamos la recepcion de paquetes UDP reseteando siempre el resultado a 0sub function Spi_Ethernet_UserUDP(dim byref remoteHost as byte[4], dim remotePort, destPort, reqLength as word) as wordresult = 0 ' reseteo de la funcion

If destport = 200 then ‘ El puerto donde vamos a escuchar los paketes es el 200 cualquier peticon a otro no es evaluada.for i=0 to 3 ' captamos los bytes entrantes del buffer ethernetgetRequest[i]=spi_ethernet_getbyte() 'captamos 3 esta ocasion debido al codigo de VBnext i

By Navaismo Página - 6 -28/08/2008 www.micros.mforos.com

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

'//////////// RUTINA PARA ENCENDER BITS EN EL PORTDif getrequest[0]="R" then

if getRequest[1]="D" thenif getRequest[2]="O" then

select case getRequest[3]case "0"PORTD.0=1txt = "RD0 ENCENDIDO"case "1"PORTD.1=1txt = "RD1 ENCENDIDO"case "2"PORTD.2=1txt = "RD2 ENCENDIDO"case "3"PORTD.3=1txt = "RD3 ENCENDIDO"case "4"PORTD.4=1txt = "RD4 ENCENDIDO"case "5"PORTD.5=1txt = "RD5 ENCENDIDO"case "6"PORTD.6=1txt = "RD6 ENCENDIDO"case "7"PORTD.7=1

txt = "RD7 ENCENDIDO"end selectclslcd_out(1,1,txt)

end if end if

end if

'/////////// RUTINA PARA APAGAR BITS EN EL PORTDif getrequest[0]="R" then

if getRequest[1]="D" thenif getRequest[2]="F" then

select case getRequest[3]case "0"PORTD.0=0txt = "RD0 APAGADO"case "1"PORTD.1=0txt = "RD1 APAGADO"case "2"PORTD.2=0txt = "RD2 APAGADO"case "3"PORTD.3=0txt = "RD3 APAGADO"case "4"PORTD.4=0txt = "RD4 APAGADO"case "5"PORTD.5=0txt = "RD5 APAGADO"case "6"PORTD.6=0

txt = "RD6 APAGADO"case "7"PORTD.7=0txt = "RD7 APAGADO"

end selectclslcd_out(1,1,txt)

end if end if

end if

result = 13 + reqLength ' el resultado es la longitud del texto a enviar mas lo que nos llega del bufferspi_ethernet_putbytes(@txt,13) ' Ponemos el mensaje en el buffer de transmision

'Aqui enviamos los paquetes (sacado de la libreria original)while(reqLength <> 0)

Spi_Ethernet_putByte(Spi_Ethernet_getByte())reqLength = reqLength - 1wend

end if end sub

By Navaismo Página - 7 -28/08/2008 www.micros.mforos.com

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

Prácticamente lo que hacemos es evaluar los paquetes que entran al puerto 200 UDP de la M ETH-2

BOARD. Filtrandola cadena enviadadesde la PC. Ycuando esrecibido

automáticamentese regresa la

cadena con el Bit que se encendió o se apago.

El código de Visual Basic.

Para podermanipularlos bits delPIC víaEthernetnecesitamosusar unprograma,en este casouso el Visual

Basic debido a su facilidad por acceder a estos puertos usando el control WINSOCK.

Para esta miniguia propngo el siguiente codigo ya que cumple con las condicionesdel programa del PIC:

Private sub Form_Load()' puerto PORTDWinsock1.Protocol = sckUDPProtocol ‘Protocolo que usa el socketWinsock1.RemoteHost = "192.168.1.20" ‘ IP remota la del PICWinsock1.RemotePort = 200 ‘ Puerto a enviar los paquetesWinsock1.Bind 1002 ‘ Puerto donde escucha la PC

End sub

'Cachamos datos para funcniones del PORTDPrivate Sub winsock1_DataArrival(ByVal bytesTotal As Long)Dim strData As StringWinsock1.GetData strData Text3.Text = strDataEnd Sub'Enviamos datos para toggle de bits del PORTDPrivate Sub Check1_Click()If Check1 = 1 ThenWinsock1.SendData "RDO0"ElseWinsock1.SendData "RDF0"End If End Sub

Private Sub Check2_Click()If Check2 = 1 Then

Winsock1.SendData "RDO1"ElseWinsock1.SendData "RDF1"End If End Sub

Private Sub Check3_Click()If Check3 = 1 ThenWinsock1.SendData "RDO2"ElseWinsock1.SendData "RDF2"End If End Sub

Private Sub Check4_Click()If Check4 = 1 Then

Winsock1.SendData "RDO3"ElseWinsock1.SendData "RDF3"End If End Sub

Private Sub Check5_Click()If Check5 = 1 ThenWinsock1.SendData "RDO4"ElseWinsock1.SendData "RDF4"End If End Sub

Private Sub Check6_Click()If Check6 = 1 ThenWinsock1.SendData "RDO5"

ElseWinsock1.SendData "RDF5"End If

By Navaismo Página - 8 -28/08/2008 www.micros.mforos.com

5/12/2018 Conectando Un Pic a Athernet Con La m2eth Board 205 - slidepdf.com

http://slidepdf.com/reader/full/conectando-un-pic-a-athernet-con-la-m2eth-board-205

Private Sub Check7_Click()If Check7 = 1 ThenWinsock1.SendData "RDO6"ElseWinsock1.SendData "RDF6"End If End Sub

Private Sub Check8_Click()If Check8 = 1 ThenWinsock1.SendData "RDO7"ElseWinsock1.SendData "RDF7"End If End Sub

'Encendemos todo el PORTDPrivate Sub Command1_Click()Check1 = 1Check2 = 1Check3 = 1Check4 = 1Check5 = 1Check6 = 1Check7 = 1Check8 = 1End Sub

'Apagamos Todo El PORTDPrivate Sub Command2_Click()Check1 = 0Check2 = 0Check3 = 0Check4 = 0Check5 = 0Check6 = 0Check7 = 0Check8 = 0End Sub

Con esto podemos observar como responde nuestro programa:

By Navaismo Página - 9 -28/08/2008 www.micros.mforos.com