edtp frame thrower - 148.206.53.231

87
Universidad Autónoma Metropolitana PROYECTO TERMINAL “Comunicación IP de microcontroladores” Alumno: Carrillo Arellano Carlos Ernesto Matrícula: 203213256 Asesor: Dr. Miguel Ángel Ruiz Sánchez Abstract La comunicación directa entre un microcontrolador y una PC abre un extenso panorama para el desarrollo de aplicaciones. Integrar un microcontrolador a una red IP le brinda un poder de comunicación enorme con otros procesadores o computadoras que se encuentren integrados a dicha red. Es por esto que en el siguiente trabajo se analiza la implementación de un sistema capaz de entablar comunicación IP entre un microcontrolador (ATMega8515) y una PC. Para alcanzar el propósito de este proyecto el desarrollo parte de lo simple a lo complejo. En una primera parte se implementará una comunicación Ethernet, de manera que facilite la transición a tecnología de comunicaciones IP. Para este propósito se utilizo una interfaz Ethernet (EDTP Frame Thrower) cuyo funcionamiento se basa principalmente en el CI ENC28J60. El proceso de configuración, funcionamiento y desempeño del mismo, se analiza de manera profunda en este trabajo. La comunicación se realizó haciendo uso de software especializado para construcción de tramas (Colasoft Packet Builder) y se monitoreo con un analizador de protocolos (WireShark). México D.F. Diciembre 2008

Upload: others

Post on 23-Nov-2021

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: EDTP Frame Thrower - 148.206.53.231

Universidad

Autónoma

Metropolitana

PROYECTO TERMINAL

“Comunicación IP de microcontroladores”

Alumno: Carrillo Arellano Carlos Ernesto Matrícula: 203213256 Asesor: Dr. Miguel Ángel Ruiz Sánchez

Abstract La comunicación directa entre un microcontrolador y una PC abre un extenso panorama para el desarrollo de aplicaciones. Integrar un microcontrolador a una red IP le brinda un poder de comunicación enorme con otros procesadores o computadoras que se encuentren integrados a dicha red. Es por esto que en el siguiente trabajo se analiza la implementación de un sistema capaz de entablar comunicación IP entre un microcontrolador (ATMega8515) y una PC. Para alcanzar el propósito de este proyecto el desarrollo parte de lo simple a lo complejo. En una primera parte se implementará una comunicación Ethernet, de manera que facilite la transición a tecnología de comunicaciones IP. Para este propósito se utilizo una interfaz Ethernet (EDTP Frame Thrower) cuyo funcionamiento se basa principalmente en el CI ENC28J60. El proceso de configuración, funcionamiento y desempeño del mismo, se analiza de manera profunda en este trabajo. La comunicación se realizó haciendo uso de software especializado para construcción de tramas (Colasoft Packet Builder) y se monitoreo con un analizador de protocolos (WireShark).

México D.F. Diciembre 2008

Page 2: EDTP Frame Thrower - 148.206.53.231

2

UNIVERSIDAD AUTÓNOMA METROPOLITANA

INDICE 1.EL PROYECTO 1.1 INTRODUCCION ............................................................4 1.1 DESCRIPCION DEL PROYECTO ............................................................4 1.2 OBJETIVOS DEL PROYECTO ............................................................5 2. EL ESTÁNDAR DE COMUNICACIONES SPI 2.1 INTRODUCCION ............................................................6 2.2 DESCRIPCIÓN ............................................................6 2.3 INTERFASE ............................................................7 2.4 COMUNICACIÓN ............................................................7 2.5 CONCLUSIONES ............................................................7 3. INTERFAZ ETHERNET 3.1 INTRODUCCION ............................................................8 3.2 CARACTERISTICAS DEL ENC28J60 ............................................................8 3.3 ORGANIZACIÓN DE MEMORIA ............................................................9 3.4 ENC28J60 SPI ............................................................10 3.5 COMANDOS SPI ............................................................10 3.6 EDTP FRAME THROWER ............................................................11 3.6.1 DESCRIPCION ............................................................11 3.6.2 CARACTERISTICAS ............................................................11 3.6.3 DIAGRAMA DE CONEXION ............................................................11 4. DISPOSITIVOS EXTERNOS 4.1 DESCRIPCION ............................................................12 4.2 FUENTE DE VOLTAJE ............................................................12 4.2.1 DIAGRAMA DE CONEXIÓN ............................................................12 4.2.2 IMPLEMENTACION FINAL ............................................................12 4.3 DISPLAY 4.3.1 DESCRIPCION ............................................................13 4.3.2 DIAGRAMA DE CONEXIÓN ............................................................13 4.3.3 IMPLEMENTACION FINAL ............................................................13 5. TRAMA ETHERNET 5.1 INTRODUCCION ............................................................14 5.2 FORMATO DE LA TRAMA …………………………………………….14 5.2.1 PREAMBLE & SOF …………………………………………….15 5.2.2 DESTINATION ADDRESS …………………………………………….15 5.2.3 SOURCE ADDRESS …………………………………………….15 5.2.4 TYPE/LENGTH …………………………………………….15 5.2.5 DATA …………………………………………….15 5.2.6 PADDING ………………………………………….....15 5.2.7 CRC ………………………………………….....15 6. MODULO SPI DEL ATMega8515 6.1 PINES …………………………………………....16 6.2 INICIALIZACION …………………………………………....16

Page 3: EDTP Frame Thrower - 148.206.53.231

3

UNIVERSIDAD AUTÓNOMA METROPOLITANA

7. INICIALIZACION DEL ENC28J60 7.1 INTRODUCCION …………………………………………....17 7.2 ESCRITURA DE REGISTROS …………………………………………....17 7.2.1 PROCEDIMIENTO …………………………….…………......17 7.2.2 OSCILOSCOPIO …………………………………………....18 7.3 LECTURA DE REGISTROS 7.3.1 PROCEDIMIENTO …………....….…...………….…………...19 7.3.2 OSCILOSCOPIO …………….....…...……………………….21 7.3.3 REGISTROS MAC & MII ………………….....……………………....22 7.4 INICIALIZACION DEL BUFFER .............................................................25 7.4.1 PROGRAMACION DEL BUFFER………………………….......………...…...26 7.5 FILTROS DE RECEPCION ………………………………......…...…...27 7.6 DIRECCION MAC Y REGISTROS ...…………………………………......…...28 7.7 PRUEBA DE COMUNICACION ..............................................................30 8. INTERRUPCIONES 8.1 DESCRIPCION E IMPLEMENTACION ..............................................................32 9. PRUEBA DE RECEPCION 9.1 INICIALIZACION ..............................................................34 9.2 PACKET BUILDER ..............................................................34 8.3 IMPLEMENTACION ..............................................................37 8.4 RESULTADOS ..............................................................39 10. PRUEBA DE TRANSMISION 10.1 DESCRIPCION ..............................................................40 10.2 WIRESHARK ..............................................................40 10.3 IMPLEMENTACION ..............................................................42 10.4 RESULTADOS ..............................................................43 11. PING 11.1 DESCRIPCION ...............................................................44 11.2 IMPLEMENTACION ...............................................................44 11.3 DIAGRAMA DE FLUJO ...............................................................48 11.4 RESULTADOS ...............................................................49 12. CONCLUSIONES ...............................................................50 13. BIBLIOGRAFIA ...............................................................52 14. PAGINAS WEB ...............................................................53 APENDICE A INICIALIZACION Y RECEPCION ...............................................................54 APENDICE B TRANSMISION E PAQUETES ...............................................................66 APENDICE C PING ...............................................................75

Page 4: EDTP Frame Thrower - 148.206.53.231

4

UNIVERSIDAD AUTÓNOMA METROPOLITANA

1. EL PROYECTO 1.1 INTRODUCCION Día a día la tecnología IP continua revolucionando las aplicaciones actuales de

comunicaciones, crece imparablemente el amplio espectro de aplicaciones que pueden hacer uso de esta tecnología, pues entre sus grandes ventajas se encuentra la movilidad y el acceso remoto.

El poder integrar dispositivos a una red IP incrementa sustancialmente el desempeño de éstos, pues la comunicación dentro de una red IP nos brinda la posibilidad de crear un sin fin de aplicaciones muy poderosas y compartidas, pues IP se encuentra presente en una de las redes mas importantes de los últimos tiempos, Internet.

Un microcontrolador es una herramienta que nos permite implementar tantas

aplicaciones como nuestra imaginación y el hardware mismo nos lo permita, la posibilidad de integrar este dispositivo a una red IP permitirá establecer comunicaciones entre éste y otros dispositivos conectados a dicha red (PC’s u otros microcontroladores). Es bien sabido que las comunicaciones en una red IP presentan ciertas desventajas, pues el uso de datagramas en una red de conmutación de paquetes es susceptible a la presencia de errores, a arribos desordenados de paquetes, duplicación de paquetes o perdida de los mismos. A pesar de estas dificultades IP sigue siendo una de las tecnologías de comunicaciones más populares de la actualidad.

1.1 DESCRIPCIÓN DEL PROYECTO En este proyecto se desarrolla la integración del protocolo de comunicaciones IP

al microcontrolador ATMega8515. Para alcanzar este propósito se implementa como primera etapa la comunicación entre una PC y el microcontrolador a través de paquetes Ethernet. Para poder facilitar el establecimiento de esta comunicación se hace uso de una interfaz Ethernet, cuya principal característica consiste en incluir dentro de su hardware todas las características de comunicación Ethernet y comunicarse vía SPI con el microcontrolador.

La interfaz Ethernet usada en este proyecto es la tarjeta “EDTP Frame Thrower” cuyo funcionamiento se basa en el CI ENC28J60; esta tarjeta cuenta con una interfaz de comunicación SPI siendo este protocolo de comunicación muy popular en microcontroladores. En este trabajo se muestra de manera detallada el proceso de configuración y desempeño del ENC28J60 y la implementación de la comunicación entre la PC y el microcontrolador.

La comunicación Ethernet entre PC y microcontrolador se basa principalmente en

transmisión de paquetes con características especiales, dichos paquetes pueden interpretarse como instrucciones para el microcontrolador, es obligación del microcontrolador responder a la petición de dichos paquetes. La figura 1 muestra un diagrama de bloques general de la primera etapa del proyecto.

De la figura 1 nótese que el microcontrolador ATMega8515 tiene conectado un

modulo de display el cual se encargara de visualizar la comunicación Ethernet así como el proceso de configuración del ENC28J60. Además se uso en la PC software especializado donde el “Packet builder” es un programa que permite la construcción de paquetes y la transmisión de los mismos, mientras que el “Wireshark” es un analizador de protocolos que permitirá monitorear el trafico de paquetes en el UTP.

Page 5: EDTP Frame Thrower - 148.206.53.231

5

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Figura 1 Diagrama de bloques del proyecto

1.2 OBJETIVOS DEL PROYECTO

Este proyecto pretende alcanzar el establecimiento de comunicación entre un micro controlador y una PC haciendo uso de un PING. El comando PING enviará paquetes al micro controlador, el cual tendrá como tareas: verificar las direcciones lógicas (IP), determinar que paquetes van dirigidos a él y responder en dado caso, manejar una interfaz para el usuario, que permita monitorear la comunicación. Esta primera etapa, es solo el incipiente nacimiento de un proyecto de mayor envergadura, pues, el alcance de los objetivos anteriores, facilitaría de sobre manera la inserción del microcontrolador a una red local, así como la posible implementación de diversos comandos de comunicación entre PC´s y microcontroladores, esto crearía un mundo mayor de posibilidades, pues el alcance una red local se puede extender a Internet, pudiendo crearse aplicaciones remotas y en tiempo real entre el microcontrolador y un host de internet .

Page 6: EDTP Frame Thrower - 148.206.53.231

6

UNIVERSIDAD AUTÓNOMA METROPOLITANA

2. EL ESTÁNDAR DE COMUNICACIONES SPI

2.1 INTRODUCCIÓN Uno de los aspectos medulares para la implementación de este proyecto es la

comprensión del estándar de comunicaciones SPI, éste resulta ser la forma de comunicación usada por la interfaz Ethernet (EDTP Frame Thrower) hacia cualquier dispositivo. El uso del microcontrolador ATMega8515 facilita la tarea de comunicación con la interfaz Ethernet, pues éste incorpora el estándar de comunicaciones SPI.

2.2 DESCRPCIÓN1 El SPI (Serial Peripheral Interface) es un estándar de comunicaciones creado por

Motorota que opera en modo full-duplex, síncrono y usando transmisión serial de datos. Este estándar ofrece una transferencia de datos a altas velocidades (Mbps) La interconexión entre dos dispositivos SPI siempre ocurre entre un dispositivo maestro

y un dispositivo esclavo. El dispositivo maestro es la parte activa en este sistema y provee la señal de reloj sobre la que se basa la transmisión de datos seriales. El dispositivo esclavo no es capaz de generar la señal de reloj y por ende no le es posible funcionar sin un dispositivo maestro además de no poder iniciar la transmisión de datos. El dispositivo esclavo únicamente envía y recibe datos si el dispositivo maestro genera la señal de reloj necesaria. El dispositivo maestro por su parte genera la señal de reloj únicamente mientras envía datos, esto significa que el dispositivo maestro debe enviar datos al esclavo para poder leer datos desde el esclavo.

2.3 INTERFASE2 El estándar SPI especifica cuatro señales lógicas que llevan a cabo la comunicación

SPI.

SCLK – Shift Clock (señal de salida del master)

MOSI – Master Output Slave Input (señal de salida del master)

MISO – Master Input Slave Output (señal de entrada del master)

SS – Slave Select (activado por nivel bajo, salida del master)

En la figura 2 se puede apreciar un esquema que representa la dirección de las señales

lógicas del SPI.

Figura 2 Dirección de señales lógicas del SPI

1 Application Notes AVR – AVR151 “Setup and use of the SPI”

2 Serial Periphelal Interface – Wikipedia

Page 7: EDTP Frame Thrower - 148.206.53.231

7

UNIVERSIDAD AUTÓNOMA METROPOLITANA

2.4 COMUNICACIÓN3

La interconexión entre dispositivos que posean SPI se muestra en la figura 3. El sistema consiste en 2 registros de corrimiento y un generador de reloj maestro. El SPI maestro inicia el ciclo de comunicación cuando coloca un nivel bajo en el pin SS (Slave select) del dispositivo esclavo. Maestro y esclavo preparan el dato a transmitir en sus respectivos registros de corrimiento y a continuación el dispositivo maestro genera los pulsos de reloj requeridos en la línea SCKL para intercambiar datos. La información es que va del dispositivo maestro al esclavo viaja en la línea MOSI (Master Output Slave Input), mientras que los datos que van de esclavo a maestro viajan por la línea MISO (Master Input Slave Output). Después de la transmisión de cada trama de datos, el maestro sincroniza al esclavo colocando un nivel alto en la línea de control SS.

Figura 3 Interconexión SPI Master/Slave

2.5 CONCLUSIONES

Sin lugar a dudas un buen entendimiento de estándar SPI permite comprender el proceso de comunicación realizado entre el ATMega8515 y el ENC28J65, estos dispositivos se comunicaran mediante este estándar y durante la realización de este proyecto la falta de comprensión de este estándar fue una de las causas principales por las que existieron problemas para establecer la comunicación. Esto represento atrasos en el desarrollo del proyecto y varias pruebas fallidas. Vale la pena finalizar esta pequeña descripción del estándar de comunicaciones SPI recalcando uno de los aspectos que tiene mucha importancia para este proyecto, y es que efectivamente el dispositivo maestro solo permite leer del dispositivo esclavo siempre y cuando haya comunicación entre estos, es decir, que exista la señal de reloj necesaria para que los registros de corrimiento realicen su función. Esta característica resulta un tanto confusa, y mas adelante veremos el por que.

3 Data Sheet – AVR ATMega 8515

Page 8: EDTP Frame Thrower - 148.206.53.231

8

UNIVERSIDAD AUTÓNOMA METROPOLITANA

3. INTERFAZ ETHERNET 3.1 INTRODUCCION Uno de los dispositivos que adquieren un papel relevante para la realización de este

proyecto es el CI ENC28J60 de Microchip, este dispositivo es un controlador Ethernet con interfaz SPI, esta diseñado para actuar como interfaz de red Ethernet para cualquier controlador equipado con SPI. Este CI exige algunos algunos componentes pasivos para su funcionamiento, dichos elementos pueden adquirirse con cierta facilidad. La función que realiza este dispositivo en el proyecto es uno de las mas importantes, y hasta cierto punto complejas, pues esta encargado de leer los datos provenientes de la tarjeta de red de la PC, almacenarlos en memoria, y comunicarlos con el microcontrolador ATMega8515. En la figura 4 podemos apreciar un esquema típico de aplicación de este CI.

3.2 CARACTERISTICAS4 DEL ENC28J60 A continuación se enumeran las caracteristicas fundamentales del ENC28J60 para

este poyecto CARACTERISTICAS ETHERNET

Controlador Ethernet compatible con el estandar IEEE 802.3

Compatible con redes 10/100/1000Base-T

Soporta modos Full y Half-Duplex

Pading y generacion de CRC programable

Rechazo automatico de paquetes erroneos programable

Interfase SPI con velocidades de reloj de hasta 20MHz

CARACTERISTICAS DEL BUFFER

Memoria de 8Kbytes para paquetes de transmisión/recepción

Tamaño de buffer de transmisión/recepción programable

Manejo automatico del buffer FIFO cilrcular

Calculo automatico de checksum para diferentes protocolos MEDIUM ACCES CONTROL (MAC)

Soporta paquetes Unicast, Multicast & Broadcast

Filtros programables para la recepcion de paquetes OPERACIONAL

Un pin de interrupción de salida

Requiere un reloj de 25MHz

Voltaje de operación de 3.1V a 3.6V (3.3v típico)

Tolerante a entradas TTL

4 Data sheet – Microchip ENC28J60

Page 9: EDTP Frame Thrower - 148.206.53.231

9

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Figura 4. Esquema típico de aplicación

3.3 ORGANIZACIÓN DE MEMORIA

Toda la memoria en el ENC28J60 esta implementada como RAM estática. Existen tres tipos de memoria en el ENC28J60

Registros de control

Buffer Ethernet

Registros PHY Los registros de control son aquellos que se usan para la configuración, control y status

del ENC28J60. Los registros de control son directamente leídos y modificados vía la interfaz SPI.

El buffer Ethernet ubica la memoria de transmisión y recepción en un solo espacio de

memoria. El tamaño de las áreas de memoria son programables usando la interfaz SPI. El buffer Ethernet solo puede ser accesado mediante los comandos SPI “read buffer memory” y “write buffer memory”

Figura 5 Organización de memoria del ENC28J60

Page 10: EDTP Frame Thrower - 148.206.53.231

10

UNIVERSIDAD AUTÓNOMA METROPOLITANA

3.4 ENC28J60 SPI El ENC28J60 esta diseñado para interactuar directamente vía SPI con cualquier

dispositivo que posea este estándar. La implementación usada en este dispositivo soporta únicamente el modo SPI 0,0, afortunadamente el SPI incluido en el ATMega8515 puede ser programado para trabajar en cualquier modo SPI.

Comandos y datos son enviados al dispositivo ENC28J60 por el pin SI, los datos

enviados son muestreados en el flanco de subida de SCK. Los datos de salida son enviados a través del pin SO y muestreados en el flanco de bajada de SCK. El pin CS debe mantenerse en un nivel bajo mientras se realice cualquier operación y debe regresar a un estado alto cuando termine el proceso de comunicación.

