TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: groundman en 20 de Octubre de 2010, 10:51:59
-
hola a todos.quiero abrir este tema para realizar librerias para controlar el controlador ethernet ENC28j60.
asi que se realizaran pequeños programas que se iran implementando y asi crear las funciones necesarias para el control del ENC28j60.
uno de los primeros programas que estoy realizando para aprender a usar el ENC28j60 es la lectura de sus registros y pasarlos a una localizacion de
la memoria del pic.esto es para leer en el momento que queramos,los registros del ENC28j60 y poder analizarlos.
asi que los subire pronto.
NOTA: como lo que voy publicando son los aprendizages de mis experiencias con este controlador de ethernet.es muy posible que algunas de las respuestas.
contengan algun error.por eso siempre que se necesite un archivo o algun codigo,dirigirse a las ultimas respuestas.ya que seran las mas actualizadas.
-
bueno mi pana aqui estoy para ayudar
-
;***********************************REGISTROS DE CONTROL*****************************************
;
rcr bcf CS2
call transcept,0
call transcept,0
btfsc FLAGS,0 ;comprueva si los registros son (ETH) o (MAC y MII)
call transcept,0
bsf CS2
return 0
rbm movlw b'00111010' ;lectura del buffer de memoria
bcf CS2
call transcept,0
return 0
wcr addlw WCR ;escritura en el registro de control
bcf CS2
call transcept,0
movf DATO,W
call transcept,0
bsf CS2
return 0
wbm movlw b'01111010' ;escritura en el buffer de memoria
bcf CS2
call transcept,0
return 0
bfs addlw BFS ;activacion de un bit de una palabra
bcf CS2
call transcept,0
movf DATO,W
call transcept,0
bsf CS2
return 0
bfc addlw BFC ;borrado de un bit de una palabra
bcf CS2
call transcept,0
movf DATO,W
call transcept,0
bsf CS2
return 0
src movlw 0xff ;reseteo del sistema
bcf CS2
call transcept,0
bsf CS2
return 0
;************************************ Subrutina de Recepcion y Transmision de Datos ***************
transcept bcf CS2 ; habilita chip enc28j60
movwf SSPBUF,ACCESS ; cargar el contenido de w al registro de recepcion/transmisin de datos
lop1 btfss SSPSTAT,BF,ACCESS ; espera a que se complete la transmision
goto lop1 ; si no ha terminado,espera.
movf SSPBUF,W,ACCESS ; carga el contenido del registro de recepcion/transmisin de datos en w
movwf rxdata,ACCESS ; carga el contenido de w en rxdata
return 0 ; retorno de subrutina
-
por fin he terminado el simulador para leer los registros de control y registros PHY del enc28j60.
al realizar una llamada a este programa,lo que hace es copiar el contenido de los registros de control y PHY del enc 28j60.
a unas posiciones predefinidas del pic.en este caso el 18f4550.
ahora me pondre con el buffer ethernet.y cuando lo tenga todo acabado,explicare su funcionamiento.
por el momento publico lo que tengo.no vaya a que pierda los datos con el trabajo que me ha costado.
;************************************************************************************************************************************************
; LIBRERIA PARA LA VISUALIZACION DE LOS REGISTROS DE CONTROL DEL ENC28J60
;************************************************************************************************************************************************
;Este programa visualiza el estado de todos los registros del enc28j60 en el momento en que lo llamemos.
;por defecto se ha hubicado una tabla con todos los registros en la direccion 100h de la ram de datos.
;Todos los registros pueden ser escritos para posteriormente leerlos.excepto EREVID que no puede escribirse.
;por defecto se ha incluido una tabla que esta hubicada en la direccion 1050h de la eeprom de programa
;Este programa necesita del programa enc28j60.inc para las llamadas al los comandos del enc28j60
;REGISTROS A INCLUIR EN EL PROGRAMA PRINCIPAL
;registros de control del ENC28J60
CBLOCK 0X100
REG_ERDPTL
REG_ERDPTH
REG_EWRPTL
REG_EWRPTH
REG_ETXSTL
REG_ETXSTH
REG_ETXNDL
REG_ETXNDH
REG_ERXSTL
REG_ERXSTH
REG_ERXNDL
REG_ERXNDH
REG_ERXRDPTL
REG_ERXRDPTH
REG_ERXWRPTL
REG_ERXWRPTH
REG_EDMASTL
REG_EDMASTH
REG_EDMANDL
REG_EDMANDH
REG_EDMADSTL
REG_EDMADSTH
REG_REG_EDMACSL
REG_EDMACSH
;REG_O0
;O1
;O2
REG_EIE
REG_EIR
REG_ESTAT
REG_ECON2
REG_ECON1
REG_EHT0
REG_EHT1
REG_EHT2
REG_EHT3
REG_EHT4
REG_EHT5
REG_EHT6
REG_EHT7
REG_EPMM0
REG_EPMM1
REG_EPMM2
REG_EPMM3
REG_EPMM4
REG_EPMM5
REG_EPMM6
REG_EPMM7
REG_EPMCSL
REG_EPMCSH
;O3
;O4
REG_EPMOL
REG_EPMOH
;O5
;O6
REG_ERXFCON
REG_EPKTCNT
;O7
;REG_EIE.
;REG_EIR.
;REG_ESTAT.
;REG_ECON2.
;ECON1.
REG_MACON1
;O8
REG_MACON3
REG_MACON4
REG_MABBIPG
;O9
REG_MAIPGL
REG_MAIPGH
REG_MACLCON1
REG_MACLCON2
REG_MAMXFLL
REG_MAMXFLH
;O10
;O11
;O12
;O13
;O14
;O15
REG_MICMD
;O16
REG_MIREGADR
;O17
REG_MIWRL
REG_MIWRH
REG_MIRDL
REG_MIRDH
;O18
;EIE..
;EIR..
;ESTAT..
;ECON2..
;ECON1..
REG_MAADR5
REG_MAADR6
REG_MAADR3
REG_MAADR4
REG_MAADR1
REG_MAADR2
REG_EBSTSD
REG_EBSTCON
REG_EBSTCSL
REG_EBSTCSH
REG_MISTAT
;O19
;O20
;O21
;O22
;O23
;O24
;O25
REG_EREVID
;O26
;O27
REG_ECOCON
;O28
REG_EFLOCON
REG_EPAUSL
REG_EPAUSH
;O29
;EIE...
;EIR...
;ESTAT...
;ECON2...
;ECON1...
PHCON1_L
PHCON1_H
PHSTAT1_L
PHSTAT1_H
PHID1_L
PHID1_H
PHID2_L
PHID2_H
PHCON2_L
PHCON2_H
PHSTAT2_L
PHSTAT2_H
PHIE_L
PHIE_H
PHIR_L
PHIR_H
PHLCON_L
PHLCON_H
ENDC
;************************REGISTROS A INCLUIR EN EL PROGRAMA PRINCIPAL************************
; TEMP_BANK
; WCR_DIR
; FLAGS
; BANCO_ENCJ60
; PUNTERO_BANCO
;********************************************************************************************
;definicion de registros a poner en programa principal
;#define ETH bcf FLAGS,0 ;gestion de registros ETH
;#define MAC_MII bsf FLAGS,0 ;gestion de registros MAC y MII
PUSH_BANCO MACRO
movlw ECON1 ;registro a leer
call rcr ;lee registro de control
movwf TEMP_BANK ;guarda en TEMP_BANK el valor actual del banco seleccionado
ENDM
POP_BANCO MACRO ;restaura registro del banco del enc28j60
movf TEMP_BANK,W
call BANKenc28j60
ENDM
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< TRASPASO DE REGISTROS DE CONTROL DEL 28J60 AL PIC>>>>>>>>>>>>>>>>>>>>>>>
REG_28J60 ETH ;selecciona lectura de registros ETH
PUSH_BANCO ;guarda valor actual de banco
lfsr 0,0100h ;direcion de la ram donde se empezara a guardar los valores de los registros del enc28j60
clrf TEMP_FSR ;borra temporal FSR
clrf PUNTERO_BANCO ;borra registro que apunta a la seleccion de bancos del enc28j60
movf PUNTERO_BANCO,W ;valor del primer banco a leer=BANCO 0
call BANKenc28j60 ;subprograma de seleccion de banco
repi call DESCART_BANK
movf TEMP_FSR,W ;carga en w el valor del registro a leer del enc28j60.
call rcr ;comando de lectura de registro de control del enc28j60
movwf INDF0 ;mete valor del registro de control leido del enc28j60,en la posicion de memoria ram apuntada por TEMP_FSR
incf FSR0L,F ;incrementa puntero bajo de FSR.
incf TEMP_FSR ;incrementa temporal del registro FSR
;Aqui se busca el primer registro MAC para preparar su lectura y posteriores MII
movlw 0x0c ;direccion de registro MII
xorwf TEMP_FSR,W ;comprueva si ha llegado
btfsc STATUS,Z ;si ha llegado-
call reg_mac_mii ;salta a subprograma de modo de lectura en registros MAC/MII
;Aqui se asegura que los registros EIE,EIR,ESTAT,ECON2 y ECON1. solo se lean en el banco 0.esto es para ahorrar recursos
;ya que estos registros estan mapeados en los cuatro bancos del enc28j60
movlw 0x00 ;valor banco 0
xorwf PUNTERO_BANCO,W ;comprueva si esta en ese banco
btfss STATUS,Z ;si esta en un banco distinto del banco 0,leer solo hasta la direccion 1Bh
movlw 0x1A
btfsc STATUS,Z ;si esta en el banco 0,lee hasta la direccion 1Fh
movlw 0x20
xorwf TEMP_FSR,W ;comprueva si TEMP_FSR a llegado al valor anterior
btfss STATUS,Z ;si a llegado,salta.
goto repi ;en caso contrario ir a repi
clrf TEMP_FSR ;borra el registro TEMP_FSR(para empezar la lectura del primer registro del siguente banco del enc28j60)
incf PUNTERO_BANCO,F ;incrementa el valor del siguiente banco a leer del enc28j60
movlw 0x04 ;valor tope de bancos a leer
xorwf PUNTERO_BANCO,W ;compara el valor anterior con el banco seleccionado del enc28j60
btfsc STATUS,Z ;y si es mayor de 3,
goto phy_reg ;salta a subprograma de lectura de registros PHY
movf PUNTERO_BANCO,W ;en caso contrario carga el valor del banco a seleccionar en w
call BANKenc28j60 ;y salta al subprograma de conmutacion de bancos del enc28j60
goto repi ;salta a repi
reg_mac_mii movlw 0x02
xorwf PUNTERO_BANCO,W ;compara el valor anterior con el banco seleccionado del enc28j60
btfsc STATUS,Z ;y si es igual a 2,
MAC_MII ;activa modo de lectura de registros MAC/MII (estos registros tienen diferente forma de lectura respecto a los ETH
return ;en caso contrario.retorna
;aqui se selecciona el puntero de los registros del enc28j60 dentro de la tabla.segun el el banco actual.
DESCART_BANK movlw 0x00 ;valor para banco 0
xorwf PUNTERO_BANCO,w ;comprueva el banco actual seleccionado
btfss STATUS,Z ;y si no es el seleccionado anteriormente-
goto R1 ;-comprueva el siguiente banco
movlw 0x00 ;en caso de que sea afirmativo-
goto DESCARTE ;salta a programa de descarte de registros.
R1 movlw 0x01
xorwf PUNTERO_BANCO,w
btfss STATUS,Z
goto R2
movlw 0x04 ;saltos dentro de la tabla
goto DESCARTE
R2 movlw 0x02
xorwf PUNTERO_BANCO,w
btfss STATUS,Z
goto R3
movlw 0x0A ;saltos dentro de la tabla
goto DESCARTE
R3 movlw 0x03
xorwf PUNTERO_BANCO,w
btfss STATUS,Z
return
movlw 0x16 ;saltos dentro de la tabla
goto DESCARTE
return
;Aqui se busca los registros nulos del enc28j60 para descartarlos.la tabla se hubicara en la direccion 1050h
DESCARTE clrf TBLPTRL ;borra byte bajo de puntero de tabla
clrf TBLPTRU ;borra byte ultra de puntero de tabla.
addlw 0x50 ;suma el valor especificado al contenido en W.donde el valor de W contiene el valor del primer registro nulo
movwf TBLPTRL ;mete el valor en el byte bajo del registro puntero de tabla.
movlw 0x10 ;valor del byte alto del registro puntero de tabla
movwf TBLPTRH
DESC2 tblrd*+ ;incrementa puntero de tabla despues de su lectura
movlw 0xff ;valor de fin de tabla
xorwf TABLAT,W ;compara el valor leido de la tabla con valor fin de tabla
btfsc STATUS,Z ;si es igual-
return ;-retorna
movf TABLAT,W ;carga en w el valor leido en tabla
xorwf TEMP_FSR,w ;comparalo con la direccion del registro a leer
btfss STATUS,Z ;si es diferente-
goto DESC2 ;busca siguiente valor en tabla
incf TEMP_FSR,f ;si es igual.incrementa valor a leer en tabla-
GOTO DESC2 ;-y compara siguiente valor en tabla.
movf TEMP_TABLA,w ;temporal de numero de bytes a leer
xorwf TBLPTRL,w ;compara valor con puntero de tabla
btfsc STATUS,Z ;compara los valores anteriores
return ;si son iguales,retorna
;aqui se leen los registros PHY
phy_reg movlw 0xff ;reinicio del registro TEMP_FSR
movwf TEMP_FSR
rep_phy incf TEMP_FSR,F ;direccion del registro PHY a leer
movlw 0x15 ;valor final de registros a leer
xorwf TEMP_FSR,W ;comprueva si a llegado.
btfsc STATUS,Z
goto fin_emul ;si a llegado,finaliza el programa
movf TEMP_FSR,W ;carga valor de registro PHY a leer
CALL leePHY ;lee registro PHY
movff DATO_L,INDF0 ;dato bajo del registro PHY leido
incf FSR0L,F ;siguiente registro a leer
movff DATO_H,INDF0 ;dato alto del registro PHY leido
incf FSR0L,F ;siguiente registro a leer
movlw 0x03 ;ultimo valor de los 4 primeros registros PHY
xorwf TEMP_FSR,W ;comprueva si a llegado
btfss STATUS,Z
goto rep_phy
movlw 0x0c
addwf TEMP_FSR ;si a llegado,salta al siguente registro a leer(PHCON2)en este caso
goto rep_phy
fin_emul POP_BANCO ;restaura banco
return ;retorna
org 0x1050
descart DATA 0x1918,0xff1A,0x1312,0x1716,0xff1A,0x0501,0x0D0C,0x0F0E,0x1110,0x1513,0xff1A,0x0C0B,0x0E0D,0x100F,0x1311,0x1614,0xff1A
-
y tambien pongo los subprogramas para la lectura y escritura en los registros PHY.
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< SELECCION DE BANCOS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
BANKenc28j60
movwf BANCO ;carga en w el valor del banco a conmutar
movlw ECON1 ;carga el valor anterior en el registro de control ECON1
addlw WCR ;suma a w valor de comando de escritura en registro de control
bcf CS2 ;habilita chip enc28j60
call transcept ;envia registro selector de bancos
movf BANCO,w
call transcept ;envia banco a seleccionar
bsf CS2 ;deshabilita chip enc28j60
return 0 ;retorna
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< LECTURA DE REGISTROS PHY >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><
leePHY movwf DATO ;mete en DATO el contenido de W (registro PHY a leer)
BANCO_2 ;selecciona banco donde se hubican los registros MIREGADDR,MIRDL Y MIRDH
movlw MIREGADR ;mete en W el valor del registro MIREGADR (14h)
call wcr ;escritura en registro de control
movlw MIIRD ;carga en W el bit MIIRD del registro MICMD
movwf DATO ;metelo en el registro DATO
movlw MICMD ;carga en W el valor del registro MICMD(12h)
call bfs ;pon a 1 el bit MIIRD del registro de control MICMD
call DEMORA ;demora de 10,24uS
call comprueva ;comprueva si ha terminado la escritura
BANCO_2 ;selecciona banco 2
movlw MIIRD ;carga en W el valor del registro MIIRD
movwf DATO ;metelo en el registro DATO
movlw MICMD ;mete en W el valor del registro MICMD (12h)
call bfc ;pon a 0 el bit MIIRD del registro de control MICMD
movlw MIRDL ;mete en W el valor del registro MIRDL (18h)
call rcr ;lectura de registro de control
movff rxdata,DATO_L ;pasa dato leido al registro DATO_L
movlw MIRDH ;mete en W el valor del registro MIRDH (19h)
call rcr ;lectura de registro de control
movff rxdata,DATO_H ;pasa dato leido al registro DATO_L
ETH ;pasa a modo lectura de registros ETH
return 0 ;retorna
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ESCRITURA DE REGISTROS PHY >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><
escribePHY movwf DATO ;mete en DATO el contenido de W
BANCO_2 ;conmuta banco 2
movlw MIREGADR ;mete en W el valor del registro MIREGADR (14h)
call wcr ;escritura en registro de control
movf DATO_L,w ;mueve el contenido del registro DATO_L en W
movwf DATO ;mete en DATO el contenido de W
movlw MIWRL ;mete en W el valor del registro MIWRL (16h)
call wcr ;escribe en el registro de control MIWRL el contenido del registro DATO_L
movf DATO_H,w ;mueve el contenido del registro DATO_H en W
movwf DATO ;mete en DATO el contenido de W
movlw MIWRH ;mete en W el valor del registro MIWRH (17h)
call wcr ;escribe en el registro de control MIWRH el contenido del registro DATO_H
call DEMORA ;demora de 10,24uS
call comprueva ;comprueva si ha terminado la escritura
return 0 ;retorna
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Comprovacion del bit BUSY del registro de control MISTAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
comprueva BANCO_3
MAC_MII
comp2 movlw MISTAT
call rcr
btfss rxdata,BUSY
return
goto comp2
-
voy a poner varios archivos sobre el programa que estoy desarroyando.el cual ire modificando algunas instrucciones para que haga diferentes funciones.
y de esta forma aprender determinados sistemas de funcionamiento.
en todo momento tenemos activado el SPI debugger para saber como se comunican el enc28j60 y el pic.y tambien activo el osciloscopio para entender
el funcionamiento de la comunicacion SPI.una vez entendido como funciona el sistema SPI.nos sera muy facil entender el SPI debugger.y veremos en el SPI debugger lo que hace el enc28j60 como le pasaba al programador en la pelicula matrix. :D
ya que los comandos son facilmente identificables por valores exagesimales.ademas de saber si esta leyendo o escribiendo.
en el programa principal ethernet.asm
he puesto en la zona PRINCIPAL diferentes llamadas a subprogramas.las cuales ire activando/desactivando segun la operacion que quiera realizar.
en este caso he realizado la llamada al subprograma juego_led.que realiza un juego de luces con los leds del enc28j60.y lo encierro en un bucle sin fin
para su funcionamiento.
tambien he desarroyado una libreria que al llamarla,se visualizan los estados de todos los registros del ENC28j60 excepto el buffer ethernet.
que realizare mas adelante.linea call REG28J60.
-
hola de nuevo.he cometido un error en uno de los subprogramas.me refiero al que conmuta los bancos de los registros de control.
resulta que envez de seleccionar solo los bits del registro ECON1 que conmutan los bancos.lo que hacia es meter un valor en susodicho registro.sin tener en cuenta la posible modificacion de los demas bits.
asi que he realizado otro programa que reemplaza al anterior.
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< SELECCION DE BANCOS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Antes de la llamada a este subprograma,introducir en W el banco a seleccionar.
;si el banco seleccionado es distinto al 0,siempre se conmutara el banco 0 antes de conmutar el banco elegido.
BANKenc28j60
movwf BANCO ;carga en BANCO el valor del banco a conmutar
movff DATO,TEMP_DATO ;guarda registro DATO
movlw 0x03 ;valor de reseteo de conmutacion de bancos
movwf DATO ;dato a enviar por SPI
movlw ECON1 ;hacia el registro de control ECON1
call bfc ;borrado de los bits BSEL0 y BSEL1 (seleccion del banco 0)
movlw 0x00 ;valor banco 0
xorwf BANCO,W ;comprueva si el banco seleccionado es 0
btfsc STATUS,Z ;si es 0
return ;retorna
movff BANCO,DATO ;carga en DATO el valor del banco a conmutar
movlw ECON1 ;registro donde se conmutan los bancos
call bfs ;activa bits seleccionados
movff TEMP_DATO,DATO ;restaura registro DATO
return
-
adjunto los ultimos progresos: recepcion de datos en enc28j60 y traspaso al pic.
-
adjunto los ultimos progresos: recepcion de datos en enc28j60 y traspaso al pic.
Te felicito mi hermano, tienes que ser muy arriesgado para trabajar con ensamblador, estando a la mano tantas librerias para el lenguaje C...
Yo ya ni me acuerdo de la programacion en assembler. :D
-
gracias.no digo que sea lo mas practico ni lo mas rapido.pero creo que es la unica manera de aprender como funciona por dentro este controlador de ethernet.
cuando he empezado con esto no sabia lo que hera una comunicacion SPI.y ahora veo los bytes en las tramas del osciloscopio.y los comandos en el SPI DEBUGGER.
esto lo he intentado con C y no me lo visualiza.solo en un programa que baje en C que no usaba el SPI interno del chip.un atraso pero por algo lo haria asi su autor.
y solo funcionaba el osciloscopio con señales que no correpondian.y el SPI nada de nada.
-
(http://img543.imageshack.us/img543/9149/tramabroadcast.jpg)
By groundman (http://profile.imageshack.us/user/groundman) at 2011-01-02
en este programa los datos capturados en el buffer ethernet del enc28j60 son enviados a la zona de memoria del pic
ubicada entre las direcciones 170h y 3ffh.con esta cantidad de momemoria tenemos mas que de sobra para analizar
packets recibidos.
quiero empezar por analizar un packet de los tantos que circulan por la red.
en este caso el enc28j60 a capturado un packet que por la informacion que se ve en la imagen es un broadcast.
este tipo de paquetes siempre siempre se reciben ya que se transmiten a todos los ordenadores de la intranet.
es facil distinguirlos porque en parte del paket se distinguen los 6 bytes FF.FF.FF.FF.FF.FF
voy a descomponer el paquete a partir de la direccion 170h que es el principio de los datos leidos del buffer
ethernet.y utilizando el wireshark confrontare los datos para saber su funcion.quizas este paket no sea de
los mas sencillos a analizar pero es el primer broadcast que he capturado.
los protocolos usados en este paquete son:eth,ip,udp,nbns
66.00.60.00.80.00 =no forman parte del paquete a gestionar.los dos primero bytes contienen la dirección donde
se guardará el próximo paquete.los otros no son muy importantes.
FF.FF.FF.FF.FF.FF =destino: direccion de broadcast
00:1e:ec:59:ea:40 =fuente: en este caso una de las targetas de red de otro PC.
08.00 =type (IP)
45.00 =version (IPV4)
00 =diferenciated service
00.4E =longitud total 78bytes contando desde la version hasta el final(no se inclulle las mac ni el type)
34.32 =identificacion (13362) numero de paquetes recividos de la misma fuente(ip 192.168.1.110)
00.00 =flags,fragment ofset
80 =tiempo de vida (128 saltos)
11 =protocolo (UDP)
81.af =chequeo de cabezera (correcto)
c0.a8.01.6e =fuente (192.168.1.110)
c0.a8.01.ff =destino (192.168.1.255)
datagrama de usuario
00.89 =puerto fuente 137 (netbios-ns)
00.89 =puerto destino 137 (netbios-ns)
00.3a =longitud 58bytes.numero de bytes desde datagrama de usuario hasta el final del paquete
85.09 =chequeo (validacion desactivada)
netbios name service
DB.41 =transaccion ID.
01.10 =flags. consulta de nombres
00.01 =preguntas
00.00 =respuesta rrs
00.00 =autoridad rrs
00.00 =adicional rrs
consultas
20.46.45.42.45.4D.45.4D.45.46.46.43.46.41.46.41.43.41.43.41.43.41.43.41.43.41.43.41.43.41.43.41.43.41
00.20 =tipo NB
00.01 =clase IN
por lo que estoy viendo.esta trama pertenece a un programa de acceso a escritorio remoto de internet.
que nisiquiera estoy usando.
aqui en el analisis de tramas es donde nos damos cuenta de la cantidad de porqueria que se nos cuela en nuestro
ordenador.
cosas que instalamos y nunca nos acordamos de desinstalar.otras que se instalan sin saberlo nosotros.
etc.etc
por eso empieza la ordenador a ponerse lento cuando utilizamos la red.pero bueno,no es el tema que nos aborda.
el protocolo eth: esta compuesto por las mac de destino,mac fuente y el tipo.
el protocolo IP:esta compuesto desde la version del protocolo(ipv4) hasta la IP de destino.
el protocolo udp:esta compuesto desde el puerto fuente hasta el checsum
y el resto es el protocolo nbns.netbios name service.
el protocolo eth que se puede decir que es la cabezera de la trama.siempre es enviada en un paquete.
el protocolo IP no le veo la mayor complicacion.aunque quizas hubiera que profundizar algo mas.
lo que si tendria que trabajame mas seria el UDP que tampoco lo veo tan dificil.pero el NBNS
no estoy enterado del todo para que sirve.me imagino que sera para obtener una ip automaticamente.pero no estoy seguro.
una curiosidad a tener en cuenta a la hora de analizar las tramas es que hay una forma de localizar el principio de cada packet.
hay que buscar una secuencia de bytes.
son estos: una secuencia de valores decimales del 1 al 4 y los 6 bytes de control que preceden a cada packet.
1
2
3
4
xx
xx
xx
xx
xx
xx
xx
comienzo de packet.
-
en este caso vamos a analizar una trama que se ha producido al intentar realizar una conexion desde el navegador de otro pc.
en el navegador del otro pc en la barra de conexion pondremos 192.168.1.111
estos son los resultados en el wireshark:
ff.ff.ff.ff.ff.ff =destino. broadcast(todos los PCs de la red)
00.10.60.26.36.02 =fuente. mac del pc donde realizamos la conexion.
08.06 =type: ARP
00.01 =hardware type: ethernet
08.00 =protocool type: IP
06 =hardware size
04 =protocol size
00.01 =opcode
00.10.60.26.36.02 =mac de origen
c0.a8.01.2b =IP de origen (192.168.1.43)
00.00.00.00.00.00 =mac objetivo
c0.a8.01.6f =IP objetivo (192.168.1.111)
00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00 relleno hasta los 60 bytes.
durante el intento de fallido de conectar con la ip 192.168.1.111.
se han capturado varios paquetes identicos a los que estoy exponiendo.por lo que veo parece que falta identificar la mac
del objetivo.
supongo que haria falta asignar la ip a la mac del enc28j60.creo que tiene algo que ver con la asignacion dhcp.
habra que experimentar.
-
no he tenido la gran oportunidad de trabajar con este integrado, sin embargo algún día lo utilizare, y no se porque pensé que el integrado se encargaba de las tramas y conexiones con la red, pero veo que no es solo eso...
aunque la trama esta muy fácil de comprender(gracias por tu explicación), ahora viene la pregunta, podrías tener guardado en una memoria una pagina web? y recibir la peticiones cuando dan click sobre un link y desarrollar una especie de servidor de ultrabajo consumo con un 18f?
-
no he tenido la gran oportunidad de trabajar con este integrado, sin embargo algún día lo utilizare, y no se porque pensé que el integrado se encargaba de las tramas y conexiones con la red, pero veo que no es solo eso...
aunque la trama esta muy fácil de comprender(gracias por tu explicación), ahora viene la pregunta, podrías tener guardado en una memoria una pagina web? y recibir la peticiones cuando dan click sobre un link y desarrollar una especie de servidor de ultrabajo consumo con un 18f?
Los Stack de Microchip permiten elegir configuración y entre esas está utilizar ENC28J60, memoria de programa, memoria EEprom, ect, eso si se necesita un MCU de buena capacidad :mrgreen:
Saludos!
-
yo en este caso utilizare una memoria externa.ya he comprado la 25lc1024.esto es para empezar.
mas adelante tendria que ver que es mas rentable.si usar un pic con mucha memoria o usar targetas de memoria para ubicar el servidor web.ya que no solo influye la cantidad de memoria a usar.tambien hay que mirar muy bien a la velocidad que se trasmiten los datos.
-
no he tenido la gran oportunidad de trabajar con este integrado, sin embargo algún día lo utilizare, y no se porque pensé que el integrado se encargaba de las tramas y conexiones con la red, pero veo que no es solo eso...
aunque la trama esta muy fácil de comprender(gracias por tu explicación), ahora viene la pregunta, podrías tener guardado en una memoria una pagina web? y recibir la peticiones cuando dan click sobre un link y desarrollar una especie de servidor de ultrabajo consumo con un 18f?
Los Stack de Microchip permiten elegir configuración y entre esas está utilizar ENC28J60, memoria de programa, memoria EEprom, ect, eso si se necesita un MCU de buena capacidad :mrgreen:
Saludos!
Claro que el stack de Microchip permite tales cosas, pero la pregunta de Fidodido hacia Groundman se enfoca en la programación en ASM.
Me parece que el trabajo de Groundman ha sido muy bueno hasta ahora. Espero que siga desenmarañando todo esto del ethernet en ASM y que no se doblegue como otros que, por ejemplo, han querido implementar USB sólo usando ASM.
Buen trabajo Groundman.
-
Claro que el stack de Microchip permite tales cosas, pero la pregunta de Fidodido hacia Groundman se enfoca en la programación en ASM.
Me parece que el trabajo de Groundman ha sido muy bueno hasta ahora. Espero que siga desenmarañando todo esto del ethernet en ASM y que no se doblegue como otros que, por ejemplo, han querido implementar USB sólo usando ASM.
Buen trabajo Groundman.
Aaaaaa.... Gracias por la intervención, no me había dado cuenta! :mrgreen:
Es cierto, muy buen trabajo Groundman 8)
-
muchas gracias.la verdad es que hasta que no consiga realizar una conversacion entre ordenadores en la intranet e incluso en intenet no voy a parar.
ya llevo bastante tiempo con el estudio del ethernet y seria un atraso ponerme a estudiar otra cosa.aunque no seria la primera vez que me pasa.
ahora que he logrado capturar datos de la red.estoy dandole vueltas a la cabeza de como gestionar estos datos.
al principio se me ocurrio pasar los datos al pic.y luego gestionarlos desde el mismo.pero me he dado cuenta de que seria un desperdicio de recursos.
asi que lo que voy ha hacer es gestionarlos desde el mismo enc28j60.mi intencion es identificar la cabezera de la trama.
para ello buscare las coincidencias de los bytes con valores 1,2,3,4. el unico problema es que la primera trama no tiene esa secuencia de caracteres
y se perderia.
voy a tener que ver bien como se reciven las tramas en el enc28j60.todabia no se que pasa cuando se llega al final del buffer de lectura.
tengo entendido que los datos se vuelben a escribir en el principio del buffer.aunque supongo que no empezara con la cabezera de otro paquete.
si no.que se comportara como un bucle cerrado.
una vez que guarde en la memoria del pic la cabezera.habra que identificar que tipo de trama es.y gestionar los datos segun sus caracteristicas.
aunque me estoy planteando usar el primer dato recibido en el paquete para localizar el principio del siguiente paquete.esto tiene la ventaja de ahorrar tiempo
al pic al no tener que buscar la secuencia 1234.
pero tambien tiene el problema de que si el dato estubiera corrupto,se desencadenaria un tren de fallos que acabaria en desastre.
asi que es posible que use una mezcla de ambos.de todas formas todo es probar que tal va uno y otro sistema.
-
mi pana me puedes pasar la simulacion del proteus.........????? :oops: :oops: :oops:
-
esta dentro del archivo de una resapuesta de mas arriba. etherner4.rar
aunque en ese codigo todabia no esta integrado el codigo que localiza las secuencias 1234 que preceden a las tramas para localizar las cabezeras en
el buffer ethernet.cosa que tengo casi terminada.
de todas formas con lo que contiene hay de sobras para empezar a estudiar el sistema.
-
amigo si es el archivo que dice ds1305.DSN, no abre y me dice algo sobre la version del proteus, el mio es 7.4 SP3
-
Hola felicitaciones groundman, voy a ver si puedo seguirte y así aprender sobre este interesante modulo. Tengo todos los componentes para hacer un sistema que se conecte via web pero lo tengo arrinconado juntando polvo por falta de tiempo y ganas!!!
Nuevamente mis felicitaciones
Saludos Matias
-
tendras que actualizar tu version a una superior.o crealo tu mismo.no es dificil.
te paso una imagen para que crees las conexiones.no hace falta que integres el osciloscopio, los displays,ni la memoria.
(http://img829.imageshack.us/img829/1377/proteus.jpg)
By groundman (http://profile.imageshack.us/user/groundman) at 2011-01-06
martes78.te animo a que te apuntes.al principio creia que esto de ethernet era imposible.pero a medida que avanzo cada vez me parece mas sencillo.
ya tengo una porcion de codigo casi terminada.la que gestiona el protocolo eth.pronto la subire.
-
amigo martes78, como sabes que algo no es posible si no lo as intentado.............cosas asi e intentado siempre, Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles.
Amigo Groundman ese componente esta en el Proteus??
-
estan todos los componentes.si te refieres al enc28j60 solo tienes que ponerlo en el buscador de componentes.en algunas versiones de proteus viene con mas o menos pins.
pero funciona igualmente.hay muchos componentes que no hace falta que los pongas por el momento.yo los puse porque no me funcionaba el circuito.y
no sabia porque.y ya que los puse para que quitarlos.
y hay pins que no se usan para la simulacion.
-
hay una cosa que no sabia y que he descubierto por casualidad.resulta que para capturar los paquetes.utilizo la targeta de red del portatil.
pero en el curro no puedo hacer pruevas porque alli uso la wi-fi.
asi que experimentando me he dado cuenta de que si hacemos clic en el enc28j60 del proteus.
nos sale una opcion Network card no:
donde podemos seleccionar la targeta de red por donde nos entrara el trafico de datos.en mi caso la nº1 es la LAN y la nº2 es la wi-fi.
tened en cuenta esto si no recivis datos.puede que no tengas bien puesto esto. ;-)
-
hay una cosa que no sabia y que he descubierto por casualidad.resulta que para capturar los paquetes.utilizo la targeta de red del portatil.
pero en el curro no puedo hacer pruevas porque alli uso la wi-fi.
asi que experimentando me he dado cuenta de que si hacemos clic en el enc28j60 del proteus.
nos sale una opcion Network card no:
donde podemos seleccionar la targeta de red por donde nos entrara el trafico de datos.en mi caso la nº1 es la LAN y la nº2 es la wi-fi.
tened en cuenta esto si no recivis datos.puede que no tengas bien puesto esto. ;-)
Hola groundman, que tipo de datos estas mandando? Y mediante queprotocolo? Udp, tcp?
-
de momento solo estoy en la gestion de los datos recividos.lo que estoy haciendo es diferenciar el TYPE del paquete y segun que valor contenga,salto a otro subprograma para gestionar ese paquete.
los valores de TYPE que recibo son 0x0800 (IP) , 0x0806 (ARP) y 0x0000 que no estoy seguro porque sale.ya lo estudiare.
por ahora los paquetes que recibo son broadcast.ya que son paquetes que se envian a todos los PCs de la red.y aunque tengo activados los filtros,
para recivir paquetes destinados a la mac que he programado en el enc28j60.no he realizado ningun programa para conversar por la red.
quiero realizar una conexion udp.porque es directo y no se piden permisos entre PCs.pero todabia no entiendo muy bien los de las asignaciones de IP
entre PCs de una misma red.asi que tengo que estudiarlo.
-
bueno he estado estudiando lo de los filtros de recepcion.y me he dado cuenta de que es algo muy importante.y que han de ser modificados continuamente
segun las necesisades de la aplicacion que queramos realizar con el pic.
aqui pongo una explicacion de su funcionamiento:
ERXFCON
el registro ERXFCON configura el filtrado de los paquetes recibidos.
hay 6 tipos de filtros:
• Unicast
• Pattern Match
• Magic Packet™
• Hash Table
• Multicast
• Broadcast
bit 7: UCEN.filtra los paquetes de tipo UNICAST (un destinatario)
1 = Los paquetes que no tengan una dirección de destino coincida con el local de la dirección MAC se descarta
0 = filtro desactivado
bit 6: AND/OR.es un bit que determina la forma de decidir como actuaran los bits del registro ERXFCON.este bit realiza un AND/OR con los bits
PMEN,MPEN,HTEN,MCEN,BCEN de esta forma tenemos las combinaciones para decidir si se aceptaran los paquetes
1 = AND: Los paquetes serán rechazados a menos que todos los filtros permitieron aceptar el paquete
0 = OR: Los paquetes serán aceptados a menos que todos los filtros permitieron rechazar el paquete
bit 5: CRCEN.
1= todos lo paquetes con un CRC invalido sera descartados
0= el filtardo por CRC invalido es ignorado
bit 4: PMEN. filtra los paquetes segun mentengan un patron con el estandar especificado de paquetes.
1= filtrar los paquetes que no mantengan el patron
0= filtro desactivado
bit 3: MPEN. activacion del filtro Pattern Match
1= los paquetes deben mantener el criterio de paquete Patern Match para la MAC programada.o seran descartados
0= filtro desactivado
bit 2: HTEN. filtro de tabla hash.
1= los paquetes que no mantengan el criterio de paquete de tabla hash seran descartados.
0= filtro desactivado
bit 1: MCEN.filtro de paquetes multicast (multidifusion)
1= Los paquetes deben tener el bit menos significativo puesto en la dirección de destino o se descartará
0= filtro desactivado
bit 0: BCEN.filtro de paquetes broadcast (varios destinatarios)
1= Los paquetes deben tener una dirección de destino de FF-FF-FF-FF-FF-FF o serán descartados
0= filtro desactivado
adjunto los ultimos avances.
en este programa he habilitado las interrupciones por desbordamiento del buffer ethernet de recepcion.asi que en el proteus hay que unir el pin INT
del enc28j60 con el pin RB2/INT2 del pic18f4550.pero entremedias hay que intercalar una puerta NOT (inversora)
queria haber configurado la interrupcion por recepcion de un paquete.pero la recepcion de los paquetes es muy rapida y la gestion entre paquete y paquete por
el pic.no creo que sea tan rapida.almenos en el simulador.
por eso hasta que no realize las pruevas fisicamente,gestionare los paquetes almacenados en el buffer ethernet.
-
pues ya que he podido recibir datos.aunque todabia no tengo implementado todos los protocolos.he decidido provar a enviar datos.
ya que si no practico con las dos cosas,no puedo seguir avanzando.
debido a un error que cometi.no ponia el bit TXRTS a 1 para empezar a enviar paquetes.pero ahora que he logrado arreglar esto,me sale un mensage de error
del proteus.
[NIC PACKET]>Sending packet when the link is not established: dst=FF:FF:FF:FF:FF:FF, src=00:04:A3:00:00:00
lo que entiendo del mensage es que se ha enviado el paquete cuando el enlace no ha sido establecido.
pero no se a que se refiere.
es que hay que esperar algun evento para poder transmitir? hay que activar algo? no se que sera.habra que hecharle mas tiempo.
-
por fin he conseguido hacerlo funcionar. :-/ :-/ :-/ :-/ :-/
el fallo esta en lo que dice el mensage.que se ha intentado enviar un packet sin que se hubiera establecido el enlace.
asi que he intentado realizar la transmision cuando el ledA estubiera encendido.me acorde que esta condicion se produjo en el programa que realize para la
recepcion de packets.
asi que ya pude enviar un packet.por el momento no se como se hace para establecer el enlace.pero ya es facil aberiguarlo.
eso creo. :D
-
sigo estudiando el sistema.y realmente no es necesario que el led link este encendido para realizar una transmision.todabia no se exactamente
el porque de la no transmision.pero si he comprobado que si no se espera a recivir un packet.se produce el error.y no se transmite el packet.
tampoco se si la espera de este evento tiene algo que ver.pero por el momento es la unica forma que tengo de poder enviar paquetes.
en el programa qu estoy realizando la llamada (call EPK) es un programa que espera a recibir almenos un paquete.haciendo esto ya puedo enviar
paquetes.
en las lineas de abajo estan unos paquetes que he capturado del wireshark.en el se puede distinguir el paquete que he enviado desde el enc28j60
es la linea 7.he decidido enviar un packet broadcast(para todos los PCs de la red) el este estoy preguntando por la IP 192.168.1.43
y automaticamente se recive un paquete probeniente del PC con IP 192.168.1.43 con la mac de este.(packet 8)
1 0.000000 ZygateCo_xx:xx:xx Broadcast ARP Who has 192.168.1.139? Tell 192.168.1.1
2 5.643673 192.168.1.1 192.168.1.255 RIPv2 Response
3 9.156091 ZygateCo_xx:xx:xx Broadcast ARP Who has 192.168.1.139? Tell 192.168.1.1
4 9.643686 192.168.1.1 224.0.0.1 IGMP V2 Membership Query, general
5 10.120142 192.168.1.110 239.255.255.250 IGMP V2 Membership Report / Join group 239.255.255.250
6 10.120174 192.168.1.110 224.0.0.252 IGMP V2 Membership Report / Join group 224.0.0.252
7 20.161841 Microchi_00:00:00 Broadcast ARP Who has 192.168.1.43? Tell 192.168.1.110
8 20.161968 Billiont_xx:xx:xx Microchi_00:00:00 ARP 192.168.1.43 is at 00:10:60:xx:xx:xx
supongo que este tipo de trama se utiliza para crear la tabla hash.que es una tabla que guarda cada PC con todas las IPs asignadas.
la signacion de las IPs se realiza por DHCP pero no se si el encargado de esto es el router.o cada PC.
en los paquetes que envie atras,asigne la IP 192.168.1.110 como prueva.
pero que pasaria si esa IP ya estubiera ocupada por otro PC?
pues recibiria un paquete de error como las lineas de abajo.aunque es un mensage del wireshark.de momento tendre que estudiar la forma de leer las tablas
hash o estudiar el funcionamiento del DHCP.
100 29.264303 Microchi_00:00:00 Broadcast ARP Who has 192.168.1.43? Tell 192.168.1.110 (duplicate use of 192.168.1.110 detected!)
101 29.264432 Billiont_xx:xx:xx Microchi_00:00:00 ARP 192.168.1.43 is at 00:10:60:xx:xx:xx (duplicate use of 192.168.1.110 detected!)
tambien incluyo el .rar para quien quiera estudiarlo
-
desde my ultima respuesta han pasado un par de semanas.pero a mi se me antoja un par de meses.estoy estudiando el protocolo UDP.
y aunque lo entiendo perfectamente.no logro enviar una trama a mi gusto.
es decir.puedo enviar una trama sin ningun error.pero el mensage lo tengo limitado a 520 bytes.almenos es la maxima cantidad que puedo enviar de bytes.
a traves de la red.
he visto en el wireshark que por la red circulan tramas con el protocolo UDP.y con muchos bytes.mas de los que puedo enviar con el enc28j60
creo que tiene que haber una opcion en algun registro del enc28j60 que me esta limitando el envio de bytes atraves de la red.
haber si encuentro el fallo.porque me esta volviendo loco.
y cuando lo tenga ya posteare el resultado.
-
bueno.he descubierto que aunque programe ETXND con un valor superior de 520 Bytes.cuando doy la orden de transmitir.
el valor sigue siendo de 520 Bytes.no se porque se esta limitando la transmision de mas bytes.
yo pensaba que programar ETXND era para indicar el final del packet.pero por lo que veo parece que el enc28j60 controla el valor de este registro.
estoy casi seguro que esta limitacion es algun tipo de error durante la transmision.el cual no me deja transmitir mas de 520 Bytes.
ya que no veo en el datasheet la opcion de limitar la transmision de bytes.
-
Hola groundman que casualidad haberte encontrado, fijate que estoy investigando la comunicacion para un pic por ethernet y me gustaria que me dieras una orientacion
me conviene mas utilizar un pic con el modulo integrado o utilizar el chip enc28j60?
saludos
pd. ahora se para que querias el programa en visual basic, deja revisar mas este tema y ver que se me ocurre para lo del programa
-
:D aveces estamos muy escondidos.
yo estoy estudiando el enc28j60 porque es una forma muy directa de estudiar su funcionamiento.y porque compre el modulo en ebay. :mrgreen:
tambien porque queria usar los 18f2550 que tengo guardados.nunca habia estudiado la serie 18Fxxxx y con el enc28j60 vi una manera de empezar.
ademas los pic con ethernet creo que estan en la serie 24F y no creo que fuera buena idea pegar un salto tan grande.
ya he profundizado bastante en el enc28j60.y cada vez aprendo mas de el.la verdad que es un poco complicado hasta que se va asimilando el funcionamiento de
la red.
yo te recomendaria que empezaras por abajo.y estudiaras este controlador por separado del microcontrolador.ya que pudiera pasar que tubieras algun error
y no supieras si el fallo es del pic o del controlador ethernet integrado.
pero tienes un gran problema si quieres aprender de lo que etoy estudiando.ya que muchas de las cosas que estoy realizando lo estoy aprendiendo de
realizar practicas.y hay poca informacion al respecto.la mayoria de los datos que estan en la red esta hecho en C
yo lo estoy haciendo en asm.asi que si no estas familiarizado con este lenguaje.te recomiendo que busques otros medios.
si por el contrario.quieres aprender desde cero el uso de este controlador de ethernet.te ayudare en todo lo que pueda.
-
De echo acabo de pedir unos samples a microchip, pedi 2 enc28j60 y 2 pic18f66j60, y de echo estuve 2 años utilizando el ensamblador hasta hace apenas 1 año estoy manejando el c por lo que no creo que se me dificulte en lo de la programacion ,mas bien se me dificultaria en los conceptos, es decir en entender que es la mac, la ip, etc, etc, y es en lo que veo que eres un experto, por lo cual aceptare tu ayuda.
tengo varias ideas para implementarlo una vez que lo logre.
saludos y estamos en contacto
-
yo nunca he pedido ningun componente.creo que habia que enviar un proyecto y rellenar un formulario.mucho trapicheo.
ademas por unos 10€ mas o menos en ebay los hay ya montados con el conector,bobinas y demas.
al final aunque te regalen el chip,te va a costar mas caro. y sin contar los fallos que podemos tener al realizar la placa.
la verdad no veo rentable hacer el circuito.por lo menos para un solo circuito.
aunque tengo el circuito de ebay.todabia no lo he usado.veo mas practico usar el proteus.se ven fallos que no se verian en la parte fisica.
respecto a los protocolos.es lo que estoy estudiando ahora.
al principio me parecia algo muy dificil.pero solo hay que seguir unas normas.ademas conque estudies el UDP,TCP/IP. ya tienes para enviar/recivir datos.
luego puedes estudiar HTML,MAIL etc.
te recomiendo que cuando termines con la parte fisica del enc28j60.captures tramas de tu red con el wireshark y asimiles la informacion que transporta.
es muy util entender lo que hacen los PCs entre si.y por las mac sabes que aparato habla con quien.
-
ok gracias entonces voy a ponerme a estudiar los protocolos y la placa la voy a hacer, pues ya tengo todos lo componentes solo me faltaba el chip, por eso decidi pedirlo, en mi caso no es problema por ya he pedido varias veces micros y solo debo pedir lo que necesito, por lo pronto en lo que llega voy haciendo el y pcb y mulando en proteus, yo tambien prefiero hacer lo que mas se pueda en el simulador, y finlmente lo pruebo en real.
saludosy gracias por tu ayuda
-
:-/ :-/ :-/ :-/ :-/ por fin he consegudo solucionar el problema que tenia con lo de no poder enviar trans de mas de 520 bytes.se donde esta el fallo
pero no entiendo el porque de este.
como ya sabemos.el buffer ethernet tiene 8192 bytes.y podemos dividirlo en dos partes.una para recepcion y otra para transmision.
para configurar esto hay que introducir el valor de las direcciones en unos registros.
en mi caso configure el buffer de recepcion entre las direcciones 0 y 6499d
y el buffer de transmision entre 6500d y 8191d.
se supone que esto se puede hacer. ¡pues parece que no se puede hacer!.almenos por la experiencia que estoy teniendo en el simulador.
el registro ETXND. es un registro que tenemos que programar con la direccion del ultimo byte del packet que se va a transmitir.
pues aunque programe este registro con cualquier valor que queramos.parece ser que al realizar la transmision,el valor siempre cambia a 1B6Ch.
no se porque pasa esto.pero esta relacionado con el fallo que me ha estado sucediendo.
despues de muchas pruevas de configuracion de los registros de inicializacion del enc28j60.empeze a provar con el cambio de las zonas de
los buffer de recepcion y de transmision.
y he llegado a comprovar que hay una direccion donde apartir de la cual el enc28j60 no transmite la trama.por eso he dispuesto la zona de transmision
un byte antes del fallo.
esta es la configuracion de los registros:
ERXST=0000h ETXST=1582h
ERXND=1581h ETXNDL= no definido.ya que este valor depende del ultimo byte del packet a enviar.en mi caso es el valor 1990h
ya que el packet que estoy enviando es de 1037 bytes.la direccion 1582h contendra el byte de control 00h.+1037=1990h
antes dige que aunque programara ETXST con el valor 1990h.esto no me servia de mucho.ya que al darle a transmitir esta valor cambiaba automaticamente
al valor 1B6Ch.
pues haciendo unas sumas.no si sera coincidencia.pero todo va encajando.
en la inicializacion del enc28j60.se configuro este para enviar tramas ethernet de un maximo de 1500 bytes.que es la cantidad maxima de bytes
que permite el protocomo IP.
asi que 1B6Ch-1582h=1514d -7 Bytes del vector de estado.y algun Byte que que se me scapa a la compresion.se acerca bastante a los bytes maximos
de un packet.
aunque creo que los 1500 bytes eran el tamaño maximo de DATA.
por el momento ya puedo transmitir y recivir datos comodamente.aunque estoy seguro de algo mas se tiene que complicar.
me queda mucho por estudiar todo el funcionamiento de este controlador ethernet.pero de momento iremos pasito a pasito.
adjunto los ultimos avances.de momento desordenado.funcionando solo la transmision.
esta preparado para enviar una trama de 1037 bytes.atrabes de la red.con protocolo udp y IP terminada en 111.para que podais identificarla.
aunque es posible que en el wireshark la identifiqueis como error.por no coincidir algun puerto.
-
aqui estoy de nuevo.llevo casi un mes sin publicar respuestas respecto a este tema.resulta que he tenido que poner al dia mis conocimientos de VBASIC.
que no son muchos.
estoy practicando con unos programas que disponen de un chat entre dos ordenadores en la misma red con protocolo UDP.
los programas funcionan a la perfeccion.asi que he capturado las tramas de uno de ellos y los he reproducido con el simulador del enc28j60.
pero no funciona.
resulta que los datos que envio con el programa de vbasic son de 51bytes.
y con el simulador enc28j60 envia 1514bytes.aunque realmente despues del campo de datos,todos son ceros.
he configurado el registro ETXND para definir el final de la trama a enviar.incluso he limitado los bytes a enviar en el registro MAMXFL.
pero me sigue enviando la trama demasiado larga.
empiezo a pensar que el proteus tiene algun tipo de error.me parece que voy a tener que empezar con la parte fisica.
-
hola amigo Groundman veo que has adelantado mucho que cuentas como va todo he estado muy ocupado por eso no he entrado a ver que hay dee nuevo en el foro
-
hola akira_ve.por el momento he tenido que parar el proyecto.ha entrado el verano y uno viene reventado del trabajo.tengo el coco que no le entra mas datos. :D
haber si me arranco de nuevo y pruevo los nuevos modulos que asquiri.ya que el que compre primero empezo a calentarse en exceso y no funcionaba.
supongo que fue porque no le puse resistencias en unos pin determinados.y me lo habre cargado.
espero poner pronto mis avances. saludos.
-
que bien amigo quiero ponerme en eso contigo ahora me puedes enviar lo que has hecho pa ayudarte???
-
voy a ponerlo en orden.y montarle las resistencias al circuito.
-
he probado el modulo que compre en ebay del enc28j60.y cual a sido mi sorpresa de que el regulador que he usado para alimentarlo (BA033T) sigue calentandose.asi que he alimentado solo los pin GND y VCC.y se sigue calentando tambien.
ya mosqueado he comprobado el consumo del modulo.y es de solo 160mA.asi que como esta dentro de los margenes,he cmbiado el regulador por otro del mismo tipo.
pero igualmente este se sigue calentando.este regulador es de 1A.asi que no entiendo este exceso de temperatura.he mirado el datasheet.y he visto que puede llegar hasta alcanzar los 150º. creo que la temperatura a la que esta trabajando debe de ser la normal.
asi que he perdido el tiempo esperando a que me llegase un modulo nuevo.
bueno.de todas formas como tendre que hacer mas circuitos,pues no me biene mal. :x que rabia que podia tener listo esto de la ethernet.
-
Hola amigo Groundman, yo creo que tu esta alimentando el BA033T con 5 Voltio o con menos de 25 Voltio que es el maximo que soporta?, si como tu dice el consumo del ENC28J60 es de 150mA, no deberia ni de calentarse el regulador, asi que revisa eso. pondia poner en la entrada un Diodo para reducir la corriente de entrada.
Saludos :P
-
hola stk500.ya pense en eso.por ese motivo he provado a poner el regulador en los 5V.
ya casi no se calienta pero ahora se calienta el regulador de 5V.la alimentacion de la fuente es de 12V. supongo que tendre que poner varios diodos.
es posible que al tener que regular 3.3V el voltage de entrada afecte mas directamente al regulador de 3.3v con respecto al de 5V.
voy a probar.gracias por la ayuda.
-
bueno.ya estoy con las practicas en parte fisica.y ya han empezado los problemas. :lol:
hay algunos detalles que me gustaria comentar.por ejemplo el detalle de las luces del modulo enc28j60.yo no sabia que con solo alimentarlo y con conectar el cable LAN,las luces de link y statatus.creo que se les llama asi.empezarian a parpadear.
he montado la placa de practicas y ya he empezado con las equivocaciones.resulta que en el simulador podia leer los registros internos del enc28j60.
pero como es una simulacion por software,no sabia realmente lo que puede estar pasando dentro del enc28j60.
asi que intente leer los registros con una simulacion por hardware con el ICD2 y no me leia nada.el problema estaba en que el pin SO del enc28j60 debe de estar conectado al pin SI.y el SO al SI. asi: SO->SI y SI->SO.
es un fallo muy comun.asi que tenrlo en cuenta.
ahora ya puedo leer los registros internos del enc28j60.asi que se me ha ocurrido la idea de poner enmarcha los leds del enc28j60.con el cable quitado.porsupuesto.
per no me ha funcionado.aunque en el simulador por software si que funciona.no se si es que esto no se puede hacer.de todas formas no es lo que me interesa
en este momento.
haber si logro poner esto enmarcha lo mas pronto posible. :)
-
hola groundman, que paso con la investigacion?, has logrado concretarla?, la dejaste de lado?
-
Pues la tengo aparcada.ya que estoy con el android.pero te diré que logre comunicarme con el enc.y recibir datos de una trama ethernet.
Aunque no llege a enviarlos.me faltó tiempo.
La verdad es que quiero terminarlo.me gustaría controlar dispositivos por Internet.lo haría por el protocolo modbus.que lo tengo bastante estudiado.
Pero todo a la vez no se puede hacer.
-
ok, bueno estoy investigando mucho sobre el tema del manejo del enc28j60 porque quiero implementar la lectura de sistemas que se comunican por ethernet usando el protocolo Art-Net, parece ser sencillo pero aun me falta aprender bastante, si logro hacer esa lectura programando en assember seria genial, te felicito por lo que has explicado acá, he comprendido muchas cosas que parecían algo muy difícil de comprender. ((:-)) ((:-)) ((:-)) ((:-))
-
me alegro que te haya venido bien.yo tambien empeze con la ayuda de documentos de otros usuarios.pero no continuaron su trabajo.y tube que seguir por mi cuenta.
yo tambien he tenido que dejarlo.pero almenos he logrado ver datos en el buffer de recepcion.haber si termino ya en lo que estoy...
-
dos preguntica groundman, aver si depronto te acuerdas:
en tu programa estas configurando el SPI en modod 1.1, pero veo en el datasheet del ec28j60 dice que el modo es 0.0?
la otra es que tienes una rutina que comprueba el bit ESTAT.CLKRDY, segun lo entiendo en tu codigo la intruccion btfsc te saca de la rutina si el bit esta en cero, verdad? lo que no entiendo es que en el datasheet dice que este bit se pone a uno cuando esta listo para seguir escribiendo los demas registros, entones no deberia ser un btfss para que cuando el bit CLKRDY este en uno, te saqye de la rutina y no te obligue a esperar mas?
MP_CLKRDY ETH
movlw CLKRDY_bit
movwf DATO
movlw ESTAT
call rcr
btfsc rxdata,CLKRDY_bit
goto CMP_CLKRDY
return
no te imaginas cuanto valoro tu ayuda! ;-)
-
ufffff.hace mucho tiempo de eso.y no se porque lo pondria asi.te dire que tube problemas con la simulacion en proteus.y tube que realizar algunos cambios para que funcionase.
uno de ellos fue evitar poner resistencias analogicas en el simulador.asi que puse PULL_UP o PULL_DOWN.pero el proque puse eso .no lo se.
abeces en un simulador puede que se necesite producirse un evento por la activacion de un flag.y por lo que sea no se produce este evento.y necesitamos que
salte esta instruccion.asi que cambiamos el comparador.puede que sea por eso por lo que lo cambie.pero no sabria decirte.
-
Bueno, te cuento que ya logre leer datos del buffer de recepción como debe ser, es decir manejando la FIFO circular con sus respectivos apuntadores, fue bastante complicado entender como funcionan esos benditos punteros pero finalmente y luego de leer y releer y buscar en los foros de microchip, pude lograrlo, ah! y a eso agrégale los silicon erratas del enc28j60 que complicaban mas la cosa.
Ahora seguiré con el procesado de los packetes.
Amigaso, si no es por tu aporte no se como habría hecho para empezar. :-/
-
Pues tengo que decirte que en adelante seguro que sobrepasas mis conocimientos.por eso te agradecería que pusieras aquí tus avances.así podré avanzar más rápido de lo que yo pude hasta llegar aquí.y además te sirvira como referencia para futuras consultas.
Saludos.