You are on page 1of 11

1

Gua

POR NAVAISMO

Conectando un PIC a 2 (M ETH-BOARD) Ethernet

1
Introduccin.
odos tenemos las necesidad de experimentar con los diferentes tipos de comunicacin con nuestros PICs, hemos visto gratamente como podemos implementar comunicacin via USB, RF, con el Puerto serie de nuestra PC, es quizs por ello que me naci la cosquilla por comunicar esta vez el PIC con la PC va Ethernet.. Las ethernet al herramientas comunicacin se que encontr usaremos con este accede fin parael vaVisual Basic para hacer nuestras aplicaciones. ENC28J60 sin SPI yes una fueron el PIC Esta el necesidad de compilador 18F4520, de PC a travsel un cable de red. No es nada profesional pero sirve para iniciarse en el tema. gua que tocar los MIKROBASIC, ENC28J60 solo registros el este ultimo que es un 2 persigue del El Hardware: M ETH-BOARD. PIC ni rutinas posee del controlador publicar mis ENC28J60. para El hardware experiencias 2 Por ultimo establecer conecta que y una el cable de utilizaremos manera 2 La M ETH-BOARD de basada en el hardware que la misma hoja de datos del controlador propone: RED con en se divide el sencilla esta ENC28J60: 2 partes. un conectar La la M la primera es PIC aETHBOARD y la interfaz la la placa desegunda parte es la ethernet el Hardware cual del PIC.

By Navaismo 28/08/2008 www.micros.mforos.com Pgina - 1 -

Como en la misma hoja de datos del ENC28J60 proponen hay que cuidar los valores de las resistencias, en mi caso uso las siguientes: 6 resistencias de 182 a 1%, son usadas para los LEDs 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 los que dispositivos como mouser mas se ve en el esquemtico. electronics difciles de Y por no nos conseguir pueden activar. ultimo el pueda es el HardwareEl resolver. conector del PIC, de nmero RJ45 con los como de parte filtros se ve en la es mouser integrados figura no el 673pero nada se usa J0012D21 MCLR y es tal pero si ustedes lo necesitan lo

By Navaismo 28/08/2008 www.micros.mforos.com Pgina - 2 -

El Software del Microcontrolador


Para programar librera si no el que una dar posee. microcontrolador demostracin uso Mikrobasic La librera haba de ella. Para como ya lo deca que referirse a comentado, no manera anteriormente vamos a las libreras pretendo lo que no la ayuda PICs son compatibles. Para el uso de PICs de la familia 16F existen algunas simple. la sabe es la usar todos los esta donde explicar limitaciones, es por ello que uso un PIC18. Esta estn los SPImanual y del librera registros del Ethernet el ejemplo nos sirve ENC28J60 Library lo Pingeando para cual PIC esta permite Una vez que de ms usar las librera mas contamos de de subrutinas nos4KB subrutina sencilla con el y de ROM ahorra ICMP por Spi_Ethernet_D de Hardware lo que si con mucho este marcha bien todo sencillo Programa: oPacket(), esta hacerlo armado hardware trabajo nuestro PIC subrutina si program pingnombre del programa no necesitamos SPI pues responder responde con un saber si integrado como "eth_enc28j60" Librerias que usa el compilador include automticamente. automticamente PING, lo nuestra include "eth_enc28j60_api" por Para hacer esto a solicitudes ARP que placamymacaddr as byte [6] Variables para la MAC, IP, DNS, GW y Mascara de RED dim haremos e dim myipaddr equivale responde y as byte [4] dim a un gwipaddr as byte [4] que manera as byte [4] dim dnsipaddr esta ipmask as byte [4] dim dim byte vivo.i as 2 funciones son llamadas por la Rutina DoPacket por eso es necesario definirlas. /// Estas ////// La funcnion USERTCP sirve para la recepcion de paquetes TCP como esto solo es un ping no nos interesa y la declaramos como 0 Para sub function Spi_Ethernet_UserTCP(dim byref remoteHost as byte[4],dim remotePort, localPort, reqLength as word) as word realizar result=0 el end sub Ping ////// La funcnion USERUDP sirve para la recepcion de paquetes UDP como esto solo es un ping no nos interesa y la declaramos como 0 usamos sub function Spi_Ethernet_UserUDP(dim byref remoteHost as byte[4], dim remotePort, destPort, reqLength as word) as word la result=0
end sub main: Iniciamos el Programa adcon0=0 sin comparadores, sin ADC, Puerto A B y D como Salida adcon1=15 cmcon=7 trisa=0 porta=0 trisb=0 portb=0 trisd=0 portd=0 Direccion Fisica de nuestroPIC la MAC A3:12:45:B3:22:F1 mymacaddr[0]=0xA3 mymacaddr[1]=0x12 mymacaddr[2]=0x45 mymacaddr[3]=0xb3 mymacaddr[4]=0x22 mymacaddr[5]=0xf1 By Navaismo 28/08/2008 www.micros.mforos.com Pgina - 3 -