3.5 COMANDOS SPI La operación del ENC28J60 depende enteramente de los comandos que recibe del

controlador externo vía SPI. Estos comandos toman la forma de instrucciones, de uno o más bytes, para acceder a la memoria del dispositivo. Estas instrucciones consisten de un opcode de tres bits seguido de un argumento de 5 bits que puede especificar la dirección de un registro o un dato constante.

Un total de siete instrucciones son implementadas en el ENC28J60, la tabla 1 muestra los códigos para cualquier operación.

TABLA 1 CONJUNTO DE INSTRUCCIONES PARA ENC28J60

a = dirección de registro de control d = datos Durante la realización de este proyecto se explicará de manera mas detallada el uso de cada una de las instrucciones del ENC28J60. Dado que el ENC28J60 requiere todo un conjunto de elementos pasivos para su uso, el mercado nos ofrece tarjetas que contienen todos los elementos pasivos necesarios para el funcionamiento del ENC28J60 integrados y listas para conectar únicamente las terminales del SPI, este tipo de dispositivos nos ahorran tiempo a la hora de implementar el proyecto, tal es el caso del “EDPT Frame Thrower” usado en este proyecto

Page 11: EDTP Frame Thrower - 148.206.53.231

11

UNIVERSIDAD AUTÓNOMA METROPOLITANA

3.6 EDTP FRAME THROWER

3.6.1 DESCRIPCION

El “Frame Thrower” es un módulo Ethernet fabricado por EDTP5, y ha sido desarrollado para prestar una solución sencilla y accesible como interfaz para la comunicación Ethernet. El “Frame Thrower es un módulo 10Base-T basado en el nuevo circuito integrado de Microchip ENC28J60, este módulo actúa como interfase para cualquier controlador equipado con una interfase de comunicación SPI. El módulo consta de todos los componentes necesarios para el funcionamiento del ENC28J60, un cristal a 25MHz, Terminal RJ-45, terminales definidas para la interfaz SPI, todo con la finalidad de integrar una herramienta fácil de implementar en cualquier aplicación.

3.6.2 CARACTERISTICAS

Operación 10Base-T

Interfaz estándar SPI

CI Microchip ENC28J60 Ethernet

RJ-45 y magnetos integrados

LEDs de status integrados al RJ-45

Cristal a 25 MHz

Terminales para comunicación SPI

Terminal para interrupciones

Alimentación requerida 3.3V (no incluida)

3.6.3 DIAGRAMA DE CONEXION

5 Actualmente este articulo ha salido de la línea de producción de EDTP

Page 12: EDTP Frame Thrower - 148.206.53.231

12

UNIVERSIDAD AUTÓNOMA METROPOLITANA

4. DISPOSITIVOS EXTERNOS

4.1 DESCRIPCION Hasta este punto se puede apreciar que no solo basta establecer comunicación entre el microcontrolador y la interfase Ethernet, sino que también es necesario crear interfaz visual para el usuario del proyecto, es decir, una herramienta de monitoreo de la comunicación, que permita verificar todos los procesos de comunicación entre el microcontrolador y el ENC28J60. Sumado a esto es necesario construir una fuente de voltaje que permita alimentar todo el sistema con 5V y con este voltaje mantener una fuente de voltaje de 3.3V necesarios para el funcionamiento del EDTP Frame Thrower

4.2 FUENTE DE VOLTAJE

Para el funcionamiento de la interfaz Ethernet EDTP Frame Thrower es necesaria una alimentación de 3.3V, para este fin se utilizo el regulador de voltaje LF33CV el cual ofrece un voltaje constante de 3.3V. El diseño de esta fuente tiene como principal objetivo eliminar el uso de diferentes fuentes de voltaje para el funcionamiento del sistema, con la implementación de esta fuente obtenemos un sistema integral que utiliza únicamente una alimentación de 5V, pero por razones de seguridad el voltaje ofrecido por esta fuente siempre se estará monitoreando con un multímetro.

4.2.1 DIAGRAMA DE CONEXION

4.2.2 IMPLEMENTACION FINAL

Regulador de voltaje LF33CD

Botón RESET del ENC28J60

Conexiones con el EDTP Frame Thrower

Conexiones para la comunicación SPI

Page 13: EDTP Frame Thrower - 148.206.53.231

13

4.3 DISPLAY 4.3.1 DESCRIPCIÓN

Sin lugar a dudas una herramienta de mucha utilidad para este proyecto es la interfaz visual que permita verificar la comunicación entre el microcontrolador y la PC. Esta interfaz visual consiste en 4 displays de 7 segmentos (ánodo común) conectados de tal forma que puedan ser controlados por dos puertos del microcontrolador mediante el multiplexado del ánodo común (selector). El multiplexado del ánodo común de cada uno de los displays es efectuado por el microcontrolador, de tal forma que el efecto visual perceptible para el ojo humano es apreciar que los cuatro displays se encuentran encendidos al mismo tiempo. La función básica de esta interfaz es monitorear el proceso de configuración del CI ENC28J60 y permite mostrar las tramas recibidas por el microcontrolador.

4.3.2 DIAGRAMA DE CONEXIÓN Nótese que se usan transistores y resistencias en el ánodo común para poder aislar el puerto del microcontrolador de la alta demanda de corriente de los displays de 7 segmentos

4.3.3 IMPLEMENTACIÓN FINAL

En la siguiente imagen se puede apreciar el resultado final de la implementación del display. Se aclara que el display ha sido protegido para que las conexiones (no visibles) no sufran ninguna alteración. Claramente se pueden apreciar 2 “buses” de entrada de datos, uno de 7 segmentos y el otro de 4. Estos buses serán manejados por el microcontrolador

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 14: EDTP Frame Thrower - 148.206.53.231

14

5. ETHERNET 5.1 INTRODUCCION

Antes de pasar a la implementación del proyecto es necesario y será de gran ayuda revisar la estructura de una típica trama de datos Ethernet. El propósito de este resumen será proporcionar un conocimiento profundo sobre el formato de la trama Ethernet y la comprensión de cada uno de los campos que componen la trama de datos. El profundo conocimiento de la trama de datos servirá para poder procesar esta información con ayuda del microcontrolador.

5.2 FORMATO DE LA TRAMA Una trama de datos que cumpla la norma IEE 802.3 Ethernet consiste de 64 a 1518

bytes de longitud. La trama consiste de 5 o 6 campos. Una dirección MAC destino, una dirección MAC fuente, un campo de tipo o longitud, el campote datos y una campo opcional CRC (Cyclic Redundancy Check). Adicionalmente cuando esta trama se transmite sobre un medio se le agrega un campo de sincronía (preamble) y un campo de señalización de inicio de trama (Start Of Frame ,SOF), así el trafico visto sobre un cableado Ethernet se verá como en la figura 6

Figura 6 Formato de un paquete Ethernet

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 15: EDTP Frame Thrower - 148.206.53.231

15

5.2.1 PREAMBLE & SOF Cuando se transmiten o se reciben datos con el ENC28J60 el campo PREAMBLE Y SOF

será automáticamente generado o eliminado de los paquetes ya sean transmitidos o

recibidos. El controlador no necesitara preocuparse por su manejo. 5.2.2 DESTINATION ADDRESS El campo DESTINATION ADDRESS consiste en 6 bytes que contienen la dirección MAC

del dispositivo al que el paquete es transmitido. El ENC28J60 incorpora filtros que pueden descartar o aceptar paquetes con DESTINATION ADDRESS Multicast, Broadcast y Unicast. Para el propósito de este trabajo se decidió hacer uso del filtro Unicast.

5.2.3 SOURCE ADDRESS El campo SOURCE ADDRESS consiste de 6 bytes con la dirección MAC del nodo que ha

creado el paquete Ethernet. Cuando se transmiten paquetes la dirección MAC puede ser determinada por el usuario para el ENC28J60. Es importante notar que cuando se transmite una trama con el ENC28J60 este no incorpora la SOURCE ADDRESS automáticamente, es necesario escribirla en la trama manualmente.

5.2.4 TYPE/LENGHT Este campo consta de 2 bytes y define a que protocolo pertenece el paquete.

Alternativamente si este campo es llenado con el contenido 05DCh(1500) o cualquier numero menor el campo es considerado un campo de LENGHT y especifica la cantidad de padding que continua al campo de datos. Si se esta usando algún protocolo este campo deberá contener el TYPE de dicho protocolo.

5.2.5 DATA El campo de datos es un campo variable que va de 0 a 1500 bytes. Paquetes que

sobrepasen esta cantidad violan el estándar Ethernet y serán ignorados por los nodos Ethernet.

5.2.6 PADDING El campo PADDING es un campo variable agregado para cumplir con el estándar IEEE

802.3 , que indica que un paquete no puede ser menor a 60 bytes. Si el campo de datos es menor a 46 bytes el campo PADDING es necesario. EL ENC28J60 automáticamente rechazara paquetes menores a 18 bytes.

5.2.7 CRC Este es un campo de 4 bytes un estándar de 32-bit CRC calculado con los datos de

destination, source, type, data y padding. El ENC28J60 es capaz de verificar que un paquete recibido contenga un CRC valido y además puede generar y agregar automáticamente el CRC a un paquete para transmisión

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 16: EDTP Frame Thrower - 148.206.53.231

16

6. MODULO SPI DEL ATMega8515 6.1 PINES

El microcontrolador ATMega8515 posee un dispositivo de comunicación SPI, cuyas señales lógicas son distribuidas en el puerto B de la siguiente forma

Es importante notar que la dirección de los pines (entrada, salida) depende del modo en el que se configure el dispositivo (master / slave).

6.2 INICIALIZACION

A continuación se enumeran los pasos necesarios para la configuración del modulo SPI del microcontrolador ATMega8515

Configurar los pines del puerto B como entrada o salida dependiendo del modo de uso del SPI, para este proyecto es necesaria la configuración como maestro

; HABILITACION DE MOSI, SS & SCK COMO SALIDAS, TODAS LOS OTROS ;PINES SON ENTRADAS ldi TEMP, (1<<DDB5)| (1<<DDB7)| (1<<DDB4) out DDRB,TEMP

Se habilita el dispositivo SPI (1<<SPE) , se configura el modo de operación del SPI como maestro(1<<MSTR), se deshabilita la subrutina de atención a interrupción del SPI (0<<SPIE) y se configura la frecuencia fosc/4 del reloj para SCK (SPR1,SPR0), todo esto se hace escribiendo en el registro de control SPCR

; DESHABILITACION DE SPIE, HABILITACION DEL SPI, Master ;mode, clock rate fck/4 ldi TEMP,(0<<SPIE)|(1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0) out SPCR,TEMP

El SPI incluido en el ATMega8515 tiene la posibilidad de elevar la frecuencia de reloj al doble configurando el registro SPSR de la siguiente forma, con esto tenemos fosc/2

ldi TEMP,(1<<SPI2X) ;HABILITACION DE VELOCIDAD 2X out SPSR,TEMP

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 17: EDTP Frame Thrower - 148.206.53.231

17

7. INICIALIZACION DEL ENC28J60 7.1 INTRODUCCION

Antes de poder recibir o transmitir cualquier paquete es necesario cumplir con el proceso de inicialización de algunos dispositivos del ENC28J60. Normalmente el proceso de inicialización basta con ejecutarse una sola vez y no será necesario modificarlo posteriormente en la ejecución de la aplicación. Se explicara de manera muy clara el proceso de escritura y lectura de registros de control del ENC28J60 para poder realizar la inicialización del dispositivo

7.2 ESCRITURA DE REGISTROS

Para poder escribir un registro de control del ENC28J60 se utiliza la instrucción SPI Write Control Register (010 aaaaa ddddddd), véase Tabla 1

donde aaaaa es la dirección del registro de control y dddddddd es el byte que se desea escribir en dicho registro. A pesar de que este procedimiento pareciera complejo, nos facilita el desarrollo de una función para poder escribir en cualquier registro y reducir el código del programa.

7.2.1 PROCEDIMIENTO Definir el opcode para la instrucción WCR

.equ WCR = 0x40 (en binario tendríamos 0100 0000 )

Definir la dirección del registro de control (en la hoja de datos del ENC28J60 se encuentra el listado de direcciones de los registros de control) para este ejemplo escribiremos en el registro ECON1 que se encuentra en todos los bancos de registros

.equ ECON1 = 0x1F (en binario tendríamos 0001 1111 )

Cargamos el registro que se escribirá en la variable register

ldi register,ECON1

Almacenamos el valor que deseamos escribir en la variable data y llamamos a la función WCR

ldi data, 0b00010000 rcall WCR

Diseño de la función WCR en donde colocamos el pin SS en cero y transmitimos el valor anterior (reg)

WCR: ori register, WCR ;SE AGREGA EL OPCODE WCR clr TEMP ;SS SE PONE A CERO out PORTB,TEMP out SPDR,register ;SE INICIA LA TRANSMISION DE REGISTER

Wait_Transmit: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 18: EDTP Frame Thrower - 148.206.53.231

18

Al terminar de transmitir register procedemos a transmitir el byte (data) que queremos

almacenar en el registro y al finalizar la transmisión se pone un nivel alto en el pin SS para sincronía

out SPDR,data ;SE TRANSMITEN EL DATO PARA ALMACENAR EN REG Wait_Transmit2: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit2 ser TEMP ;SS=1 out PORTB,TEMP ret

7.2.2 OSCILOSCOPIO En el osciloscopio podemos apreciar como se ve la señal de reloj del dispositivo

maestro y la transmisión serial de datos. Esto se puede ver claramente en la figura 7, nótese que por un breve espacio de tiempo el reloj maestro deja de producirse, esto no afecta para nada la comunicación SPI entre el ATMega8515 y el ENC28J60 y no se pierde sincronía, en el modo SPI 0,0 lo importante son los flancos de subida

SCK

wcr reg (0101 1111)

data (0001 0000)

Figura 7 Escritura de un registro de control

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 19: EDTP Frame Thrower - 148.206.53.231

19

7.3 LECTURA DE REGISTROS

Para poder leer un registro de control del ENC28J60 se utiliza la instrucción SPI Read

Contrl Register RCR (000 aaaaa ), véase Tabla 1. Donde aaaaa es la dirección del registro de control que se desea leer. Uno de los

aspectos mas importantes que se necesita comprender para la implementación de la lectura de registros es que en el estándar SPI el dispositivo maestro solo puede leer del dispositivo esclavo mientras exista la señal de reloj (SCK); para poder lograr esto el dispositivo maestro enviara después de la instrucción RCR un cero de tal forma que el reloj siga funcionando y el ENC28J60 pueda responder en ese momento.

7.3.1 PROCEDIMIENTO

Definir la dirección del registro de control (en la hoja de datos del ENC28J60 se encuentra el listado de direcciones de los registros de control) para este ejemplo escribiremos en el registro EIE que se encuentra en todos los bancos de registros 0

.equ EIE = 0x1B (en binario tendríamos 0001 1011 )

Almacenamos el valor del registro que deseamos leer en una variable usada por la

función RCR, y mandamos llamar la función

ldi register, EIE rcall RCR

Diseño de la función RCR en donde colocamos el pin SS en cero y transmitimos el valor de la dirección del registro de control (register) esta función solo funciona para los registros ETH

RCR: clr TEMP ;SS SE PONE A CERO out PORTB,TEMP out SPDR,register ;SE INICIA LA TRANSMISION DE register

Wait_Transmit: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 20: EDTP Frame Thrower - 148.206.53.231

20

Al terminar de transmitir el valor registro a leer (register) procedemos a transmitir un byte sin valor para poder generar la señal de reloj necesaria para la respuesta del ENC28J60, al finalizar la transmisión se pone un nivel alto en el pin SS para sincronía y el valor leído se almacena en una variable (data) para su posterior uso

clr data out SPDR,data ;SE TRANSMITEN CEROS PARA GENERAR SCK Wait_Transmit2: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit2 ser TEMP ;SS=1 out PORTB,TEMP in data, SPDR ;ALMACENAMOS EL VALOR LEIDO DEL REGISTRO ret

Podemos apreciar la secuencia del comando de lectura de registros ETH en el

siguiente diagrama, en el cual se muestra de manera clara las señales necesarias para la correcta implementación de la función RCR

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 21: EDTP Frame Thrower - 148.206.53.231

21

7.3.2 OSCILOSCOPIO En el osciloscopio podemos apreciar como se ve la señal de reloj del dispositivo

maestro y la transmisión del byte necesario para la respuesta del dispositivo esclavo. Esto se puede ver claramente en la figura 8, nótese que por un breve espacio de tiempo el reloj maestro deja de producirse, en el modo SPI 0,0 lo importante son los flancos de subida. Nótese que el segundo byte transmitido es cero, de tal forma que la única función de esta transmisión es la generación de la señal SCK para poder leer la respuesta del ENC28J60

SCK

RCR EIE (0001 1011)

data (0000 0000)

Figura 8 Lectura de un registro de control

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 22: EDTP Frame Thrower - 148.206.53.231

22

.equ MAADR1 = 0x04

ldi register, MAADR1 rcall RCR2

.equ ECON1 = 0x1F ldi register,ECON1 ldi data, 0b00000000 rcall WCR ;Cambio al banco 00 ldi data, 0b00000001 rcall WCR ;Cambio al banco 01 ldi data, 0b00000010 rcall WCR ;Cambio al banco 10

7.3.3 LECTURA DE DE REGISTROS MAC & MII

Es importante notar que el procedimiento de lectura de registros ETH difiere del procedimiento de lectura registros MAC y MII, apreciando el siguiente diagrama se puede notar que la lectura de este tipo de registros envía un dummy byte antes de enviar el byte de datos, esto debe de ser considerado al momento de diseñar la función de lectura.

La función de lectura de este tipo de registros funciona de manera muy similar a la función RCR implementada anteriormente, nótese que de la misma manera lo único que necesita esta función antes de ser llamada es cargar en la variable register el registro que se desea leer

Definimos una constante, que indique la localidad del registro MAADR (MAC)

Cargamos la variable register con el valor del registro que se desea leer

NOTA: Es importante aclarar que antes de acceder a la lectura y escritura de un registro debemos escribir el valor del banco de registros donde se ubique dicho registro, esto se hace escribiendo en el registro de control ECON1 (b1:b0). El registro ECON1 se encuentra presente en todos los bancos de registros así que solo basta con realizar el siguiente procedimiento para cambiar a distintos bancos

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 23: EDTP Frame Thrower - 148.206.53.231

23

En la figura 9 podemos apreciar todos los registros disponibles en el CI ENC28J60, además podemos notar en que banco se localiza cada uno de ellos y sus respectivas direcciones. Nótese que los registros de control y de status del CI se encuentran en todos los bancos en la misma localidad, así que para acceder a ellos no es necesario realizar cambio de banco de registro

FIGURA 9 Registros del ENC28J60

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 24: EDTP Frame Thrower - 148.206.53.231

24

RCR2: clr TEMP ;SS SE PONE A CERO out PORTB,TEMP out SPDR,register ;SE INICIA LA TRANSMISION DE register Wait_Transmit: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit clr data out SPDR,data ;SE TRANSMITEN CEROS PARA GENERAR SCK Wait_Transmit2: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit2 ;EN ESTE MOMENTO SE HA RECIBIDO EL DUMMY BYTE, PERO SE ;IGNORA out SPDR,data ;SE TRANSMITEN CEROS PARA GENERAR SCK Wait_Transmit3: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit3 ;ES AHORA QUE SE RECIBE EL VALOR ALMACENADO EN ;EL REGISTRO register Y SE ALMACENA EN DATA ser TEMP ;SS SE PONE A 1 out PORTB,TEMP in data, SPDR ;ALMACENAMOS EL VALOR LEIDO DEL REGISTRO ;EN DATA ret

A continuación podemos notar la estructura final de la funcion que lee registros MAC & MII del ENC28J60, Notese que se agrega dos ciclos

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 25: EDTP Frame Thrower - 148.206.53.231

25

7.4 INICIALIZACION DEL BUFFER

Antes de que ENC28J60 pueda recibir o transmitir paquetes es necesario inicializar algunos periféricos integrados en él. El procedimiento de inicialización consiste en:

Configurar el buffer de recepción y transmisión El buffer de recepción funciona como una fila (FIFO) circular que necesita definirse en la memoria, la asignación de espacio de memoria para el buffer de recepción se consigue escribiendo en los registros ERXSTL, ERXSTH (Ethernet Receive Start Low,High), & ERXNDL, ERXNDH (Ethernet Receive End Low,HIgh), toda la memoria que se encuentra entre estos apuntadores será dedicada para el buffer de recepción Dado que este es un buffer circular se requiere inicializar apuntadores de escritura y lectura, esto se logra escribiendo en el registro ERXRDPT (Ethernet Receive Read Pointer) que se encarga de indicar la localidad donde esta prohibido escribir, el registro ERXWRPT (Ethernet Receive Write Pointer) indica la localidad en memoria donde se escribirá el paquete de datos recibido, este registro es de solo lectura y se actualiza automáticamente. Todo el resto de la memoria que se encuentre fuera del buffer de recepción se considera el buffer de transmisión, puede verse en la figura 9 un esquema de organización de los bloques de memoria para la transmisión y recepción de datos.

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 26: EDTP Frame Thrower - 148.206.53.231

26

7.4.1 PROGRAMA DE INICIALIZACION WCR ERXSTL ,0x00 DEL BUFFER WCR ERXSTH, 0x10 WCR ERXNDL,0xFF WCR ERXNDH,0x1F WCR ERXRDPTL,0xFF WCR ERXRDPTH,0x1F

esta notación explica de manera sintetizada las instrucciones necesarias para la configuración del buffer, entiéndase las instrucciones (WCR registro, dato) como el siguiente conjunto de instrucciones

ldi register,ERXSTL ldi data,0x00 rcall WCR ;Vease 7.2 Escritura de registros ldi register,ERXSTH ldi data,0x10 rcall WCR ldi register,ERXNDL ldi data,0xFF rcall WCR ldi register,ERXNDH ldi data,0x1F rcall WCR ldi register,ERXRDPTL ldi data,0xFF rcall WCR ldi register,ERXRDPTH ldi data,0x1F rcall WCR

Después que el buffer de recepción se encuentra inicializado, el buffer de transmisión comprende las localidades de memoria que se encuentran fuera del buffer de recepción, esto quiere decir que después de esta inicialización el buffer de transmisión comprende las siguientes localidades (0000h:0FFF) mientras que el buffer de recepción comprende (1000h:1FFF)

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 27: EDTP Frame Thrower - 148.206.53.231

27

/* CONFIGURACION DEL FILTRO DE RECEPCION */ ldi register,ECON1 ldi data,0b00000001 ;CAMBIO AL BANCO DE REGISTROS 01 rcall WCR ldi register, ERXFCON ldi data, 0b10100000 ;UNICAST & CRC FILTER ENABLE rcall WCR

/*

7.5 CONFIGURACION DE FILTROS DE RECEPCION

Una de las características más importantes del funcionamiento del ENC28J60 es la incorporación de filtros programables que permiten determinar el tipo de paquetes que serán aceptados por el CI, esta habilidad del CI nos ahorra trabajo a la hora de desarrollar el programa del microcontrolador, pues este no tendrá que encargarse de verificar el tipo de paquete que se ha recibido, siempre se tendrá la certeza de que el paquete recibido cumple con los requisitos del sistema. Para configurar el filtro de recepción es necesario escribir en el registro ERXFCON el tipo de filtro que se desea, a continuación se muestran los diferentes tipos de filtros que incorpora el ENC28J60 mas importantes para el desarrollo de este proyecto. Notese que si no se activa ningun tipo de filtro el dispositivo entra en modo promiscuo y recibirá todos los paquetes

1. Unicast – Recibe solo paquetes que concuerden con la direccion MAC programada en el dispositivo (MAADR1:MAAADR6)

2. Multicast – Recibe solo paquetes que en la dirección de destino del paquete el bit menos significativo del primer byte recibido sea 1, esto indica que es un paquete que cumple con el criterio del filtro Multicast

3. Broadcast – Recibe solo paquetes cuya dirección de destino sea FF:FF:FF:FF:FF:FF

4. CRC – Recibe solo paquetes cuyo CRC sea valido Esta es la forma del registro ERXFCON

Para habilitar el filtro Unicast es necesario poner un 1 en UCEN Para habilitar el filtro Multicast es necesario poner un 1 en MCEN Para habilitar el filtro Broadcast es necesario poner un 1 en BCEN Para habilitar el filtro CRC es necesario poner un 1 en CRCEN Analicemos el procedimiento llevado a cabo para habilitar el filtro Unicast y el CRC al mismo tiempo

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 28: EDTP Frame Thrower - 148.206.53.231

28

.equ MAADR1 = 0x04 ; DEFINIMOS LAS CONSTANTES MAADR

.equ MAADR2 = 0x05

.equ MAADR3 = 0x02

.equ MAADR4 = 0x03

.equ MAADR5 = 0x00

.equ MAADR6 = 0x01 /* CONFIGURACION DE LA DIRECCION MAC 55:51:14:24:75:52*/ ldi register,ECON1 ldi data,0b00000011 ;CAMBIO AL BANCO DE REGISTROS 11 rcall WCR ldi register, MAADR1 ldi data, 0x52 rcall WCR ldi register, MAADR2 ldi data, 0x51 rcall WCR ldi register, MAADR3 ldi data, 0x14 rcall WCR ldi register, MAADR4 ldi data, 0x24 rcall WCR ldi register, MAADR5 ldi data, 0x75 rcall WCR ldi register, MAADR6 ldi data, 0x55 rcall WCR

7.6 CONFIGURACION DE LA DIRECCION MAC

Otra de las capacidades del ENC28J60 es la posibilidad de poseer una dirección MAC configurable, es decir, se tiene la posibilidad de asignarle cualquier dirección MAC que el usuario desee, esto será de gran utilidad si es que deseamos transmitir y recibir paquetes y filtrarlos con el criterio Unicast, a continuación se muestra el procedimiento necesario para configurar la dirección MAC del dispositivo. Notese que la dirección MAC del dispositivo se programa escribiendo en los registros MAADR1:MAADR6 que se encuentran ubicados en el banco de registros 3

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 29: EDTP Frame Thrower - 148.206.53.231

29

Debemos agregar que para el correcto funcionamiento del ENC28J60 deben de configurarse algunos otros registros que influyen de manera directa en el desempeño del CI. Entre estos registros se encuentran: MACON1: MAC Control Register 1 Este registro cuenta con 4 bits configurables MARXEN (b0) – Habilita a la MAC la recepción de tramas PASALL(b1) – Permite el paso de todos los paquetes recibidos, elimina la aplicación del filtro de recepción TXPAUS & RXPAUS (b2 & b3) – Habilita la transmisión y recepción de paquetes de control Ethernet MACON3 PADCFG – Padding y configuración de CRC TXCRCEN – Bit de habilitación de CRC HFRMEN – Bit de habilitación de tamaño de trama recibida FRMLEN – Bit de verificación de tamaño de trama recibida FULDPX – Habilitacion del funcionamiento Full-Duplex MAMXFL Este registro contiene el tamaño máximo permitido que debe poseer una trama para ser recibida, este registro es configurable y de gran utilidad para filtrar los paquetes recibidos por su tamaño. MABBIPG Se programa con 15h para Full Duplex y con 12h para modo Half – Duplex MAIPGL Para la mayoría de aplicaciones este registro se programa con 12h MAIPGH Para la mayoría de aplicaciones este registro se programa con 0Ch

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 30: EDTP Frame Thrower - 148.206.53.231

30

Nótese que la definición de constantes facilitará el diseño del programa final

Parte medular del programa, la correcta configuración del módulo de comunicación SPI integrado en el uC para la comunicación con la interfaz Ethernet

Escritura del registro ECON1 con el valor 0x16

Lectura del registro ECON1, el valor leído se almacena en recibido, en cuyo caso será 0x16

7.7 PRUEBA DE COMUNICACION

Esta primera prueba consiste en inicializar un registro de configuración del ENC28J60 para posteriormente leerlo y desplegar su contenido en el display.

Código .NOLIST .INCLUDE "m8515def.inc" ;CARGA DE LIBRERIAS .LIST .DEF data = R16 ;REGISTROS PARA PROPOSITO GENERAL .DEF register = R17 .DEF TEMP =R18 .DEF recibido = R19 .DEF aux = R20 /************************** CONSTANTES ***************************/ ;OP CODES .EQU OCWCR = 0x40 ;REGISTROS GENERALES DE CONTROL .EQU ECON1 = 0x1F .org $0000 rjmp start ;SUBRUTINA INICIAL DE CONFIGURACION DEL HARDWARE USADO EN EL PROGRAMA start:

clr data ;TODAS LOS REGISTROS DE USO GENRAL SE PONEN A CEROS clr register clr recibido clr TEMP /************************** STACK POINTER ***************************/ ldi TEMP,LOW(RAMEND) ;INICIALIZACÓN DEL STACK POINTER out SPL,TEMP ;(APUNTADOR A LA PILA) ldi TEMP,HIGH(RAMEND) out SPH,TEMP /************************* ;INICIALIZACION DE PUERTOS *************************/ ser TEMP out DDRC,TEMP ;EL PUERTO C SE CONFIGURA COMO SALIDA /************************* ;CONFIGURACION DEL MODULO SPI *************************/ ; HABILITACION DE MOSI,SS & SCK COMO SALIDAS, TODAS LAS OTRAS SON ENTRADAS ldi TEMP,(1<<DDB5)|(1<<DDB7)|(1<<DDB4) out DDRB,TEMP ser TEMP out PORTB,TEMP ;SS=1 ldi TEMP,(1<<SPI2X) ;HABILITACION DE VELOCIDAD 2X out SPSR,TEMP ; HABILITACION DE SPIE,SPI, Master mode,clock rate fck/2 ldi TEMP,(0<<SPIE)|(1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0) out SPCR,TEMP ldi register, ECON1 ldi data,0b00010110 rcall WCR clr data clr TEMP ldi register,ECON1 rcall RCR rjmp main;

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 31: EDTP Frame Thrower - 148.206.53.231

31

Desplegamos por el puerto C el valor del registro ECON1

Función que escribe en un registro del ENC28J60

Función que lee en un registro del ENC28J60,

almacena el valor leído en la variable recibido

main: nop out PORTC,recibido rjmp main; /************************************************* FUNCION WRITE CONTROL REGISTER "WCR(register,data)" **************************************************/ WCR: ori register, OCWCR clr TEMP ;SS =0 out PORTB,TEMP out SPDR,register ;SE INICIA LA TRANSMISION DE REGISTER Wait_Transmit1: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit1 out SPDR,data ;SE TRANSMITEN EL DATO PARA ALMACENAR EN REGISTER Wait_Transmit2: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit2 ser TEMP ;SS=1 out PORTB,TEMP ret /************************************************* FUNCION READ CONTROL REGISTER "RCR (register) *************************************************/ RCR: clr TEMP ;SS SE PONE A CERO out PORTB,TEMP out SPDR,register ;SE INICIA LA TRANSMISION DE register Wait_Transmit3: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit3 ldi aux,0b00000000 out SPDR,aux ;SE TRANSMITEN 00h PARA GENERAR SCK Y RECIBIR DATOS Wait_Transmit4: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_Transmit4 ser TEMP ;SS=1 out PORTB,TEMP in recibido,SPDR ;SE LEE EL DATO RECIBIDO ret

Después de realizar esta prueba de comunicación, y obtener el resultado esperado, procedemos a configurar todos los registros de control necesarios para inicializar el ENC28J60, para la siguiente etapa del proyecto se pretende además agregar subrutinas que permitan hacer uso del display de 7 segmentos para crear una interface mas clara del contenido de los registros del ENC28J60

. Es importante recalcar que todos los programas realizados en este proyecto, fueron

compilados usando AVR Studio ver. 4.14, el programa compilado fue grabado en el microcontrolador usando el software Pony Prog 2000, esta nota puede ser de utilidad para futuras mejoras de este proyecto

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 32: EDTP Frame Thrower - 148.206.53.231

32

8.0 INTERRUPCIONES 8.1 DESCRIPCION

EL CI ENC28J60 posee múltiples fuentes de interrupción y un pin de salida que señaliza la ocurrencia de algún evento al micro controlador. Las interrupciones se manejan con dos registros principales el EIE (Ethernet Interrupt Enable) que contiene los bits e habilitación para cada fuente de interrupción mientras que el EIR contiene las banderas de interrupción correspondientes. Cuando ocurre una interrupción, la bandera de interrupción pasa a un nivel alto. Si la interrupción ha sido habilitada en el registro EIE y el EIE.INTIE se ha habilitado, el pin INT pasara de un nivel alto a uno bajo, indicando la ocurrencia del evento al micro controlador, quiere decir que tendremos interrupciones por flanco de bajada. Cuando ha ocurrido una interrupción el pin de interrupción INT se mantendrá en hasta que el controlador coloque las banderas que causaron la interrupción se en nivel bajo. Después de que una interrupción ha ocurrido el controlador debe de debe de poner a cero el bit global de interrupciones EIE.INTIE antes de proceder a atender la interrupción. Después de atender la interrupción el controlador puede volver a habilitar el bit EIE.INTIE para restaurar la habilitación de interrupciones A continuación se enumera las posibles opciones programables para habilitar interrupciones usadas en este proyecto, escribiendo en el registro EIE en su respectivo bit de habilitación

INTIE – Habilitación de interrupciones, PKTIE – Interrupción que indicara que hay un paquete recibido en el buffer de recepción TXIE – Interrupción que indica que una transmisión se ha completado TXERIE – Interrupción que indica un error en la transmisión RXERIE – Interrupción que indica que existe un error en la recepción de un paquete Las interrupciones usadas en este proyecto son principalmente PKTIE y TXIE. Veamos en que consisten estas interrupciones Si habilitamos EIE.INTIE & EIE.PKTIE, habilitaremos la generación de interrupciones que indicaran la recepción y escritura de un paquete en el buffer de recepción. Al momento de recibir un paquete correcto y almacenarlo en el buffer de recepción, el registro EPKTCNT (Ethernet Packet Counter) se incrementara en una unidad, siempre que el EPKCNT sea diferente de cero, activara la bandera de interrupción EIR.PKTIF, esto generara la señal de interrupción por el pin INT. La única forma de indicar que la interrupción ha sido atendida es decrementar el EPKCNT hasta que valga cero, mientras el EPKCNT sea diferente de cero continuara generando la interrupción, Para decrementar el EPKCNT en una unidad se escribirá un uno en el bit ECON2.PKTDEC hasta tener en ceros en el EPKCNT.

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 33: EDTP Frame Thrower - 148.206.53.231

33

Por otro lado si se habilita EIE.INTIE & EIE.TXIE estaremos habilitando las interrupciones que indicaran la transmisión correcta de un paquete del buffer de transmisión. Cuando escribimos en el buffer de transmisión un paquete y posteriormente habilitamos el bit ECON1.TXRTS solicitamos al ENC28J60 que realice la transmisión de dicho paquete, Cuando ECON1.TXRTS pasa de 1 a 0, indica al sistema que el paquete se ha transmitido correctamente y la bandera EIR.TXIF se activara, generando una interrupción. La bandera de interrupción TXIF debe de ser puesta a cero por el controlador para deshabilitar la interrupción. Veamos el formato del registro EIR donde se ve la organización de las banderas de interrupción

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 34: EDTP Frame Thrower - 148.206.53.231

34

http://www.colasoft.com/packet_builder/

9. PRUEBA DE RECEPCION DE PAQUETES 9.1 INICIALIZACION Primeramente enumeraremos los pasos necesarios para habilitar la recepción de paquetes

Inicializar el buffer de recepción

Para esta prueba, el buffer de recepción se programó con el siguiente rango de direcciones (1000h - 1FFF), este rango utiliza la mitad de la capacidad total del buffer Ethermet del ENC28J60 (0000h – 1FFF)

Inicializar los filtros Para la realización de esta prueba el filtro de recepción fue configurado como Unicast y CRC check

Configurar dirección MAC La dirección MAC asignada al ENC28J60 fue 52 : 51 : 14 : 24 : 75 : 55

Configurar registros de control MAC La escritura de estos registros de control fue la sugerida en la hoja de datos del ENC28J60, dicha configuración puede ser vista en detalle en el código de este ejemplo.

Habilitar interrupciones En esta prueba se utiliza la interrupción generada por presencia de un paquete en el buffer de recepción.

Para la realización de esta prueba se necesita que la PC que enviará los paquetes cuente con una tarjeta de red para una conexión directa con el ENC28J60, o en otro caso, contar con un hub y la PC conectada a éste vía USB(Prodigy Infinitum-TELMEX). Además, se debe de contar con software especializado para la creación y transmisión de paquetes, así como para el monitoreo del flujo de paquetes en el UTP. En este proyecto utilizamos el hub proporcionado por el ISP TELMEX.

9.2 PACKET BUILDER

Antes de proceder a realizar esta prueba es necesario contar con un software capaz de transmitir generar y modificar tramas Ethernet. Realizando una búsqueda en Internet, se puede encontrar un sin número de aplicaciones de este tipo, pero por su facilidad, su interfaz grafica y su distribución gratuita, se eligió para este proyecto el software Colasoft Packet Builder, el cuál puede ser descargado gratuitamente desde el siguiente enlace (4.4 Mb) : Este software permite al usuario editar paquetes con ayuda de su poderoso editor que permite la manipulación de diversos campos de un paquete. Packet Builder cuenta con algunas plantillas de edición de paquetes basados en los siguientes protocolos: Ethernet, ARP, IP, TCP y UDP. Toda la información del paquete y su contenido, pueden ser visualizados en formato HEX o en una ventana de edición donde se especifican los diversos campos que componen el paquete.

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 35: EDTP Frame Thrower - 148.206.53.231

35

Podemos ver en la siguiente imagen la pantalla inicial de Packet Builder

Para poder enviar un paquete es necesario primeramente seleccionar el adaptador de red que se utilizara para transmitir los paquetes, seleccionando el botón “Adapter”

Aparecerá un recuadro donde tendremos la posibilidad de seleccionar el adaptador de red por donde queramos transmitir los paquetes, es de suma importancia para este proyecto verificar las direcciones IP y MAC del dispositivo IP: 192.168.1.64 MAC : 00 : 1F : B3 : B7 : 14 : DA

Solo basta crear el paquete que deseamos transmitir, seleccionando el icono ADD podremos elegir alguno de las plantillas pre instaladas de diseño de paquetes, para esta prueba utilizamos UDP.

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 36: EDTP Frame Thrower - 148.206.53.231