myipaddr[0]=192 myipaddr[1]=168 Direccion IP del PIC 192.168.1.20 myipaddr[2]=1 myipaddr[3]=20 ipmask[0]=255 ipmask[1]=255 Mascara del PIC5 55.255. 2 5.2 0 ipmask[2]=255 ipmask[3]=0 dnsipaddr[0]=192 dnsipaddr[1]=168 Direccion del DNS 192.168.1.1 dnsipaddr[2]=1 dnsipaddr[3]=1 gwipaddr[0]=192 gwipaddr[1]=168 Direccion del Gateway o Puerta de enlace 192.168.1.1 gwipaddr[2]=1 gwipaddr[3]=1

spi_init() Inicializamos el Hardware SPI del PIC spi_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 2 portd.7=0 Hacemos un Blink en el PORTD.0 para saber que vive el PIC delay_ms(500) portd.7=1 delay_ms(500) next i tryping: Comenzamos el programa principal while trae Abrimos un bucle infinito spi_ethernet_dopacket() Llamamos la subrutina DoPacket la cual procesa los paquetes provenientes de la interfaz ethernet wend goto tryping Vamos a repetirlo. end.

Para grabar nuestro programa uso el WinPIC800 y la configuracin es la siguiente:

By Navaismo 28/08/2008 www.micros.mforos.com Pgina - 4 -

Y el resultado es un PING contestado desde el PIC:

Jugando con el PORTD


Vamos a el programa encender y anterior; adems de usar Visual Basic para togglear el PORTD. apagar los Bits del El cdigo del PIC PORTD program ping nombre del programa usando el include "enc_m2eth" modulo donde se implementa el codigo ' protocolo include "eth_enc28j60" ' modulo usado por el compilador UDP, para dim ello mymacaddr as byte [6] Variables para la MAC, IP, DNS, GW y Mascara de RED dim myipaddr as byte [4] necesitamos as byte [4] dim gwipaddr dim dnsipaddr modificar as as byte [4] dim ipmask byte [4]
dim i as byte main: Iniciamos el Programa adcon0=0 sin comparadores, sin ADC, Puerto A B y D como Salida adcon1=15 cmcon=7 trisa=0 porta=0 trisb=0 portb=0 trisd=0 portd=0 Direccion Fisica de nuestro PIC la MAC A3:12:45:B3:22:F1 mymacaddr[0]=0xA3 mymacaddr[1]=0x12 mymacaddr[2]=0x45 mymacaddr[3]=0xb3 mymacaddr[4]=0x22 mymacaddr[5]=0xf1 By Navaismo 28/08/2008 www.micros.mforos.com Pgina - 5 -

myipaddr[0]=192 myipaddr[1]=168 Direccion IP del PIC 192.168.1.20 myipaddr[2]=1 myipaddr[3]=20 ipmask[0]=255 ipmask[1]=255 Mascara del PIC5 55.255. 2 5.2 0 ipmask[2]=255 ipmask[3]=0 dnsipaddr[0]=192 dnsipaddr[1]=168 Direccion del DNS 192.168.1.1 dnsipaddr[2]=1 dnsipaddr[3]=1 gwipaddr[0]=192 gwipaddr[1]=168 Direccion del Gateway o Puerta de enlace 192.168.1.1 gwipaddr[2]=1 gwipaddr[3]=1

spi_init() Inicializamos el Hardware SPI del PIC spi_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 2 portd.7=0 Hacemos un Blink en el PORTD.0 para saber que vive el PIC delay_ms(500) portd.7=1 delay_ms(500) next i tryping: Comenzamos el programa principal while trae Abrimos un bucle infinito spi_ethernet_dopacket() Llamamos la subrutina DoPacket la cual procesa los paquetes provenientes de la interfaz ethernet wend goto tryping Vamos a repetirlo. end.

Hasta implementamos este no ser nuestro cdigo momento funcin iguala para a USERTCP todo hacer que si ser igualada a cero pues no la necesitamos. cero pues nuestro PORTD parece si cdigo del responda, esta modulo enc_m2eth igual, El queremos vez la funcin pero module enc_m2eth nuestro modulo evaluar USERUDP hemos include "eth_enc28j60_api" ' Modulo del compilador los aadido paquetes eldim getRequest as byte[20] modulo ' variables de uso general as byte[30] que dyna as string[20] enc_m2 txt tengan eth i que as byte este No evaluamos paquetes TCP por lo que la funcion es 0 es donde /////// sub function protocolo. Spi_Ethernet_UserTCP(dim byref remoteHost as byte[4], dim remotePort, localPort, reqLength as word) as word result=0 Sin sub end embargo '/////// ' Implementamos la recepcion de paquetes UDP reseteando siempre el resultado a 0 lasub function Spi_Ethernet_UserUDP(dim byref remoteHost as byte[4], dim remotePort, destPort, reqLength as word) as word
result = 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 ethernet getRequest[i]=spi_ethernet_getbyte() 'captamos 3 esta ocasion debido al codigo de VB next i