36

Al seleccionar la plantilla podremos editar nuestro paquete; para esta prueba es muy importante ajustar la dirección MAC destino, pues el filtro del ENC28J60 será habilitado en Unicast, los campos IP source & address son opcionales, y el campo de datos para este caso será un continuo de valores, finalmente obtenemos la siguiente imagen de el paquete finalmente editado

Dirección MAC destino Direccion MAC fuente Source IP Destination IP Extra Data

Finalmente lo único restante es transmitir el paquete, para esto solo basta en situarse en el paquete que deseamos transmitir y oprimir el botón SEND Finalmente para transmitir el paquete basta con presionar START para iniciar la transmisión, nótese que se puede agregar un retardo entre paquetes, así como un loop del número de paquetes que deseemos.

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 37: EDTP Frame Thrower - 148.206.53.231

37

9.3 IMPLEMENTACION A continuación se muestra una imagen de la implementación de esa prueba en la cual se

puede apreciar las siguientes características:

1. Indicador de encendido del ATMega 8515 2. Indicador de encendido del modulo Ethernet 3. Display 4. Monitor de voltaje del ENC28J60 (3.3v) 5. Concentrador 6. Modulo Ethernet Frame Thrower 7. Cable de comunicación SPI 8. Indicador de paquete recibido El inicio de esta prueba consiste en la inicialización y configuración del modulo Ethernet. Cada que una interrupción externa 1 es ingresada con ayuda de un “push button” al AVR, se visualiza en el display el código de la instrucción de configuración, por ejemplo el siguiente código 49 10 - WCR ERXSTH, 0x10

UNIVERSIDAD AUTÓNOMA METROPOLITANA

7

6

4

3

2 1

5

8

Page 38: EDTP Frame Thrower - 148.206.53.231

38

Al terminar el proceso de configuración, se procede al proceso de lectura de todos los registros de control y visualizamos su contenido en el display, ESTO SE LLEVA A CABO PRESIONANDO LA MISMA INTERRUPCION EXTERNA 1, en este caso 09 10 - ERXSTH = 10 Es importante que al momento de leer el registro EPKTCNT obtengamos cero al inicializar el sistema. Al terminar el proceso de configuración y lectura de los registros de control, el microcontrolador se mantendrá en stand by, esperando la recepción de un paquete, esta recepción la indicara el modulo Ethernet a través de una interrupción externa 2, al recibir un paquete el AVR generara una señal de recepción, y con la interrupción externa 1 se puede leer de manera continua el paquete recibido, esta prueba resulto exitosa y se muestra a continuación que la localidad 1 contiene el valor 46, mientras que la localidad 2 contiene 10, esto es correcto pues al momento de recibir un paquete, la primera localidad almacenada es el apuntador a la localidad de memoria donde se recibirá el próximo paquete

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 39: EDTP Frame Thrower - 148.206.53.231

39

9.4 RESULTADOS

En el apéndice A, se puede apreciar el programa necesario para la realización de esta prueba, nótese que este programa tiene algunas modificaciones que se justifican por lo siguiente

El proceso de configuración del ENC28J60 se lleva paso a paso por una interrupción externa, esto implica sutiles cambios en la instrucción WCR.

Después de realizar la escritura de registros de control, se procedió a leer todos los registros configurados anteriormente para verificar que el contenido de éstos, concordara con el que les fue escrito, también esto fue implementado haciendo uso de interrupciones externas.

Al recibir un paquete el microcontrolador procede a leerlo y almacenarlo en su memoria de datos, con ayuda de otra interrupción podemos proceder a leer el contenido de la memoria de datos y desplegar el contenido.

En esta primera prueba se encontró

El proceso de configuración fue exitoso, pues después de escribir en todos los registros de control del ENC28J60, se procedió a leerlos y mostrar el contenido de estos por el display, encontrando que todos los valores leídos concuerdan con los valores escritos.

La recepción y lectura del buffer Ethernet funciona correctamente, pues después de recibir un paquete y desplegarlo por el display se puede verificar que el paquete recibido es el mismo que el transmitido.

Existe problemas en este programa, pues después de recibir correctamente un paquete, la recepción de un segundo es errónea, se considera que una posible causa de esto se encuentre en los apuntadores de lectura y de escritura del buffer Ethermet de recepción. Y muy específicamente al proceso de inicialización, donde quizá sea necesaria alguna subrutina para eliminar todos los paquetes existentes en el buffer de recepción

Las mejoras de este código se agregaron en la prueba 3, que consiste en transmitir un paquete desde el ENC28J60 a la PC. Y moitorear la comunicación con el software Wireshark.

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 40: EDTP Frame Thrower - 148.206.53.231

40

http://www.wireshark.org/docs/

http://www.wireshark.org/download.html

10. PRUEBA DE TRANSMISION DE PAQUETES 10.1 DESCRIPCION

El objetivo de esta prueba es la transmisión de un paquete desde el AVR hacia la PC, es

importante resaltar que para verificar que existe comunicación entre el AVR y la PC se utilizará un software especializado, capaz de monitorear el tráfico en el UTP. Además, por lo pronto, solo basto con transmitir un paquete cuyo contenido no es relevante para esta prueba, pues el objetivo de ésta es solo verificar que sea posible transmitir un paquete sin problemas hacia la PC. Básicamente esta prueba solo consiste en transmitir un paquete conocido cada que se presente una interrupción externa, para esta prueba no es necesario usar el display, y el proceso de configuración se retoma de la prueba anterior, salvo algunas modificaciones que serán enlistadas. A continuación veremos una pequeña introducción al software Wireshark.

10.2 WIRESHARK Wireshark es uno de los mas importantes analizadores de protocolos y un estándar en

cientos de empresas e instituciones educativas a nivel internacional. Wireshark posee todo un conjunto de rasgos que lo hacen tan popular, entre los que

destaca

Inspección profunda de cientos de protocolos

Captura de eventos en tiempo real y análisis offline

Es un software multiplataforma

Poderosos filtros

Reglas de colores, que permiten un análisis intuitivo

Estas son solo unas cuantas características cuyas funciones representan interés para este proyecto, la documentación completa de este software se puede encontrar en:

La descarga de este software se realiza desde el siguiente link

Solo para aclarar el procedimiento llevado a cabo en esta prueba me parece importante describir el funcionamiento del software y su configuración, pues al realizar esta prueba, no resulto sencillo ni intuitivo el uso de este software. La intención de esta descripción es hacer mas fácil el uso del software y solo pretende cubrir los rasgos importantes para esta prueba.

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 41: EDTP Frame Thrower - 148.206.53.231

41

Después de realizar la instalación del software e inicializarlo, se nos presentara una ventana como la siguiente. Para iniciar la captura de paquetes es importante seleccionar la interfaz de red donde se desea realizar la captura de paquetes, eso se selecciona desde este botón Aparecerá una ventana, donde se nos muestran las posibles interfaces de captura, para este caso se selecciona el adaptador 2 wire USB, dando click en Start Recomiendo que para esta prueba el HUB no debe tener conexión a Internet, pues esto causa lentitud en el software debido al gran número de paquetes que fluyen en el HUB Solo falta configurar los filtros, esto es de mucha ayuda para no estar visualizando todos los paquetes que comúnmente transmite la PC al detectar una conexión de red. Para esta prueba basta filtrar todos los paquetes excepto los provenientes de la dirección MAC del dispositivo 52 : 51 : 14 : 24 : 75 : 55, esto se realiza escribiendo en el filtro y dando click en Apply y ahora si, iniciamos la captura de paquetes con el botón Start y procedemos a enviar paquetes desde el AVR a la PC, los cuales serán visualizados en el Wireshark

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 42: EDTP Frame Thrower - 148.206.53.231

42

10.3 IMPLEMENTACION Para implementar este proyecto es importante retomar el proceso de configuración de la prueba anterior, así como de las conexiones usadas anteriormente, quizá uno de los dispositivos de los que se puede prescindir es el display, pues para la prueba no será necesario desplegar información, basta con visualizar que el paquete que se desea transmitir llegue a la PC. La MAC dentro del ENC28J60 automáticamente genera el preámbulo del paquete, y el delimitador “start of frame”, el microcontrolador solo se encarga de escribir el paquete y habilitar su transmisión. Adicionalmente el ENC28J60 requiere un byte de control por paquete, este byte debe ser escrito como si fuese parte del paquete, y debe de ocupar la primera localidad a transmitir. Este byte de control se encarga de algunas características de transmisión del paquete, que se pueden apreciar en el siguiente formato:

Veamos como funciona este byte de control POVERRIDE – Si este bit se pone a nivel alto, se indica que el byte de control configurara la transmisión, en caso de valer cero el byte de control será ignorado, pero no por esto debe de dejar de colocarse PCRCEN – Este bit en 1 adjuntara al paquete un CRC valido, en caso de valer 0 los últimos cuatro bytes del paquete se consideraran CRC y puede no ser transmitido, pues se verifica la validez del CRC, en esta parte se debe de tener especial consideración PPADEN – Si este bit vale 1, el paquete tendrá padding a 60 bytes en caso de que su longitud sea menor de 60 bytes PHUGEEN – Si este bit vale 1 el paquete se transmitirá completamente, en caso de valer serco este paquete deberá ser menor al tamaño especificado en MAMXFL para ser transmitido, si es mayor, la transmisión será abortada. El proceso de transmisión de un paquete con ayuda del ENC28J60 resulta sencillo, básicamente consta de los siguientes pasos:

Configurar buffer de recepción

Configurar registros de control

Programar el apuntador ETXST en la localidad donde comienza el paquete

Escribir el paquete en el buffer con la instrucción WBM, recuérdese que el primer valor ue debe escribirse es el del registro de control

Programar el apuntador ETXND en la ultima localidad de memoria del paquete

Iniciar la transmisión escribiendo un 1 en ECON1.TXRTS En la siguiente imagen se muestra la recepción de un paquete, el código de esta prueba se puede verificar en el apéndice A prueba 3

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 43: EDTP Frame Thrower - 148.206.53.231

43

10.4 RESULTADOS

Verificando el código de la prueba (Apéndice B), se puede apreciar que el paquete que transmite el AVR es el siguiente, se aprecia que la dirección destino es FF: FF: FF: FF: FF: FF que es la dirección de Broadcast, y la dirección MAC de origen es 52 : 51: 14: 24: 75: 55 FF FF FF FF FF FF 52 51 14 24 75 55 08 00 45 00 00 3C 00 00 40 00 40 11 B6 DF C0 A8 01 41 C0 A8 01 40 00 00 00 00 00 18 3B A2 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 Podemos apreciar en la siguiente imagen el paquete capturado por el software Wireshark

1. Paquete recibido 2. Direccion MAC destino 3. Direccion MAC fuente 4. Data Payload 5. Contenido del paquete HEX

En esta imagen se puede apreciar el tráfico de paquetes, y es notable que el paquete 1, es el paquete transmitido desde el modulo Ethernet hacia la PC, efectivamente se puede verificar que el paquete recibido en la PC es idéntico al paquete transmitido por el modulo Ethernet, esto nos permite concluir que el proceso de comunicación desde el AVR a la PC fue exitoso, aunque se presentaron problemas al tratar de transmitir mas paquetes, todo parece indicar que el problema es ocasionado por los apuntadores del buffer Ethernet.

UNIVERSIDAD AUTÓNOMA METROPOLITANA

1

2

3

4 5

Page 44: EDTP Frame Thrower - 148.206.53.231

44

11. PING 11.1 DESCRIPCION

PING (Packet Internet Grouper) es una aplicación que comprueba el estado de una conexión con host remotos en una red IP. Por medio de paquetes de solicitud de eco y de respuesta de eco (Ambos definidos en el protocolo de red ICMP) para determinar si un sistema IP especifico es accesible en una red. Básicamente cuando se realiza un ping a un host de la red, el sistema envía un mensaje PING e inicia un timer, un ping no es mas que una petición de un echo del mensaje, así que si el host es alcanzado, este generara un echo o respuesta al ping y lo regresara a su destino original, al llegar a su destino original el timer se detiene y se despliega en pantalla el tiempo de regreso del paquete. La siguiente, es una de las pruebas más importantes de este proyecto, pues responde a los objetivos planteados inicialmente. Básicamente esta prueba consiste primeramente en inspeccionar en que consiste un paquete ping, esto se verifica usando Wireshark y en seguida se realizará un programa para el ATMega8515 cuya función consistirá en recibir paquetes y verificar que la dirección IP a la que va destinado sea su dirección IP, en caso de que la dirección IP destino sea la del micro controlador, éste deberá realizar un ECHO del paquete recibido. La comunicación se podrá monitorear utilizando el software Wireshark. 11.2 IMPLEMENTACION Antes de diseñar el código para esta prueba, necesitamos saber como se conformará el paquete PING que se enviara desde la PC. Primeramente necesitamos saber la dirección IP de la PC desde MS-Dos utilizamos el comando c:\>ipconfig Podemos apreciar que la dirección IP de la PC es 192.168.1.64 Y la mascara de red 255.255.255.0 Para poder enviar un ICMP PING es necesario que el nodo al que va destinado se encuentre dentro de la red local, así que le asignaremos la dirección IP 198.168.1.65 al microcontrolador

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 45: EDTP Frame Thrower - 148.206.53.231

45

Ahora enviamos un PING a esta dirección 198.168.1.65 y verificamos con Wireshark la forma que tiene este paquete, para posteriormente procesarlo en el micro controlador

Ahora podemos ver el formato que posee este paquete con Wireshark, ES IMPORTANTE ACLARAR QUE EL ENVIO DE UN PING DESDE MS-DOS GENERA PRIMERAMENTE UN PAQUETE ARP (Address Resolution Protocol) QUE BUSCA LA DIRECCION FISICA DEL DISPOSITIVO AL CUAL SE QUIERE HACER PING Y AL OBTENERLA ENVIA EL PAQUETE PING; ES POR ESTA RAZON QUE EL PING SE EDITARA DESDE PACKET BUILDER PARA EVITAR EL ENVIO DE ESTE ARP, PARA HACER ESTO HACEMOS PING A CUALQUIER PAGINA WEB POR EJEMPLO WWW.GOOGLE.COM Y VEMOS EL FORMATO DEL PAQUETE ICMP COPIAMOS ESTE FORMATO Y CAMBIAMOS LA DIRECCION MAC DESTINO Y LA DIRECCION IP DESTINO POR LAS QUE TENDRA ASIGNADO NUESTRO HOST

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 46: EDTP Frame Thrower - 148.206.53.231

46

Editando nuestro PING desde Packet Builder, solo bastara transmitir este paquete y verificar con Wireshark que efectivamente se transmita un PING a la dirección IP que se le ha asignado al microcontrolador. ECHO PING REQUEST

Enviando este paquete, podemos apreciar con Wireshark que efectivamente es un paquete ICMP y nos servirá de guía para la realización del programa en el ATMega8515, pues podemos apreciar de manera clara como se organiza el paquete ICMP y como proceder para identificarlo y responderlo.

ECHO PING REQUEST

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 47: EDTP Frame Thrower - 148.206.53.231

47

Partiendo del análisis del paquete generado anteriormente podemos concluir algunos puntos que facilitaran el programa para el micro controlador

El ECHO PING REQUEST incluye la dirección MAC a quien va dirigido el paquete, esto facilita el trabajo, pues podemos usar el filtro Unicast para recibir solo paquetes que tengan la dirección MAC del micro controlador (52:51:14:24:75:55)

El paquete ECHO PING REQUEST posee dos campos que identifican el protocolo ICMP y el tipo de paquete ICMP (ECHO REQUEST o ECHO REPLY).

El paquete ICMP posee dos campos que actúan como identificadores del paquete y de la secuencia en la que fue transmitido, estos varían en una petición normal de un PING e influyen en los campos de Checksum

Con el siguiente esquema podemos relacionar de manera mas simple los campos contenidos en el paquete ICMP

ICMP packet

Bit 0 - 7 Bit 8 - 15 Bit 16 - 23 Bit 24 – 31

IP Header

(160 bits OR 20 Bytes)

Version/IHL Type of service Length

Identification flags and offset

Time To Live(TTL) Protocol Checksum

Source IP address

Destination IP address

ICMP Payload

(64+ bits OR 8+ Bytes)

Type of message Code Checksum

Quench

Data (optional)

Básicamente el programa de esta prueba tendrá que recibir el paquete y verificar que el campo de protocolo sea ICMP, después verificar el tipo de paquete ICMP que se recibe (ECHO REQUEST – ECHO REPLY), en seguida verificar que la dirección IP destino concuerde con la dirección que se le ha sido asignada y si esto se cumple deberá transmitir la respuesta al echo (ECHO REPLY). En caso de que cualquiera de las condiciones anteriores no se cumpla, el micro controlador podrá descartar el paquete. El oren en el cual se verifiquen las condiciones anteriores puede ser arbitrario. Podemos apreciar en el siguiente diagrama de flujo el programa para esta prueba:

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 48: EDTP Frame Thrower - 148.206.53.231

48

11.3 DIAGRAMMA DE FLUJO

NO SI SI NO NO SI SI NO

NO SI

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Inicializar Hardware del ATMega 8515 SPI, Stack Pointer, Interrupciones, Puertos

Inicializar modulo Ethernet

MAIN nop

INT0 Paquete recibido?

¿Mi IP?

¿ICMP?

ECHO REQUEST?

Transmitir ECHO REPLY

INT1 ¿FIN DE TRANSMISION?

Page 49: EDTP Frame Thrower - 148.206.53.231

49

11.4 RESULTADOS Después de implementar en el micro controlador, el código del apéndice C, procedemos a realizar la prueba de comunicación entre la PC y el micro controlador. Podemos apreciar en la siguiente imagen el resultado de esta prueba

En esta imagen se puede apreciar que efectivamente después de mandar un ECHO REQUEST, se genera la respuesta ECHO REPLY, además podemos ver que el contenido del paquete de respuesta es exactamente el mismo que se ha almacenado en el micro controlador. Es importante hacer notar que persiste el mismo problema de pruebas anteriores, después de recibir y enviar un paquete, el modulo Ethernet presenta fallas y no permite recibir ni enviar mas paquetes, todo indica que la mejor opción para resolver este problema es agregar un modulo de monitoreo (Pantalla LCD) en donde se pueda vigilar el comportamiento de todos los registros de control y apuntadores del ENC28J60 para encontrar el error, Otro de los puntos restantes de esta prueba es la generación de funciones que permitan generar respuestas a diferentes PINGS, a que me refiero?, el código implementado para esta prueba esta diseñado para responder a un ECHO REQUEST de un solo formato, cuando llega a cambiar el formato del PING (Identificadores) el sistema falla. Esto se debe a que la manera en que se genera la respuesta ECHO REPLY no es muy completa, se tendrían que agregar funciones capaces de recibir el paquete y partiendo del paquete recibido generar la respuesta, intercambiando campos, calculando Checksums, copiando Identificadores etc.

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 50: EDTP Frame Thrower - 148.206.53.231

50

12. CONCLUSIONES De la realización de este proyecto se pueden concluir algunos rasgos importantes y relevantes del proceso de comunicación Ethernet entre una PC y un micro controlador. Primeramente queda claro que la comunicación a nivel físico (Direcciones MAC) es muy simple, pero a la vez es muy amplio el espectro de posibles aplicaciones a este nivel, pues como se ha visto, el modulo Ethernet posee la habilidad de filtrar los paquetes y recibir únicamente los que concuerden con su dirección MAC, de aquí que el controlador (Host) únicamente se encargaría de leer el contenido del paquete; en dicho contenido se pueden transmitir todo tipo de instrucciones que se desee. El Host se encargaría de decodificar dichas instrucciones, generar el paquete de respuesta y transmitirlo. Al parecer esta es una de las cartas fuertes de este tipo de comunicación, pues simplifica en gran medida el desarrollo de las aplicaciones para el Host y cubre un amplio número de aplicaciones posibles. Este tipo de comunicación a nivel físico, facilita la comunicación en dos casos muy particulares, en una red local y en una conexión directa entre Host y PC, pues para este tipo de comunicación no tiene mayor relevancia el uso de direcciones IP. Hemos podido constatar en este trabajo que la comunicación se da de manera muy confiable. En este punto debo de resaltar las fallas de este proyecto, efectivamente se ha quedado muy lejos de las metas previstas, pues existe una gran dificultad para que el sistema funcione de manera correcta. En todas las pruebas realizadas, el módulo Ethernet presentó problemas para recibir y/o transmitir más de dos tramas. Existen diferentes factores que pueden ocasionar este problema, a mi parecer, el problema se ocasiona en el Buffer Ethernet, puesto que cada que se recibe un paquete, existe un movimiento natural de apuntadores, contadores, y registros de control que resulta difícil examinar, la propuesta para encontrar el origen del problema, es examinar todos los registros involucrados en la comunicación con ayuda de un display LCD, puesto que puede ser visualizado en una sola pantalla el contenido de todos los registros. Esta solución se intento a marchas forzadas, pero sin resultados satisfactorios, pues no se pudo hacer funcionar el modulo LCD. En esta imagen se puede apreciar esta implementación, la cual puede funcionar muy bien para futuras aplicaciones pues, si bien su objetivo principal es el de monitorear el desempeño del ENC28J60 también puede funcionar como una interfaz visual de los paquetes recibidos y transmitidos, o para cualquier otro tipo de señalización (Transmisión, Recepción, etc.)

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 51: EDTP Frame Thrower - 148.206.53.231

51

La gran diversidad de equipos que se integran a Internet crece día a día, pues las grandes capacidades que ofrece la red son un gran atractivo para los desarrolladores y para los usuarios. Es innegable que el uso de comunicaciones a nivel IP, acrecienta el número de aplicaciones posibles para un sistema. Además, la comunicación a IP, ofrece la posibilidad de obtener acceso remoto a dicho Host, esto sería uno de los objetivos a largo plazo e este proyecto, la inserción de un micro controlador como un nodo de la red Internet. Hemos notado a lo largo de el desarrollo de este proyecto que la implementación de comunicación IP resulta mas complejo aun, pues las tareas que debe realizar el Host crecen enormemente, Sin lugar a dudas, el desarrollo de este proyecto abre una inmensa gama de posibilidades de desarrollo, y ofrece un vasto repaso de conocimientos a quien desee continuarlo. Quedan muchas tareas por hacer, pues queda claro que el objetivo de este proyecto no ha quedado concluido, pero se ha dado un gran paso para comprender y exponer de manera muy solida, todos los temas relacionados con el proyecto. Carrillo Arellano Carlos Ernesto Universidad Autónoma Metropolitana México D.F. Diciembre 2008

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 52: EDTP Frame Thrower - 148.206.53.231

52

13. BIBLIOGRAFIA

Computer Networking A top-down approach featuring the internet Kurose, Rose Addison Wesley

Computer Networks Andrew S. Tanenbaum Prentice Hall

Networking and Internetworking with Microcontrollers Fred Eady Newnes, Elsevier 2004

AVR FREAKS- Design note #035 Using the SPI as high speed, bi-directional data bus with automatic Master/Slave switch Zoltan Molnar AVR FREAKS

Beginners Introduction to the Assembly Language of ATMEL AVR Microcontrollers Gerhard Schmidt

AVR Application Note 151 Setup and use of the SPI ATMEL

AVR Aplication Note 320 Software SPI Master ATMEL

AVR Application Note 32105 Master and Slave SPI driver ATMEL

Ethernet Theory of Operation Aplication Note AN1120 M. Simmons Microchip Tecnology

ATMega8515 Datasheet ATMEL

ENC28J60 Datasheet Stand Alone Ethernet Controller Microchip Technology

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 53: EDTP Frame Thrower - 148.206.53.231

53

13. PAGINAS WEB

Electronic Projects - Internetworking with Microchip Microcontrolers http://www.ljcv.net/projects/index.html

KANDI Electronics Electronics and embedded engineering projects http://www.kandi-electronics.com/uCEthernet/

Tuxgraphics An AVR microcontroller based Ethernet device http://tuxgraphics.org/electronics/200606/article06061.shtml#06061lfindex0

Ben ‘ s Hobby Corner http://members.home.nl/bzijlstra/index.htm

Microchip ENC28J60 How-to http://electronicfr.com/index.php/Microcontrollers-and-ethernet/

The secret functions of MicroC Ethernet Library for ENC28J60 http://www.micro-examples.com/public/microex-navig/doc/090-enc28j60-library.html#a1

Microchip ENC28J60 Ethernet Interface driver (enc28j60.c) http://www.mil.ufl.edu/~chrisarnold/components/microcontrollerBoard/AVR/avrlib/docs/html/group__enc28j60.html

SPI testing with ENC28J60 –Electronic Circuits Project http://www.electro-tech-online.com/micro-controllers/35418-spi-testing-enc28j60.html

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 54: EDTP Frame Thrower - 148.206.53.231

54

Apéndice A Primer Programa prueba que permite la inicialización y recepción de paquetes en el ENC28J60, este

primer programa fue implementado de tal forma que el proceso de configuración se realiza paso a paso por medio de una interrupción externa, el proceso de configuración se comprueba leyendo los registros de control modificados y finalmente se implementa una función para que la recepción de un paquete se pueda desplegar en el display de manera secuencial a través de una interrupción externa

;****************************************************************** ;* Universidad Autonoma Metropolitana ;* PROYECTO TERMINAL I ;* "Comunicacion via Ethernet entre una PC y un microcontrolador" ;* Alumno: Carrillo Arellano Carlos Ernesto ;* Asesor: Dr. Miguel Angel Ruiz Sanchez ;* Trimestre O8P ;****************************************************************** .NOLIST .INCLUDE "m8515def.inc" ;CARGA DE LIBRERIAS .LIST .DEF data = R16 ;REGISTROS PARA PROPOSITO GENERAL .DEF aux = R17 .DEF TEMP =R18 .DEF recibido=R19 .DEF digito1 = R20 .DEF digito2 = R21 .DEF digito3 = R22 .DEF digito4 = R23 .DEF selecdisplay = R24 .DEF aux2 = R25 .DEF flags = R26 /************************** CONSTANTES ***************************/ ;OP CODES .EQU WCR = 0x40 .EQU RCR= 0x00 ;REGISTROS BANCO 00 .EQU ERDPTL = 0x00 .EQU ERDPTH = 0x01 .EQU EWRPTL = 0x02 .EQU EWRPTH = 0x03 .EQU ETXSTL = 0x04 .EQU ETXSTH = 0x05 .EQU ETXNDL = 0x06 .EQU ETXNDH = 0x07 . EQU ERXSTL = 0x08 .EQU ERXSTH = 0x09 .EQU ERXNDL = 0x0A .EQU ERXNDH = 0x0B .EQU ERXRDPTL = 0x0C .EQU ERXRDPTH = 0x0D .EQU ERXWRPTL = 0x0E .EQU ERXWRPTH = 0x0F ;REGISTROS BANCO 01 .EQU ERXFCON = 0x18 .EQU EPKTCNT= 0x19 ;REGISTROS BANCO 10 .EQU MACON1 = 0x00 .EQU MACON3 = 0x02 .EQU MACON4 = 0x03

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 55: EDTP Frame Thrower - 148.206.53.231

55

.EQU MABBIPG = 0x04 .EQU MAIPGL = 0x06 .EQU MAIPGH = 0x07 .EQU MAMXFLL = 0x0A .EQU MAMXFLH = 0x0B ;REGISTROS BANCO 11 .EQU MAADR5 = 0x00 .EQU MAADR6 = 0x01 .EQU MAADR3 = 0x02 .EQU MAADR4 = 0x03 .EQU MAADR1 = 0x04 .EQU MAADR2 = 0x05 ;REGISTROS GENERALES DE CONTROL .EQU EIE = 0x1B .EQU EIR = 0x1C .EQU ESTAT = 0x1D .EQU ECON2 = 0x1E .EQU ECON1 = 0x1F .org $0000 rjmp Start ;SUBRUTINA INICIAL DE CONFIGURACION DEL HARDWARE USADO EN EL PROGRAMA .org INT0addr rjmp TX ;SUBRUTINA DE ATENCION A INTERRUPCION EXTERNA 0 .org INT1addr ;SUBRUTINA DE ATENCION A INTERRUPCION EXTERNA 1 (BUUFER Rx CONTIENE TRAMA) rjmp RX /*********************************************************************************** SUBRUTINA INICIAL DE CONFIGURACION DE HARDWARE Y ALMACENAMIENTO DE DATOS EN MEMORIA ************************************************************************************/ start: clr data ;TODAS LOS REGISTROS DE USO GENRAL SE PONEN A CEROS clr aux clr TEMP clr recibido /************************** STACK POINTER ***************************/ ldi TEMP,LOW(RAMEND) ;INICIALIZACÓN DEL STACK POINTER out SPL,TEMP ;(APUNTADOR A LA PILA) ldi TEMP,HIGH(RAMEND) out SPH,TEMP /************************* ; INICIALIZACION DE PUERTOS *************************/ ser TEMP out DDRC,TEMP ;EL PUERTO C SE CONFIGURA COMO SALIDA out DDRA,TEMP ;EL PUERTO A SE CONFIGURA COMO SALIDA ldi TEMP,(1<<DDD7) out DDRD,TEMP ;ESTOS PUERTOS SERÁN USADOS PARA EL DISPLAY DE SALIDA /************************* ; CONFIGURACION DEL MODULO SPI *************************/ ; HABILITACION DE MOSI,SS & SCK COMO SALIDAS, TODAS LAS OTRAS SON ENTRADAS ldi TEMP,(1<<DDB5)|(1<<DDB7)|(1<<DDB4) out DDRB,TEMP ser TEMP out PORTB,TEMP ;SS=1 ldi TEMP,(1<<SPI2X) ;HABILITACION DE VELOCIDAD 2X out SPSR,TEMP ; HABILITACION DE SPIE,SPI, Master mode,clock rate fck/2 ldi TEMP,(0<<SPIE)|(1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0) out SPCR,TEMP

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 56: EDTP Frame Thrower - 148.206.53.231

56