By Navaismo 28/08/2008 www.micros.mforos.com Pgina - 6 -

'//////////// RUTINA PARA ENCENDER BITS EN EL PORTD if getrequest[0]="R" then if getRequest[1]="D" then if getRequest[2]="O" then select case getRequest[3] case "0" PORTD.0=1 txt = "RD0 ENCENDIDO" case "1" PORTD.1=1 txt = "RD1 ENCENDIDO" case "2" PORTD.2=1 txt = "RD2 ENCENDIDO" case "3" PORTD.3=1 txt = "RD3 ENCENDIDO" case "4" PORTD.4=1 txt = "RD4 ENCENDIDO" case "5" PORTD.5=1 txt = "RD5 ENCENDIDO" case "6" PORTD.6=1 txt = "RD6 ENCENDIDO" case "7" PORTD.7=1 txt = "RD7 ENCENDIDO" end select cls lcd_out(1,1,txt) end if end if end if '/////////// RUTINA PARA APAGAR BITS EN EL PORTD if getrequest[0]="R" then if getRequest[1]="D" then if getRequest[2]="F" then select case getRequest[3] case "0" PORTD.0=0 txt = "RD0 APAGADO" case "1" PORTD.1=0 txt = "RD1 APAGADO" case "2" PORTD.2=0 txt = "RD2 APAGADO" case "3" PORTD.3=0 txt = "RD3 APAGADO" case "4" PORTD.4=0 txt = "RD4 APAGADO" case "5" PORTD.5=0 txt = "RD5 APAGADO" case "6" PORTD.6=0 txt = "RD6 APAGADO" case "7" PORTD.7=0 txt = "RD7 APAGADO" end select cls lcd_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 buffer spi_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 - 1 wend end if end sub By Navaismo 28/08/2008 www.micros.mforos.com Pgina - 7 -

Prcticamente lo que hacemos es evaluar los paquetes que entran al puerto 200 UDP2 de la M ETHBOARD. Filtrando cadena con el Bit que se encendi o se apago. la cadena enviada desde la PC. Y cuando es El cdigo de Visual Basic. recibido Para poder automticamente Basic debido manipular la a su facilidad por acceder a estos puertos usando el control WINSOCK. se regresa los bits del Para esta miniguia propngo el siguiente codigo ya que cumple con las condiciones PIC va del programa del PIC: Ethernet necesitamos Private sub Form_Load() ' puerto usar unPORTD = sckUDPProtocol Protocolo que usa el socket Winsock1.Protocol programa, Winsock1.RemoteHost = "192.168.1.20" IP remota la del PIC Winsock1.RemotePort Puerto a enviar los paquetes en este caso1002 = 200 Puerto donde escucha la PC Winsock1.Bind End sub uso el Visual
'Cachamos datos para funcniones del PORTD Private Sub winsock1_DataArrival(ByVal bytesTotal As Long) Dim strData As String Winsock1.GetData strData Text3.Text = strData End Sub 'Enviamos datos para toggle de bits del PORTD Private Sub Check1_Click() If Check1 = 1 Then Winsock1.SendData "RDO0" Else Winsock1.SendData "RDF0" End If End Sub Private Sub Check2_Click() If Check2 = 1 Then Winsock1.SendData "RDO1" Else Winsock1.SendData "RDF1" End If End Sub Private Sub Check3_Click() If Check3 = 1 Then Winsock1.SendData "RDO2" Else Winsock1.SendData "RDF2" End If End Sub Private Sub Check4_Click() If Check4 = 1 Then Winsock1.SendData "RDO3" Else Winsock1.SendData "RDF3" End If End Sub Private Sub Check5_Click() If Check5 = 1 Then Winsock1.SendData "RDO4" Else Winsock1.SendData "RDF4" End If End Sub Private Sub Check6_Click() If Check6 = 1 Then Winsock1.SendData "RDO5" Else Winsock1.SendData "RDF5" End If By Navaismo 28/08/2008 www.micros.mforos.com Pgina - 8 -

Private Sub Check7_Click() If Check7 = 1 Then Winsock1.SendData "RDO6" Else Winsock1.SendData "RDF6" End If End Sub Private Sub Check8_Click() If Check8 = 1 Then Winsock1.SendData "RDO7" Else Winsock1.SendData "RDF7" End If End Sub 'Encendemos todo el PORTD Private Sub Command1_Click() Check1 = 1 Check2 = 1 Check3 = 1 Check4 = 1 Check5 = 1 Check6 = 1 Check7 = 1 Check8 = 1 End Sub 'Apagamos Todo El PORTD Private Sub Command2_Click() Check1 = 0 Check2 = 0 Check3 = 0 Check4 = 0 Check5 = 0 Check6 = 0 Check7 = 0 Check8 = 0 End Sub

Con esto podemos observar como responde nuestro programa:

By Navaismo 28/08/2008 www.micros.mforos.com Pgina - 9 -

You might also like