rcall seg ;ALMACENAMOS EN LA MEMORIA DE DATOS LOS CODIGOS PARA DISPLAYS DE 7 SEGMENTOS ;ANODO COMUN rcall inicializacion ;SE ALMACENA EN MEMORIA EL PROGRAMA DE INICIALIZACION DEL MODULO ETHERNET /************************* ;CONFIGURACION DE INTERRUPCIONES EXTERNAS *************************/ ;GIMSK ldi TEMP,(1<<INT0)|(0<<INT1) ; INTERRUPCION 0 & 1 SET out GIMSK,TEMP ;MCUCR ldi TEMP,(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(1<<ISC00) ; INTERRUPCION 0 POR FLANCO DE SUBIDA out MCUCR,TEMP ; INTERRUPCION 1 POR FLANCO DE BAJADA clr data clr recibido clr TEMP clr r31 ldi r30,$0060; APUNTAMOS Z A LA LOCALIDAD 0060 EN MEMORIA DE DATOS sei ; HABILITACION DE INTERRUPCIONES rjmp main; main: nop rcall digitos rcall display rjmp main; /********************************************************************************** FUNCION QUE SEPARA EL DATO RECIBIDO Y TRANSMITIDO Y LES ASIGNA SU CODIGO PARA 7 SEG **********************************************************************************/ digitos: mov digito1,recibido ;SEPARAMOS EL DATO RECIBIDO EN DOS DIGITOS mov digito2,recibido swap digito2 cbr digito1,$F0 cbr digito2,$F0 mov digito3,data ;SEPARAMOS EL DATO TRANSMITIDO EN DOS DIGITOS mov digito4,data swap digito4 cbr digito3,$F0 cbr digito4,$F0 ldi r28,$00F0 add r28,digito1 ;OBTENEMOS EL CODIGO PARA EL DISPLAY DE 7 SEG DE digito1 ld digito1,Y ldi r28,$00F0 add r28,digito2 ;OBTENEMOS EL CODIGO PARA EL DISPLAY DE 7 SEG DE digito2 ld digito2,Y ldi r28,$00F0 add r28,digito3 ;OBTENEMOS EL CODIGO PARA EL DISPLAY DE 7 SEG DE digito3 ld digito3,Y ldi r28,$00F0 add r28,digito4 ;OBTENEMOS EL CODIGO PARA EL DISPLAY DE 7 SEG DE digito4 ld digito4,Y ret

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 57: EDTP Frame Thrower - 148.206.53.231

57

/************************************************************************* FUNCION QUE DESPLIEGA EN LEDS DE 7 SEG LOS DATOS TRANSMITIDOS Y RECIBIDOS **************************************************************************/ display: out PORTA,digito1 ;EN LA RUTINA DISPLAY LO QUE SE HACE ES DESPLEGAR ldi selecdisplay,0b00000001 ;SECUENCIALMEMTE digito1, digito2, digito3 Y digito4 Y ADEMAS out PORTC,selecdisplay ;SELECCIONANDO EL DISPLAY (selecdisplay) EN QUE SE VA A DESPLEGAR EL DIGITO clr selecdisplay ;UN CERO INDICA DESHABILITACION Y UN UNO HABILITACION out PORTC,selecdisplay out PORTA,digito2 ldi selecdisplay,0b00000010 ;LOS 4 BITS MAS SIGNIFICATIVOS DEL REGISTRO selecdisplay EN ESTE CASO out PORTC,selecdisplay ;NO IMPORTAN clr selecdisplay out PORTC,selecdisplay out PORTA,digito3 ldi selecdisplay,0b00000100 out PORTC,selecdisplay clr selecdisplay out PORTC,selecdisplay out PORTA,digito4 ldi selecdisplay,0b00001000 out PORTC,selecdisplay clr selecdisplay out PORTC,selecdisplay ret; /************************************************ SUBRUTINA DE ATENCION A INTERRUPCION EXTERNA INT0 ************************************************/ TX: cpi flags,0x01 breq displaybuffer cpi r30,$00CA ;SI EL BUFFER DE INSTRUCCIONES SE HA SOBREPASADO breq end_init ;INDICA EL FINAL DE LA INICIALIZACION DEL MODULO ETHERNET ld data,Z+ ;SE LEE LA MEMORIA DE DATOS (DATA) rcall verify_opcode ;VEFIFICAMOS EL OPCODE reti /********************************************************************************************* VERIFICA QUE EL APUNTADOR Z AUN SE ENCUENTRE DENTRO DE LOS LIMITES DEL BUFFER DE INSTRUCCIONES **********************************************************************************************/ end_init: clr r31 ldi r30,$0060 ;SE REINICIA EL APUNTADOR Z clr data clr recibido ldi TEMP,(0<<DDD7) ;SE DESPLIEGA POR UN PUERTO UN INDICADOR out PORTD,TEMP ;DE TRAMA RECIBIDA /*SE HABILITA INTERRUPCION EXTERNA 1 */ ;GIMSK ldi TEMP,(0<<INT0)|(1<<INT1) ; INTERRUPCION 0 DESHABILITADA out GIMSK,TEMP reti /********************************************************** FUNCION QUE SE ENCARGARA DE DESPLEGAR EL BUFFER RECIBIDO ************************************************************/ displaybuffer: cpi r30,$00A8 ;SI EL BUFFER DATOS SE HA LEIDO TOTALMENTE? breq end_init ;INDICA EL FINAL DE LA LECTURA DEL BUFFER inc data ld recibido,Z+ reti

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 58: EDTP Frame Thrower - 148.206.53.231

58

/************************************************ RESET DEL MODULO ETHERNET ************************************************/ RESET: ldi data,0b11111111 /* RESET DEL MODULO ETHERNET */ clr TEMP ; SS SE PONE A CERO out PORTB,TEMP out SPDR,data ;SE INICIA LA TRANSMISION DE DATA Wait_Transmit: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_Transmit ser TEMP ;SS=1 out PORTB,TEMP ret /************************************************ TRANSMITE DOS TRAMAS ESPERANDO RESPUESTA (RCR) *************************************************/ READCR: ; INICIO DE LA TRANSMISION DE LOS COMANDOS ALMACENADOS EN LA MEMORIA clr TEMP ;SS SE PONE A CERO out PORTB,TEMP out SPDR,data ;SE INICIA LA TRANSMISION DE DATA Wait_Transmit2: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_Transmit2 ldi aux,0b00000000 out SPDR,aux ;SE TRANSMITEN 00h PARA GENERAR SCK Y RECIBIR DATOS Wait_Transmit3: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_Transmit3 ser TEMP ;SS=1 out PORTB,TEMP in recibido,SPDR ;SE LEE EL DATO RECIBIDO ret /************************************************ TRANSMITE DOS TRAMAS SIN ESPERAR RESPUESTA (WCR) *************************************************/ WRITECR: ; INICIO DE LA TRANSMISION DE LOS COMANDOS ALMACENADOS EN LA MEMORIA clr TEMP ;SS SE PONE A CERO out PORTB,TEMP out SPDR,data ;SE INICIA LA TRANSMISION DE DATA (OPCODE+REG) Wait_Transmit4: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_Transmit4 ld aux,Z+ out SPDR,aux ;SE TRANSMITEN EL DATO PARA ALMACENAR EN REG Wait_Transmit5: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_Transmit5 ser TEMP ;SS=1 out PORTB,TEMP mov recibido,aux ;NO HAY RESPUESTA ret

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 59: EDTP Frame Thrower - 148.206.53.231

59

/****************************************************** VERIFICAMOS EL OPCODE PARA SABER QUE DATOS ENVIAR VIA SPI *******************************************************/ verify_opcode: mov aux2,data lsr aux2 lsr aux2 lsr aux2 lsr aux2 lsr aux2 cpi aux2,0 breq READCR ;cpi aux2,1 ;breq TX2 cpi aux2,2 breq WRITECR ;cpi aux2,3 ;breq TX3 ;cpi aux2,4 ;breq TX2 ;cpi aux2,5 ;breq TX2 ret /*************************************************************** ALMACENAMIENTO EN MEMORIA DE CODIGOS PARA DISPLAY DE 7 SEGMENTOS ***************************************************************/ seg: clr r31 ldi r30,$00F0 ;SE APUNTA A LA DIRECCION DE MEMORIA F0 PARA EL APUNTADOR Z (R31,R30) ldi data,0b00000001 ;CODIGO (7 SEGMENTOS) PARA 0 st Z+,data ldi data,0b01001111 ;CODIGO (7 SEGMENTOS) PARA 1 st Z+,data ldi data,0b00010010 ;CODIGO (7 SEGMENTOS) PARA 2 st Z+,data ldi data,0b00000110 ;CODIGO (7 SEGMENTOS) PARA 3 st Z+,data ldi data,0b01001100 ;CODIGO (7 SEGMENTOS) PARA 4 st Z+,data ldi data,0b00100100 ;CODIGO (7 SEGMENTOS) PARA 5 st Z+,data ldi data,0b00100000 ;CODIGO (7 SEGMENTOS) PARA 6 st Z+,data ldi data,0b00001111 ;CODIGO (7 SEGMENTOS) PARA 7 st Z+,data ldi data,0b00000000 ;CODIGO (7 SEGMENTOS) PARA 8 st Z+,data ldi data,0b00001100 ;CODIGO (7 SEGMENTOS) PARA 9 st Z+,data ldi data,0b00001000 ;CODIGO (7 SEGMENTOS) PARA A st Z+,data ldi data,0b01100000 ;CODIGO (7 SEGMENTOS) PARA B st Z+,data ldi data,0b00110001 ;CODIGO (7 SEGMENTOS) PARA C st Z+,data ldi data,0b01000010 ;CODIGO (7 SEGMENTOS) PARA D st Z+,data ldi data,0b00110000 ;CODIGO (7 SEGMENTOS) PARA E st Z+,data ldi data,0b00111000 ;CODIGO (7 SEGMENTOS) PARA F st Z+,data clr data ret

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 60: EDTP Frame Thrower - 148.206.53.231

60

/******************************************************** FUNCION QUE ALMACENA EN MEMORIA LA SECUENCIA DE INSRUCCIONES PARA LA INICIALIZACION DEL MODULO ETHERNET ********************************************************/ inicializacion: rcall RESET; //SOFT RESET clr r31 ldi r30,$0060 /*CONFIGURACION DE LOS REGISTROS ECON1:ECON2*/ ldi data,ECON1 ori data,WCR st Z+,data /*ESCRITURA (opcode 010 WCR)DEL REGISTRO ECON1*/ ldi data,0b00010000 st Z+,data ldi data,ECON2 ori data,WCR st Z+,data /*ESCRITURA DEL REGISTRO ECON2*/ ldi data,0b10000000 /* ECON2.AUTOINC (b7)*/ st Z+,data /*INICIALIZACION DEL BUFFER DE RECEPCION*/ /*SE PUEDE INICIALIZAR SOLO SI ECON1.RXEN(b2) ES CERO*/ /*CON ESTO SE DETERMINA EL TAMAÑO DEL BUFFER DE RECEPCION*/ ldi data,ERXSTL /*ESCRITURA (opcode 010 WCR)DEL REGISTRO ERXSTL (08h)*/ ori data,WCR st Z+,data ldi data,0b00000000 /* 00 */ st Z+,data ldi data,ERXSTH /*ESCRITURA DEL REGISTRO ERXSTH (09h)*/ ori data,WCR st Z+,data ldi data,0b00010000 /* 10 */ st Z+,data ldi data,ERXNDL /*ESCRITURA DEL REGISTRO ERXNDL (0Ah)*/ ori data,WCR st Z+,data ldi data,0b11111111 /* FF */ st Z+,data ldi data,ERXNDH /*ESCRITURA DEL REGISTRO ERXNDH 0Bh*/ ori data,WCR st Z+,data ldi data,0b00011111 /* 1F */ st Z+,data /* INICIALIZAMOS EL APUNTADOR DE LECTURA DEL BUFFER */ ldi data,ERXRDPTL /*ESCRITURA (opcode 010 WCR)DEL REGISTRO ERXRDPTL (0Ch)*/ ori data,WCR st Z+,data ldi data,0b00000000 /* 00 */ st Z+,data ldi data,ERXRDPTH /*ESCRITURA DEL REGISTRO ERXRDPTH (0Dh)*/ ori data,WCR st Z+,data ldi data,0b00010000 /* 10 */ st Z+,data ldi data,ERDPTL /*ESCRITURA DEL REGISTRO ERXRDPTL (0Dh)*/ ori data,WCR st Z+,data ldi data,0b00000000 /* 00 */ st Z+,data

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 61: EDTP Frame Thrower - 148.206.53.231

61

ldi data,ERDPTH /*ESCRITURA DEL REGISTRO ERXRDPTH (0Dh)*/ ori data,WCR st Z+,data ldi data,0b00010000 /* 10 */ st Z+,data /*CONFIGURACION DE LOS FILTROS DE RECEPCION*/ ldi data,ECON1 /* CAMBIO AL BANCO DE REGISTROS 01*/ ori data,WCR st Z+,data ldi data,0b00010001 st Z+,data ldi data,ERXFCON /* CONFIGURACION DEL FILTRO DE RECEPCION */ ori data,WCR /* ERXFCON.UCEN(b7) & ERXFCON.CRCEN (b5)*/ st Z+,data ldi data,0b10100000 /*UNICAST FILTER ENABLE, CRC ENABLE*/ st Z+,data ldi data,EPKTCNT /* PACKET COUNTER =0 */ ori data,WCR st Z+,data ldi data,0b00000000 st Z+,data /* INICIALIZACION DE REGISTROS DE CONTROL MAC */ /***********************************************************************/ ldi data,ECON1 /* CAMBIO AL BANCO DE REGISTROS 10*/ ori data,WCR st Z+,data ldi data,0b00010010 st Z+,data ldi data,MACON1 /*MACON1.MARXEN (b0) & .TXPAUS (b3) .RXPAUS (b2) */ ori data,WCR st Z+,data ldi data,0b00000001 st Z+,data ldi data,MACON3 /* MACON3.PADCFG (b7,6,5) .TXCRCEN (b4) */ ori data,WCR st Z+,data ldi data,0b11110000 st Z+,data ldi data,MAMXFLL /* ESCRITURA DEL REGISTRO MAMXFL (MAXIMUM FRAME LENGHT) */ ori data,WCR st Z+,data ldi data,0b10000000 st Z+,data ldi data,MAMXFLH ori data,WCR st Z+,data ldi data,0b00000000 st Z+,data ldi data,MABBIPG ori data,WCR st Z+,data ldi data,0b00010010 st Z+,data ldi data,MAIPGL ori data,WCR st Z+,data ldi data,0b00010010 st Z+,data

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 62: EDTP Frame Thrower - 148.206.53.231

62

ldi data,MAIPGH ori data,WCR st Z+,data ldi data,0x0C st Z+,data /********************************************************************/ /* CONFIGURACION DE LA DIRECION MAC */ ldi data,ECON1 /* CAMBIO AL BANCO DE REGISTROS 11*/ ori data,WCR st Z+,data ldi data,0b00010011 st Z+,data ldi data,MAADR1 ori data,WCR st Z+,data ldi data,0x52 st Z+,data ldi data,MAADR2 ori data,WCR st Z+,data ldi data,0x51 st Z+,data ldi data,MAADR3 ori data,WCR st Z+,data ldi data,0x14 st Z+,data ldi data,MAADR4 ori data,WCR st Z+,data ldi data,0x24 st Z+,data ldi data,MAADR5 ori data,WCR st Z+,data ldi data,0x75 st Z+,data ldi data,MAADR6 ori data,WCR st Z+,data ldi data,0x55 st Z+,data /******************************************************************/ /*HABILITACION DE LA RECEPCION Y DE INTERRUPCIONES */ ldi data,ECON1 /* CAMBIO AL BANCO DE REGISTROS 00*/ ori data,WCR st Z+,data ldi data,0b00010000 st Z+,data ldi data,EIE /* SE HABILITAN INTERRUPCIONES EIE.INTIE (b7) & EIE.PKTIE (b6)*/ ori data,WCR st Z+,data ldi data,0b11000000 st Z+,data ldi data,ECON1 /* SE HABILITA LA RECEPCION ECON1.RXEN (b2)*/ ori data,WCR st Z+,data ldi data,0b00010100 st Z+,data

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 63: EDTP Frame Thrower - 148.206.53.231

63

/* LECTURA DE LOS VALORES ALMACENADOS EN LOS REGISTROS DE CONTROL */ /********************************************************************/ ldi data,ECON1 /* CAMBIO AL BANCO DE REGISTROS 00*/ ori data,WCR st Z+,data ldi data,0b00010100 st Z+,data ldi data,EIE /* LECTURA DEL REGISTRO EIE */ st Z+,data ldi data,EIR /* LECTURA DEL REGISTRO EIR */ st Z+,data ldi data,ESTAT /* LECTURA DEL REGISTRO ESTAT */ st Z+,data ldi data,ECON2 /* LECTURA DEL REGISTRO ECON2 */ st Z+,data ldi data,ECON1 /* LECTURA DEL REGISTRO ECON1 */ st Z+,data ldi data,ERXSTL /* LECTURA DEL TAMAÑO DEL BUFFER DE RECEPCION */ st Z+,data ldi data,ERXSTH st Z+,data ldi data,ERXNDL st Z+,data ldi data,ERXNDH st Z+,data ldi data,ERXRDPTL /* LECTURA DE LOS APUNTADORES DE LECTURA */ st Z+,data ldi data,ERXRDPTH st Z+,data ldi data,ERXWRPTL /* LECTURA DE LOS APUNTADORES DE ESCRITURA */ st Z+,data ldi data,ERXWRPTH st Z+,data ldi data,ETXSTL /* LECTURA DEL TAMAÑO DEL BUFFER DE TRANSMISION */ st Z+,data ldi data,ETXSTH st Z+,data ldi data,ETXNDL st Z+,data ldi data,ETXNDH st Z+,data ldi data,ERDPTL st Z+,data ldi data,ERDPTH st Z+,data /*********************************************************************/ ldi data,ECON1 /* CAMBIO AL BANCO DE REGISTROS 01*/ ori data,WCR st Z+,data ldi data,0b00010101 st Z+,data ldi data,ERXFCON /* LECTURA DEL FILTRO DE RECEPCION */ st Z+,data ldi data,EPKTCNT /* LECTURA DEL CONTADOR DE PAQUETES */ st Z+,data /*********************************************************************/ ldi data,ECON1 /* CAMBIO AL BANCO DE REGISTROS 10*/ ori data,WCR st Z+,data ldi data,0b00010110 st Z+,data ldi data,MACON1 /* LECTURA DE LOS REGISTROS DE CONTROL MAC */ st Z+,data

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 64: EDTP Frame Thrower - 148.206.53.231

64

ldi data,MACON3 st Z+,data ldi data,MAMXFLL /* LECTURA DE LOS REGISTROS MAX LENGHT */ st Z+,data ldi data,MAMXFLH st Z+,data ldi data,MABBIPG st Z+,data ldi data,MAIPGL st Z+,data ldi data,MAIPGH st Z+,data /**********************************************************************/ ldi data,ECON1 /* CAMBIO AL BANCO DE REGISTROS 11*/ ori data,WCR st Z+,data ldi data,0b00010111 st Z+,data ldi data,MAADR1 /* LECTURA DE DIRECCION MAC */ st Z+,data ldi data,MAADR2 st Z+,data ldi data,MAADR3 st Z+,data ldi data,MAADR4 st Z+,data ldi data,MAADR5 st Z+,data ldi data,MAADR6 st Z+,data /************************************************************************/ ldi data,ECON1 /* CAMBIO AL BANCO DE REGISTROS 01*/ ori data,WCR st Z+,data ldi data,0b00010101 st Z+,data ret /************************************************ SUBRUTINA DE ATENCION A INTERRUPCION EXTERNA INT1 (recepcion de una trama) *************************************************/ RX: clr r31 ldi r30,$0060 ;SE REINICIA EL APUNTADOR Z clr recibido clr data clr aux2 ldi TEMP,(1<<DDD7) ;SE DESPLIEGA POR UN PUERTO UN INDICADOR out PORTD,TEMP ;DE TRAMA RECIBIDA rcall readbuffer ldi flags,0x01 /*SE HABILITA INTERRUPCION EXTERNA 0 */ ;GIMSK ldi TEMP,(1<<INT0)|(0<<INT1) ; INTERRUPCION 0 HABILITADA out GIMSK,TEMP /** DECREMENTO DEL PACKET COUNTER */ clr TEMP ;SS SE PONE A CERO out PORTB,TEMP

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 65: EDTP Frame Thrower - 148.206.53.231

65

ldi data,ECON2 ori data,WCR out SPDR,data ;SE INICIA LA TRANSMISION DE DATA Wait_TransmitRX3: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitRX3 nop ldi aux,0b11000000 out SPDR,aux ;SE ESCRIBE EN EL PCKDEC Wait_TransmitRX4: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitRX4 clr data clr recibido reti /***************************************************************** FUNCION QUE REALIZA LA LECTURA DEL BUFFER Y LO ALMACENA EN MEMORIA ******************************************************************/ readbuffer: clr aux2 clr TEMP ;SS SE PONE A CERO out PORTB,TEMP ldi data,0b00111010 ;OP CODE PARA READ BUFER MEMORY out SPDR,data ;SE INICIA LA TRANSMISION DE DATA Wait_TransmitRX: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitRX nop reading: ldi aux,0b00000000 out SPDR,aux ;SE TRANSMITEN 00h PARA GENERAR SCK Y RECIBIR DATOS Wait_TransmitRX2: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitRX2 nop in recibido,SPDR ;SE LEE EL DATO RECIBIDO Y SE ALMACENA EN LA MEMORIA DE DATOS st Z+,recibido inc aux2 ldi aux,72 cpse aux2,aux ;SE VERIFICA QUE SE HAYAN RECIBIDO AL MENOS 8O BYTES rjmp reading ser TEMP ;SS=1 out PORTB,TEMP clr data clr recibido clr r31 ldi r30,$0060 ;SE REINICIA EL APUNTADOR Z clr data ret

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 66: EDTP Frame Thrower - 148.206.53.231

66

APENDICE B Prueba 3 En esta prueba se realiza la transmisión de un paquete, cada que se presenta una interrupción externa 0. ;************************************************************************ ; Universidad Autonoma Metropolitana ; PROYECTO TERMINAL I ; "Comunicacion via Ethernet entre una PC y un microcontrolador" ; Alumno: Carrillo Arellano Carlos Ernesto ; Asesor: Dr. Miguel Angel Ruiz Sanchez ; Trimestre O8P ;************************************************************************* .NOLIST .INCLUDE "m8515def.inc" ;CARGA DE LIBRERIAS .LIST .DEF data = R16 ;REGISTROS PARA PROPOSITO GENERAL .DEF register = R17 .DEF TEMP=R18 .DEF recibido = R19 .DEF aux = R20 .DEF aux2 = R21 .DEF flags = R22 /************************** CONSTANTES ***************************/ ;OP CODES .EQU OCWCR = 0x40 .EQU OCRCR = 0x00 ;REGISTROS BANCO 00 .EQU ERDPTL = 0x00 .EQU ERDPTH = 0x01 .EQU EWRPTL = 0x02 .EQU EWRPTH = 0x03 .EQU ETXSTL = 0x04 .EQU ETXSTH = 0x05 .EQU ETXNDL = 0x06 .EQU ETXNDH = 0x07 .EQU ERXSTL = 0x08 .EQU ERXSTH = 0x09 .EQU ERXNDL = 0x0A .EQU ERXNDH = 0x0B .EQU ERXRDPTL = 0x0C .EQU ERXRDPTH = 0x0D .EQU ERXWRPTL = 0x0E .EQU ERXWRPTH = 0x0F ;REGISTROS BANCO 01 .EQU ERXFCON = 0x18 .EQU EPKTCNT = 0x19 ;REGISTROS BANCO 10 .EQU MACON1 = 0x00 .EQU MACON3 = 0x02 .EQU MACON4 = 0x03 .EQU MABBIPG = 0x04 .EQU MAIPGL = 0x06 .EQU MAIPGH = 0x07 .EQU MAMXFLL = 0x0A .EQU MAMXFLH = 0x0B

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 67: EDTP Frame Thrower - 148.206.53.231

67

;REGISTROS BANCO 11 .EQU MAADR5 = 0x00 .EQU MAADR6 = 0x01 .EQU MAADR3 = 0x02 .EQU MAADR4 = 0x03 .EQU MAADR1 = 0x04 .EQU MAADR2 = 0x05 ;REGISTROS GENERALES DE CONTROL .EQU EIE = 0x1B .EQU EIR = 0x1C .EQU ESTAT = 0x1D .EQU ECON2 = 0x1E .EQU ECON1 = 0x1F .org $0000 rjmp start ;SUBRUTINA INICIAL DE CONFIGURACION DEL HARDWARE USADO EN EL PROGRAMA .org int0addr rjmp TX /*********************************************************************************** SUBRUTINA INICIAL DE CONFIGURACION DE HARDWARE ************************************************************************************/ start: clr data ;INICIALIZACION DE REGISTROS DE USO GENERAL clr register clr TEMP clr recibido clr aux clr aux2 clr flags /************************** STACK POINTER ***************************/ ldi TEMP,LOW(RAMEND) ;INICIALIZACÓN DEL STACK POINTER out SPL,TEMP ;(APUNTADOR A LA PILA) ldi TEMP,HIGH(RAMEND) out SPH,TEMP /************************* ;INICIALIZACION DE PUERTOS *************************/ ldi TEMP,(1<<DDD4) out DDRD,TEMP ;EL PIN (D4) SERÁ USADO COMO INDICADOR DE INTERRUPCIONES DE TRANSMISION /***************************** ;CONFIGURACION DEL MODULO SPI *****************************/ ; HABILITACION DE MOSI,SS & SCK COMO SALIDAS, TODAS LAS OTRAS SON ENTRADAS ldi TEMP,(1<<DDB5)|(1<<DDB7)|(1<<DDB4) out DDRB,TEMP ser TEMP out PORTB,TEMP ;SS=1 ldi TEMP,(1<<SPI2X) ;HABILITACION DE VELOCIDAD 2X out SPSR,TEMP ; HABILITACION DE SPIE,SPI, Master mode,clock rate fck/2 ldi TEMP,(0<<SPIE)|(1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0) out SPCR,TEMP rcall storepacket; SE ALMACENA EN LA MEMORIA DE DATOS EL PAQUETE QUE SE TRANSMITIRA rcall inicializacion ;SE INICIALIZA EL MODULO ETHERNET /************************* ;CONFIGURACION DE INTERRUPCIONES EXTERNAS ************************/ ;GIMSK ldi TEMP,(1<<INT0) ; INTERRUPCION 0 HABILITADA out GIMSK,TEMP

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 68: EDTP Frame Thrower - 148.206.53.231

68

;MCUCR ldi TEMP,(1<<ISC01)|(1<<ISC00) ; out MCUCR,TEMP clr data ;TODOS LOS REGISTROS DE USO GENERAL SE PONEN A CEROS clr register clr TEMP clr recibido clr aux clr aux2 clr flags sei ; HABILITACION DE INTERRUPCIONES rjmp main; main: nop ;EL PROGRAMA PRINCIPAL SE ENCONTRARA EN STAND BY, ESPERANDO rjmp main ;UNA INTERRUPCION EXTERNA /***************************************************************************************************************************** SUBRUTINA DE ATENCION A INTERRUPCION EXTERNA, TRANSMISION DE PAQUETE ALMACENADO EN LA MEMORIA DE DATO ****************************************************************************************************************************************/ TX: ldi TEMP,(1<<DDD4) /*SE DESPLIEGA POR UN PIN UN INDICADOR DE INICIO DE TRANSMISION */ out PORTD,TEMP ldi register, ECON1 /* SE DESHABILITA LA TRANSMISION CON ECON1.TXRTS (b3) */ ldi data, 0b00010000 rcall WCR ldi register,ETXSTL /*ESCRITURA DEL REGISTRO ETXST (BUFFER DE TRANSMISION)*/ ldi data,0b00000000 /*DETERMINANDO LA LOCALIDAD DE INICIO DEL BUFFER DE TRANSMISION*/ rcall WCR ldi register,ETXSTH ldi data,0b00000000 rcall WCR ldi register,EWRPTL /* ESCRITUA DEL REGISTRO EWRPT (APUNTADOR DE ESCRITURA)*/ ldi data,0b00000000 /*ESTE APUNTADOR ES USADO POR EL COMANDO WBM PARA ESCRIBIR*/ rcall WCR /*DATOS EN LA LOCALIDAD APUNTADA POR ESTE APUNTADOR*/ ldi register,EWRPTH ldi data,0b00000000 rcall WCR rcall writebuffer /* FUNCION QUE ESCRIBE EN EL BUFFER DE TRANSMISION LOS DATOS A ENVIAR */ ldi register,ETXNDL /* ESCRITURA DEL REGISTRO ETXND */ ldi data,0b0111010 /* DETERMINA LA LOCALIDAD FINAL DEL BUFFER DE TRANSMISION d42*/ rcall WCR ldi register,ETXNDH ldi data,0b00000000 rcall WCR ldi register,EIR /* CLEAR EIR.TXIF (b3) (bandera de interrupcion)*/ ldi data,0b00000000 rcall WCR ldi register, ECON1 /* SE HABILITA LA TRANSMISION CON ECON1.TXRTS (b3) */ ldi data, 0b00011000 rcall WCR ldi TEMP,(0<<DDD4) ;SE APAGA EL INDICADOR DE TRANSMISION out PORTD,TEMP reti

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 69: EDTP Frame Thrower - 148.206.53.231

69

/*********************************************************** FUNCION QUE ESCRIBE EL BUFFER DE TRASNMISION **********************************************************/ writebuffer: clr aux2 clr r31 ldi r30,$0060 ;SE REINICIA EL APUNTADOR Z clr TEMP ;SS SE PONE A CERO out PORTB,TEMP ldi data,0b01111010 ;OP CODE PARA WRITE BUFER MEMORY out SPDR,data ;SE INICIA LA TRANSMISION DE DATA Wait_TransmitWX: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitWX writing: ld aux,Z+ out SPDR,aux ;SE TRANSMITE EL PAQUETE Wait_TransmitWX3: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitWX3 nop inc aux2 ldi aux,58 cpse aux2,aux ;SE VERIFICA QUE SE HAYA ESCRITO COMPLETMENTE LA TRAMA rjmp writing ser TEMP ;SS=1 out PORTB,TEMP clr data clr recibido clr r31 ldi r30,$0060 ;SE REINICIA EL APUNTADOR Z ret /************************************************************************************************************ FUNCION QUE ALMACENA EN LA MEMORIA DE DATOS EL PAQUETE QUE SE DESEA TRANSMITIR **************************************************************************************************************/ storepacket: clr r31 ldi r30,$0060 ; APUNTAMOS Z A LA LOCALIDAD 0060 EN MEMORIA DE DATOS ldi data,0x0B ; LA PRIMERA LOCALIDAD QUE SE TRANSMITIRA ES EL BYTE DE CONTROL st Z+,data ldi data,0xFF st Z+,data ldi data,0xFF st Z+,data ldi data,0xFF st Z+,data ldi data,0xFF st Z+,data ldi data,0xFF st Z+,data ldi data,0xFF st Z+,data ldi data,0x52 st Z+,data ldi data,0x51 st Z+,data ldi data,0x14 st Z+,data ldi data,0x24 st Z+,data ldi data,0x75 st Z+,data ldi data,0x55 st Z+,data ldi data,0x08 st Z+,data ldi data,0x00

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 70: EDTP Frame Thrower - 148.206.53.231

70

st Z+,data ldi data,0x45 st Z+,data ldi data,0x00 st Z+,data ldi data,0x00 st Z+,data ldi data,0x3C st Z+,data ldi data,0x00 st Z+,data ldi data,0x00 st Z+,data ldi data,0x40 st Z+,data ldi data,0x00 st Z+,data ldi data,0x40 st Z+,data ldi data,0x11 st Z+,data ldi data,0xB6 st Z+,data ldi data,0xDF st Z+,data ldi data,0xC0 st Z+,data ldi data,0xA8 st Z+,data ldi data,0x01 st Z+,data ldi data,0x41 st Z+,data ldi data,0XC0 st Z+,data ldi data,0XA8 st Z+,data ldi data,0x01 st Z+,data ldi data,0x40 st Z+,data ldi data,0x00 st Z+,data ldi data,0x00 st Z+,data ldi data,0x00 st Z+,data ldi data,0x00 st Z+,data ldi data,0x00 st Z+,data ldi data,0x18 st Z+,data ldi data,0x3B st Z+,data ldi data,0XA2 st Z+,data ldi data,0x01 st Z+,data ldi data,0x02 st Z+,data ldi data,0x03 st Z+,data ldi data,0x04 st Z+,data ldi data,0x05 st Z+,data ldi data,0x06 st Z+,data ldi data,0x07 st Z+,data

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 71: EDTP Frame Thrower - 148.206.53.231

71

ldi data,0X08 st Z+,data ldi data,0x09 st Z+,data ldi data,0x0A st Z+,data ldi data,0x0B st Z+,data ldi data,0x0C st Z+,data ldi data,0X0D st Z+,data ldi data,0x0E st Z+,data ldi data,0x0F st Z+,data ldi data,0x10 st Z+,data ret /************************************************************************************** FUNCION QUE INICIALIZA EL MODULO ETHERNET ****************************************************************************************/ inicializacion: rcall RESET; //SOFT RESET /*CONFIGURACION DE LOS REGISTROS ECON1:ECON2*/ ldi register,ECON1 ldi data,0b00010000 /* ECON1.CSUMEN (b5)*/ rcall WCR ldi register,ECON2 ldi data,0b10000000 /* ECON2.AUTOINC (b7)*/ rcall WCR /*INICIALIZACION DEL BUFFER DE RECEPCION*/ /*SE PUEDE INICIALIZAR SOLO SI ECON1.RXEN(b2) ES CERO*/ /*CON ESTO SE DETERMINA EL TAMAÑO DEL BUFFER DE RECEPCION*/ ldi register,ERXSTL /*ESCRITURA DEL REGISTRO ERXSTL (08h)*/ ldi data,0b00000000 /* 00 */ rcall WCR ldi register,ERXSTH /*ESCRITURA DEL REGISTRO ERXSTH (09h)*/ ldi data,0b00010000 /* 10 */ rcall WCR ldi register,ERXNDL /*ESCRITURA DEL REGISTRO ERXNDL (0Ah)*/ ldi data,0b11111111 /* FF */ rcall WCR ldi register,ERXNDH /*ESCRITURA DEL REGISTRO ERXNDH 0Bh*/ ldi data,0b00011111 /* 1F */ rcall WCR /* INICIALIZAMOS EL APUNTADOR DE LECTURA DEL BUFFER */ ldi register,ERXRDPTL/*ESCRITURA DEL REGISTRO ERXRDPTL (0Ch)*/ ldi data,0b00000000 /* 00 */ rcall WCR ldi register,ERXRDPTH/*ESCRITURA DEL REGISTRO ERXRDPTH (0Dh)*/ ldi data,0b00010000 /* 10 */ rcall WCR ldi register,ERDPTL /*ESCRITURA DEL REGISTRO ERXRDPTH (0Dh)*/ ldi data,0b00000000 /* 00 */ rcall WCR ldi register,ERDPTH /*ESCRITURA DEL REGISTRO ERXRDPTH (0Dh)*/ ldi data,0b00010000 /* 10 */ rcall WCR

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 72: EDTP Frame Thrower - 148.206.53.231

72

/*CONFIGURACION DE LOS FILTROS DE RECEPCION*/ ldi register,ECON1 /* CAMBIO AL BANCO DE REGISTROS 01*/ ldi data,0b00010001 rcall WCR ldi register,ERXFCON /* CONFIGURACION DEL FILTRO DE RECEPCION */ ldi data,0b00000000 rcall WCR ldi register,EPKTCNT /* PACKET COUNTER =0 */ ldi data,0b00000000 rcall WCR /* INICIALIZACION DE REGISTROS DE CONTROL MAC */ /***********************************************************************/ ldi register,ECON1 /* CAMBIO AL BANCO DE REGISTROS 10*/ ldi data,0b00010010 rcall WCR ldi register,MACON1 /*MACON1.MARXEN (b0) */ ldi data,0b00000001 rcall WCR ldi register,MACON3 /* MACON3.PADCFG (b7,6,5) No padding MACON3.TXCRCEN (b4) */ ldi data,0b00010100 rcall WCR ldi register,MAMXFLL /* ESCRITURA DEL REGISTRO MAMXFL (MAXIMUM FRAME LENGHT) */ ldi data,0b10000000 rcall WCR ldi register,MAMXFLH ldi data,0b00000000 rcall WCR ldi register,MABBIPG ldi data,0b00010010 rcall WCR ldi register,MAIPGL ldi data,0b00010010 rcall WCR ldi register,MAIPGH ldi data,0x0C rcall WCR /********************************************************************/ /* CONFIGURACION DE LA DIRECION MAC */ ldi register,ECON1 /* CAMBIO AL BANCO DE REGISTROS 11*/ ldi data,0b00010011 rcall WCR ldi register,MAADR1 ldi data,0x52 rcall WCR ldi register,MAADR2 ldi data,0x51 rcall WCR ldi register,MAADR3 ldi data,0x14 rcall WCR ldi register,MAADR4 ldi data,0x24 rcall WCR

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 73: EDTP Frame Thrower - 148.206.53.231

73

ldi register,MAADR5 ldi data,0x75 rcall WCR ldi register,MAADR6 ldi data,0x55 rcall WCR /******************************************************************/ /*HABILITACION DE INTERRUPCIONES */ ldi register,ECON1 /* CAMBIO AL BANCO DE REGISTROS 00*/ ldi data,0b00010000 rcall WCR ldi register,EIE /* PARA ESTA PRUEBA NO SE HABILITARON INTERRUPCIONES*/ ldi data,0b00000000 rcall WCR ret /******************************************************************************************** RESET DEL MODULO ETHERNET, FUNCION QUE ENVIA UN RESET AL ENC28J60 *******************************************************************************************/ RESET: ldi data,0b11111111 /* RESET DEL MODULO ETHERNET */ clr TEMP ; SS SE PONE A CERO out PORTB,TEMP out SPDR,data ;SE INICIA LA TRANSMISION DE DATA Wait_Transmit: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_Transmit ser TEMP ;SS=1 out PORTB,TEMP ret /************************************************************************ FUNCION WRITE CONTROL REGISTER "WCR(register,data)" *************************************************************************/ WCR: ori register, OCWCR clr TEMP ;SS =0 out PORTB,TEMP out SPDR,register ;SE INICIA LA TRANSMISION DE REGISTER Wait_Transmit1: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit1 out SPDR,data ;SE TRANSMITEN EL DATO PARA ALMACENAR EN REGISTER Wait_Transmit2: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit2 ser TEMP ;SS=1 out PORTB,TEMP ret

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 74: EDTP Frame Thrower - 148.206.53.231

74

/************************************************* FUNCION READ CONTROL REGISTER "RCR (register) *************************************************/ RCR: clr TEMP ;SS SE PONE A CERO out PORTB,TEMP out SPDR,register ;SE INICIA LA TRANSMISION DE DATA Wait_Transmit3: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_Transmit3 ldi aux,0b00000000 out SPDR,aux ;SE TRANSMITEN 00h PARA GENERAR SCK Y RECIBIR DATOS Wait_Transmit4: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_Transmit4 ser TEMP ;SS=1 out PORTB,TEMP in recibido,SPDR ;SE LEE EL DATO RECIBIDO ret

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 75: EDTP Frame Thrower - 148.206.53.231

75

APENDICE C Prueba 4 Prueba fundamental donde se puede apreciar el eco a un ICMP ping que va desde la PC hacia el micro

controlador, debe aclararse que este código presenta problemas, pues el host solo responde a un ping, presentando problemas para responder a mas peticiones, esto parece ser ocasionado por algún problema con los apuntadores del buffer Ethernet. Además falta agregar el código necesario para que el micro controlador pueda responder a un PING desde MS-DOS, es decir que responda primeramente al paquete ARP para posteriormente realizar el eco al PING

;************************************************************************ ; Universidad Autonoma Metropolitana ; PROYECTO TERMINAL I ; "Comunicacion via Ethernet entre una PC y un microcontrolador" ; Alumno: Carrillo Arellano Carlos Ernesto ; Asesor: Dr. Miguel Angel Ruiz Sanchez ; Trimestre O8P ;************************************************************************* .NOLIST .INCLUDE "m8515def.inc" ;CARGA DE LIBRERIAS .LIST .DEF data = R16 ;REGISTROS PARA PROPOSITO GENERAL .DEF register = R17 .DEF TEMP=R18 .DEF recibido = R19 .DEF aux = R20 .DEF aux2 = R21 .DEF flags = R22 /************************** CONSTANTES ***************************/ ;OP CODES .EQU OCWCR = 0x40 .EQU OCRCR = 0x00 ;REGISTROS BANCO 00 .EQU ERDPTL = 0x00 .EQU ERDPTH = 0x01 .EQU EWRPTL = 0x02 .EQU EWRPTH = 0x03 .EQU ETXSTL = 0x04 .EQU ETXSTH = 0x05 .EQU ETXNDL = 0x06 .EQU ETXNDH = 0x07 .EQU ERXSTL = 0x08 .EQU ERXSTH = 0x09 .EQU ERXNDL = 0x0A .EQU ERXNDH = 0x0B .EQU ERXRDPTL = 0x0C .EQU ERXRDPTH = 0x0D .EQU ERXWRPTL = 0x0E .EQU ERXWRPTH = 0x0F ;REGISTROS BANCO 01 .EQU ERXFCON = 0x18 .EQU EPKTCNT = 0x19 ;REGISTROS BANCO 10 .EQU MACON1 = 0x00 .EQU MACON3 = 0x02 .EQU MACON4 = 0x03 .EQU MABBIPG = 0x04 .EQU MAIPGL = 0x06

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 76: EDTP Frame Thrower - 148.206.53.231

76

.EQU MAIPGH = 0x07 .EQU MAMXFLL = 0x0A .EQU MAMXFLH = 0x0B ;REGISTROS BANCO 11 .EQU MAADR5 = 0x00 .EQU MAADR6 = 0x01 .EQU MAADR3 = 0x02 .EQU MAADR4 = 0x03 .EQU MAADR1 = 0x04 .EQU MAADR2 = 0x05 ;REGISTROS GENERALES DE CONTROL .EQU EIE = 0x1B .EQU EIR = 0x1C .EQU ESTAT = 0x1D .EQU ECON2 = 0x1E .EQU ECON1 = 0x1F .org $0000 rjmp start ;SUBRUTINA INICIAL DE CONFIGURACION DEL HARDWARE USADO EN EL PROGRAMA .org INT0addr ;SUBRUTINA DE ATENCION A INTERRUPCION EXTERNA 0 (BUUFER Rx CONTIENE TRAMA) rjmp RX .org INT1addr ;SUBRUTINA DE ATENCION A INTERRUPCION EXTERNA 1 (TRANSMISION COMPLETA DE ECHO) rjmp TX /*********************************************************************************** SUBRUTINA INICIAL DE CONFIGURACION DE HARDWARE ************************************************************************************/ start: clr data ;INICIALIZACION DE REGISTROS DE USO GENERAL clr register clr TEMP clr recibido clr aux clr aux2 clr flags /************************** STACK POINTER ***************************/ ldi TEMP,LOW(RAMEND) ;INICIALIZACÓN DEL STACK POINTER out SPL,TEMP ;(APUNTADOR A LA PILA) ldi TEMP,HIGH(RAMEND) out SPH,TEMP /************************* ;INICIALIZACION DE PUERTOS *************************/ ldi TEMP,(1<<DDD7)|(1<<DDD4) out DDRD,TEMP ;EL PIN (D7) SERÁ USADO COMO INDICADOR DE INTERRUPCIONES DE RECEPCION ;EL PIN (D4) SERÁ USADO COMO INDICADOR DE INTERRUPCIONES DE TRANSMISION /***************************** ;CONFIGURACION DEL MODULO SPI *****************************/ ; HABILITACION DE MOSI,SS & SCK COMO SALIDAS, TODAS LAS OTRAS SON ENTRADAS ldi TEMP,(1<<DDB5)|(1<<DDB7)|(1<<DDB4) out DDRB,TEMP ser TEMP out PORTB,TEMP ;SS=1 ldi TEMP,(1<<SPI2X) ;HABILITACION DE VELOCIDAD 2X out SPSR,TEMP ; HABILITACION DE SPIE,SPI, Master mode,clock rate fck/2 ldi TEMP,(0<<SPIE)|(1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0) out SPCR,TEMP

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 77: EDTP Frame Thrower - 148.206.53.231

77

/********************************************************/ rcall storepacket; SE ALMACENA EN LA MEMORIA DE DATOS EL PAQUETE QUE SE TRANSMITIRA rcall inicializacion ;SE INICIALIZA EL MODULO ETHERNET /*********************************************************/ /************************* ;CONFIGURACION DE INTERRUPCIONES EXTERNAS *************************/ ;GIMSK ldi TEMP,(1<<INT0)|(0<<INT1) ; INTERRUPCION 0 HABILITADA & 1 DESHABILITADA out GIMSK,TEMP ;MCUCR ldi TEMP,(1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10) ; INTERRUPCION 0 & 1 POR FLANCO DE BAJADA out MCUCR,TEMP clr data ;TODAS LOS REGISTROS DE USO GENERAL SE PONEN A CEROS clr register clr TEMP clr recibido clr aux clr aux2 clr flags clr r31 ldi r30,$0060; APUNTAMOS Z A LA LOCALIDAD 0060 EN MEMORIA DE DATOS sei ; HABILITACION DE INTERRUPCIONES main: nop rjmp main; /************************************************ RESET DEL MODULO ETHERNET **************1**********************************/ RESET: ldi data,0b11111111 /* RESET DEL MODULO ETHERNET */ clr TEMP ; SS SE PONE A CERO out PORTB,TEMP out SPDR,data ;SE INICIA LA TRANSMISION DE DATA Wait_Transmit: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_Transmit ser TEMP ;SS=1 out PORTB,TEMP ret /************************************************* FUNCION WRITE CONTROL REGISTER "WCR(register,data)" **************************************************/ WCR: ori register, OCWCR clr TEMP ;SS =0 out PORTB,TEMP out SPDR,register ;SE INICIA LA TRANSMISION DE REGISTER Wait_Transmit1: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit1 out SPDR,data ;SE TRANSMITEN EL DATO PARA ALMACENAR EN REGISTER Wait_Transmit2: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit2 ser TEMP ;SS=1 out PORTB,TEMP ret

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 78: EDTP Frame Thrower - 148.206.53.231

78

/*********************************************** FUNCION READ CONTROL REGISTER "RCR(register)" ************************************************/ RCR: clr TEMP ;SS=0 out PORTB,TEMP out SPDR,register ;SE INICIA LA TRANSMISION DE DATA Wait_Transmit3: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit3 clr data out SPDR,data ;SE TRANSMITEN CEROS PARA GENERAR SCK Wait_Transmit4: ; Espera para que la transmisión se complete sbis SPSR,SPIF rjmp Wait_Transmit4 ser TEMP ;SS=1 out PORTB,TEMP in data, SPDR ;ALMACENAMOS EL VALOR LEIDO DEL REGISTRO EN DATA ret /******************************************************** FUNCION QUE INICIALIZA EL MODULO ETHERNET ********************************************************/ inicializacion: rcall RESET; //SOFT RESET /*CONFIGURACION DE LOS REGISTROS ECON1:ECON2*/ ldi register,ECON1 ldi data,0b00010000 /* ECON1.CSUMEN (b5) BANK SELECTOR 00*/ rcall WCR ldi register,ECON2 ldi data,0b11000000 /* ECON2.AUTOINC (b7)*/ rcall WCR /*INICIALIZACION DEL BUFFER DE RECEPCION*/ /*SE PUEDE INICIALIZAR SOLO SI ECON1.RXEN(b2) ES CERO*/ /*CON ESTO SE DETERMINA EL TAMAÑO DEL BUFFER DE RECEPCION*/ ldi register,ERXSTL /*ESCRITURA DEL REGISTRO ERXSTL (08h)*/ ldi data,0b00000000 /* 00 */ rcall WCR ldi register,ERXSTH /*ESCRITURA DEL REGISTRO ERXSTH (09h)*/ ldi data,0b00010000 /* 10 */ rcall WCR ldi register,ERXNDL /*ESCRITURA DEL REGISTRO ERXNDL (0Ah)*/ ldi data,0b11111111 /* FF */ rcall WCR ldi register,ERXNDH /*ESCRITURA DEL REGISTRO ERXNDH 0Bh*/ ldi data,0b00011111 /* 1F */ rcall WCR /* INICIALIZAMOS EL APUNTADOR DE LECTURA DEL BUFFER */ ldi register,ERXRDPTL/*ESCRITURA DEL REGISTRO ERXRDPTL (0Ch)*/ ldi data,0b00000000 /* 00 */ rcall WCR ldi register,ERXRDPTH/*ESCRITURA DEL REGISTRO ERXRDPTH (0Dh)*/ ldi data,0b00010000 /* 10 */ rcall WCR ldi register,ERDPTL /*ESCRITURA DEL REGISTRO ERDPTL (00h)*/ ldi data,0b00000000 /* 00 */ rcall WCR ldi register,ERDPTH /*ESCRITURA DEL REGISTRO ERDPTH (01h)*/

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 79: EDTP Frame Thrower - 148.206.53.231

79

ldi data,0b00010000 /* 10 */ rcall WCR /* INICIALIZAMOS EL APUNTADOR DE ESCRITURA DEL BUFFER */ ldi register,EWRPTL /*ESCRITURA DEL REGISTRO EWRPTL (02h)*/ ldi data,0b00000000 /* 00 */ rcall WCR ldi register,EWRPTH /*ESCRITURA DEL REGISTRO EWRPTH (03h)*/ ldi data,0b00000000 /* 00 */ rcall WCR /*CONFIGURACION DE LOS FILTROS DE RECEPCION*/ ldi register,ECON1 /* CAMBIO AL BANCO DE REGISTROS 01*/ ldi data,0b00010001 rcall WCR ldi register,ERXFCON /* CONFIGURACION DEL FILTRO DE RECEPCION */ /* ERXFCON.UCEN(b7) & ERXFCON.CRCEN (b5)*/ ldi data,0b10100000 /* UNICAST FILTER ENABLE(b7), CRC ENABLE (b5)*/ rcall WCR ldi register,EPKTCNT /* PACKET COUNTER =0 */ ldi data,0b00000000 rcall WCR /* INICIALIZACION DE REGISTROS DE CONTROL MAC */ /***********************************************************************/ ldi register,ECON1 /* CAMBIO AL BANCO DE REGISTROS 10*/ ldi data,0b00010010 rcall WCR ldi register,MACON1 /*MACON1.MARXEN (b0) */ ldi data,0b00000001 rcall WCR ldi register,MACON3 /* MACON3.PADCFG (b7,6,5) No padding MACON3.TXCRCEN (b4) */ ldi data,0b00010000 /* MACON3.HFRMEN (b2) Huge frame enable bit */ rcall WCR ldi register,MAMXFLL /* ESCRITURA DEL REGISTRO MAMXFL (MAXIMUM FRAME LENGHT) 50 bytes*/ ldi data,0b00110010 rcall WCR ldi register,MAMXFLH ldi data,0b00000000 rcall WCR ldi register,MABBIPG ldi data,0b00010010 rcall WCR ldi register,MAIPGL ldi data,0b00010010 rcall WCR ldi register,MAIPGH ldi data,0x0C rcall WCR /********************************************************************/ /* CONFIGURACION DE LA DIRECION MAC */ ldi register,ECON1 /* CAMBIO AL BANCO DE REGISTROS 11*/ ldi data,0b00010011 rcall WCR ldi register,MAADR1 ldi data,0x52 rcall WCR

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 80: EDTP Frame Thrower - 148.206.53.231

80

ldi register,MAADR2 ldi data,0x51 rcall WCR ldi register,MAADR3 ldi data,0x14 rcall WCR ldi register,MAADR4 ldi data,0x24 rcall WCR ldi register,MAADR5 ldi data,0x75 rcall WCR ldi register,MAADR6 ldi data,0x55 rcall WCR /******************************************************************/ /*HABILITACION DE LA RECEPCION Y DE INTERRUPCIONES */ ldi register,ECON1 /* CAMBIO AL BANCO DE REGISTROS 00*/ ldi data,0b00010000 rcall WCR ldi register,EIE /* SE HABILITAN INTERRUPCIONES EIE.INTIE (b7) & EIE.PKTIE (b6)*/ ldi data,0b11000000 rcall WCR ldi register,ECON1 /* SE HABILITA LA RECEPCION ECON1.RXEN (b2)*/ ldi data,0b00010100 rcall WCR ret /************************************************************************** SUBRUTINA DE ATENCION A INTERRUPCION EXTERNA INT0 (recepcion de una trama) ***************************************************************************/ RX: clr flags /*SE DESHABILITA INTERRUPCION EXTERNA 0 */ ;GIMSK ldi TEMP,(0<<INT0) ; INTERRUPCION 0 DESHABILITADA out GIMSK,TEMP ldi register,EIE /* SE DESHABILITA LA INTERRUPCION DEL MODULO ETHERNET */ ldi data,0b00000000 rcall WCR ldi register,ECON1 /* SE DESHABILITA LA RECEPCION DEL MODULO ETHERNET ECON1.RXEN (b2)*/ ldi data,0b00010000 rcall WCR clr r31 ldi r30,$0060 ;SE REINICIA EL APUNTADOR Z clr recibido clr data clr aux2 ldi TEMP,(1<<DDD7)|(0<<DDD4) ;SE DESPLIEGA POR UN PUERTO UN INDICADOR out PORTD,TEMP ;DE TRAMA RECIBIDA rcall readbuffer ;SE LEE EL BUFFER DE RECEPCION DEL ENC28J60 rcall verifyIP ;SE VERIFICA QUE LA DIRECCION IP SEA LA DEL MICROCONTROLADOR cpi flags,0 ;SI LA DIRECCION IP ES INVALIDA NO HABRÁ ECHO breq exit2 rcall echo ;SE REALIZA EL ECHO A UN PING SI LA IP ES LA DEL DISPOSITIVO

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 81: EDTP Frame Thrower - 148.206.53.231

81

exit2: ldi TEMP,(0<<DDD7)|(0<<DDD4) ;SE APAGAN INDICADORES out PORTD,TEMP /** DECREMENTO DEL PACKET COUNTER */ ldi register, ECON2 ldi data,0b11000000 rcall WCR ldi register,EPKTCNT /* PACKET COUNTER =0 */ ldi data,0b00000000 rcall WCR ldi register,ERXRDPTL /* SE AJUSTA EL APUNTADOR DEL APUNTADOR DELFINAL DE LA FIFO */ ld data, Z+ rcall WCR ldi register,ERXRDPTH ld data, Z+ rcall WCR /*HABILITACION DE LA RECEPCION Y DE INTERRUPCIONES */ ldi register,ECON1 /* CAMBIO AL BANCO DE REGISTROS 00*/ ldi data,0b00010000 rcall WCR ldi register,EIE /* SE HABILITAN INTERRUPCIONES EIE.INTIE (b7) & EIE.PKTIE (b6)*/ ldi data,0b11000000 rcall WCR ldi register,ECON1 /* SE HABILITA LA RECEPCION ECON1.RXEN (b2)*/ ldi data,0b00010100 rcall WCR clr data ;TODAS LOS REGISTROS DE USO GENERAL SE PONEN A CEROS clr register clr TEMP clr recibido clr aux clr aux2 clr flags clr r31 ldi r30,$0060 ;SE REINICIA EL APUNTADOR Z /*SE HABILITA INTERRUPCION EXTERNA 0 */ ;GIMSK ldi TEMP,(1<<INT0) ; INTERRUPCION 0 HABILITADA out GIMSK,TEMP sei reti /***************************************************************** FUNCION QUE REALIZA LA LECTURA DEL BUFFER Y LO ALMACENA EN MEMORIA ******************************************************************/ readbuffer: clr aux2 clr r31 ldi r30,$0060 ;SE REINICIA EL APUNTADOR Z clr TEMP ;SS SE PONE A CERO out PORTB,TEMP ldi data,0b00111010 ;OP CODE PARA READ BUFER MEMORY out SPDR,data ;SE INICIA LA TRANSMISION DE DATA Wait_TransmitRX: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitRX nop

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 82: EDTP Frame Thrower - 148.206.53.231

82

reading: ldi aux,0b00000000 out SPDR,aux ;SE TRANSMITEN 00h PARA GENERAR SCK Y RECIBIR DATOS Wait_TransmitRX2: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitRX2 nop in recibido,SPDR ;SE LEE EL DATO RECIBIDO Y SE ALMACENA EN LA MEMORIA DE DATOS st Z+,recibido inc aux2 ldi aux,74 cpse aux2,aux ;SE VERIFICA QUE SE HAYAN RECIBIDO AL MENOS 8O BYTES rjmp reading ser TEMP ;SS=1 out PORTB,TEMP clr data clr recibido clr r31 ldi r30,$0060 ;SE REINICIA EL APUNTADOR Z ret /******************************************************** FUNCION QUE REALIZA EL ECHO A UNA PETICIÓN DE PING **********************************************************/ echo: ldi flags,0 ldi TEMP,(1<<DDD7)|(1<<DDD4) ;SE DESPLIEGA POR UN PUERTO UN INDICADOR out PORTD,TEMP ldi register,ETXSTL /*ESCRITURA DEL REGISTRO ETXST (BUFFER DE TRANSMISION)*/ ldi data,0b00000000 /*DETERMINANDO LA LOCALIDAD DE INICIO DEL BUFFER DE TRANSMISION*/ rcall WCR ldi register,ETXSTH ldi data,0b00000000 rcall WCR /* INICIALIZAMOS EL APUNTADOR DE ESCRITURA DEL BUFFER */ ldi register,EWRPTL /*ESCRITURA DEL REGISTRO EWRPTL (02h)*/ ldi data,0b00000000 /* 00 */ rcall WCR ldi register,EWRPTH /*ESCRITURA DEL REGISTRO EWRPTH (03h)*/ ldi data,0b00000000 /* 00 */ rcall WCR rcall writebuffer /* FUNCION QUE ESCRIBE EN EL BUFFER DE TRANSMISION LOS DATOS A ENVIAR

*/ ldi register,ETXNDL /* ESCRITURA DEL REGISTRO ETXND */ ldi data,0b00101000 /* DETERMINA EL FINAL DEL BUFFER DE TRANSMISION d42*/ rcall WCR ldi register,ETXNDH ldi data,0b00000000 rcall WCR /*SE HABILITA INTERRUPCION EXTERNA 1 */ ;GIMSK ldi TEMP,(1<<INT1) ; INTERRUPCION 1 HABILITADA out GIMSK,TEMP sei ldi register,EIR /* CLEAR EIR.TXIF (b3) (bandera de interrupcion)*/ ldi data,0b00000000 rcall WCR ldi register,EIE /* SE HABILITA LA INTERRUPCION DE TRANSMISION */

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 83: EDTP Frame Thrower - 148.206.53.231

83

ldi data, 0b10001000 /* EIE.INTIE (b7) & EIE.TXIE (b3) */ rcall WCR ldi register, ECON1 /* SE HABILITA LA TRANSMISION CON ECON1.TXRTS (b3) */ ldi data, 0b00011000 rcall WCR bucle: cpi flags,1 breq exit rjmp bucle exit: ldi register,EIR /* CLEAR EIR.TXIF (b3) (bandera de interrupcion)*/ ldi data,0b00000000 rcall WCR /*SE DESHABILITA INTERRUPCION EXTERNA 1 */ ;GIMSK ldi TEMP,(0<<INT1) ; INTERRUPCION 1 DESHABILITADA out GIMSK,TEMP ret /*********************************************************** FUNCION QUE ESCRIBE EL BUFFER DE TRASNMISION **********************************************************/ writebuffer: clr aux2 clr r31 ldi r30,$00C0 ;SE REINICIA EL APUNTADOR Z A $00C0 clr TEMP ;SS SE PONE A CERO out PORTB,TEMP ldi data,0b01111010 ;OP CODE PARA WRITE BUFER MEMORY out SPDR,data ;SE INICIA LA TRANSMISION DE DATA Wait_TransmitWX: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitWX nop ldi aux,0b00001011 ;PHUGEEN (b3) PPADEN (b2) PCRCEN (b1) POVERRIDE(b0) out SPDR,aux ;SE TRANSMITE EL PACKET CONTROL BYTE Wait_TransmitWX2: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitWX2 nop writing: ld aux,Z+ out SPDR,aux ;SE TRANSMITE EL PAQUETE Wait_TransmitWX3: ; Espera para que la transmision se complete sbis SPSR,SPIF rjmp Wait_TransmitWX3 nop inc aux2 ldi aux,74 cpse aux2,aux ;SE VERIFICA QUE SE HAYA ESCRITO COMPLETMENTE LA TRAMA rjmp writing ser TEMP ;SS=1 out PORTB,TEMP clr data clr recibido clr r31 ldi r30,$0060 ;SE REINICIA EL APUNTADOR Z ret

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 84: EDTP Frame Thrower - 148.206.53.231

84

/********************************************************* FUNCION QUE VERIFICA QUE LA DIRECCION IP SEA VALIDA **********************************************************/ verifyIP: clr r31 ldi r30,$0082;SE COLOCA EL APUNTADOR SOBRE LA DIRECCION IP Y SE VERIFICA ld aux,Z+ cpi aux,0XC0 breq next ret next: ld aux,Z+ cpi aux,0XA8 breq next2 ret next2: ld aux,Z+ cpi aux,0X01 breq next3 ret next3: ld aux,Z+ cpi aux,0x41 breq next4 ret next4: clr r31 ldi r30,$007A;SE COLOCA EL APUNTADOR SOBRE protocolo Y SE VERIFICA ld aux,Z+ cpi aux,0x01 breq next5 ret next5: clr r31 ldi r30,$0085;SE COLOCA EL APUNTADOR SOBRE type Y SE VERIFICA ld aux,Z+ cpi aux,0X08 breq next6 ret next6: ldi flags,0x01 /*TODOS LOS CAMPOS SON CORRECTOS ret /********************************************************************** INTERRUPCION QUE SIRVE COMO AVISO DE QUE EL PAQUETE HA SIDO TRANSMITIDO Y SIRVE PARA SALIR DEL BUCLE DE ESPERA ***********************************************************************/ TX: ldi flags,0x01 reti /***************************************************************************** FUNCION QUE ALMACENA EN LA MEMORIA DE DATOS EL PAQUETE QUE SE DESEA TRANSMITIR *************************************************************************/ storepacket: clr r31 ldi r30,$00C0 ; APUNTAMOS Z A LA LOCALIDAD 00B0 EN MEMORIA DE DATOS ldi data,0x0B ; LA PRIMERA LOCALIDAD QUE SE TRANSMITIRA ES EL BYTE DE CONTROL st Z+,data

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 85: EDTP Frame Thrower - 148.206.53.231

85

ldi data,0x00 st Z+,data ldi data,0x1F st Z+,data ldi data,0xB3 st Z+,data ldi data,0xB7 st Z+,data ldi data,0x14 st Z+,data ldi data,0xDA st Z+,data ldi data,0x52 st Z+,data ldi data,0x51 st Z+,data ldi data,0x14 st Z+,data ldi data,0x24 st Z+,data ldi data,0x75 st Z+,data ldi data,0x55 st Z+,data ldi data,0x08 st Z+,data ldi data,0x00 st Z+,data ldi data,0x45 st Z+,data ldi data,0x00 st Z+,data ldi data,0x00 st Z+,data ldi data,0x3C st Z+,data ldi data,0xDE st Z+,data ldi data,0xE6 st Z+,data ldi data,0x00 st Z+,data ldi data,0x00 st Z+,data ldi data,0xED st Z+,data ldi data,0x01 st Z+,data ldi data,0x6B st Z+,data ldi data,0x08 st Z+,data ldi data,0xC0 st Z+,data ldi data,0xA8 st Z+,data ldi data,0x01 st Z+,data ldi data,0x41 st Z+,data ldi data,0XC0 st Z+,data ldi data,0XA8 st Z+,data ldi data,0x01 st Z+,data ldi data,0x40 st Z+,data ldi data,0x00 st Z+,data ldi data,0x00

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 86: EDTP Frame Thrower - 148.206.53.231

86

st Z+,data ldi data,0xA5 st Z+,data ldi data,0x5B st Z+,data ldi data,0x02 st Z+,data ldi data,0x00 st Z+,data ldi data,0xAE st Z+,data ldi data,0X00 st Z+,data ldi data,0x61 st Z+,data ldi data,0x62 st Z+,data ldi data,0x63 st Z+,data ldi data,0x64 st Z+,data ldi data,0x65 st Z+,data ldi data,0x66 st Z+,data ldi data,0x67 st Z+,data ldi data,0X68 st Z+,data ldi data,0x69 st Z+,data ldi data,0x6A st Z+,data ldi data,0x6B st Z+,data ldi data,0x6C st Z+,data ldi data,0X6D st Z+,data ldi data,0x6E st Z+,data ldi data,0x6F st Z+,data ldi data,0x70 st Z+,data ldi data,0x71 st Z+,data ldi data,0x72 st Z+,data ldi data,0x73 st Z+,data ldi data,0x74 st Z+,data ldi data,0x75 st Z+,data ldi data,0x76 st Z+,data ldi data,0x77 st Z+,data ldi data,0x61 st Z+,data ldi data,0x62 st Z+,data ldi data,0x63 st Z+,data ldi data,0x64 st Z+,data ldi data,0x65 st Z+,data ldi data,0x66 st Z+,data

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Page 87: EDTP Frame Thrower - 148.206.53.231

87

ldi data,0x67 st Z+,data ldi data,0X68 st Z+,data ldi data,0x69 st Z+,data ret

UNIVERSIDAD AUTÓNOMA METROPOLITANA