NM7010B - Wiznet
Sziasztok,
Sajnos még mindig nem sikerült adatot küldenem az AVR felől a PC-nek. PC-ről AVR-re megy. Légyszi csak vessetek egy pillantást az alábbi regiszter tartalmakra és mondjátok el, mit gondoltok. Azok megfelelőnek tűnnek, vagy nem?
Tehát, TCP kapcsolatról van szó, a modul szerver módban.
A program kb így épül fel:
W5100 server módba állítása
Várok arra, hogy csatlakozzon a PC
Ha csatlakozott, várom, hogy küldjön adatot.
Ha küldött, akkor küldök vissza egy "A" betűt.
Az adatfogadásig megy a dolog, de az A betűmet nem bírom visszaküldeni. Hiába adom ki a send parancsot, nem hajtja végre a modul, a memóriában marad.
Minden küldés előtt kiovasom a TX regisztereket, majd megállapítom, hogy hova kell menteni a küldendő adatot a memóriában.
------------------------------------
(0x0422, 0x0423)-TX Read Pointer: 93C4
(0x0420, 0x0421)-TX Free size: 2048byte
(0x0424, 0x0425)-TX Write Pointer: 93C4
TX offset: 03C4
(A küldésre szánt adat helye a memóriában)TX start addr.: 43C4
New TX Write Pointer: 93C5
Send!
------------------------------------
Miután command regiszterbe beírtam a SEND parancsot, látszólag nem történik semmi. Ha ezután megpróbálok még egy bájtot küldeni, akkor az alábbi regiszer értékeket kapom:
------------------------------------
(0x0422, 0x0423)-TX Read Pointer: 93C4
(0x0420, 0x0421)-TX Free size: 2047byte
(0x0424, 0x0425)-TX Write Pointer: 93C5
TX offset: 03C5
(A küldésre szánt adat helye a memóriában)TX start addr.: 43C5
New TX Write Pointer: 93C6
Send!
------------------------------------
Ami ebből látszik, az az, hogy pontosan egy bájttal kevesebb a hely és a TX Read Pointer értéke nem változott az előző küldési próbálkozás után. Olyan, mintha ki sem adtam volna a SEND parancsot. Pedig kiadtam.
A socket státusza végig 0x17, tehát established.
Ami furcsa a számomra, hogy reset után, első alkalomra a TX Read pointer értéke nem nulla, sőt, minde reset után más és más. Ez normális? Van két modulom is, mind a kettő így viselkedik.
Nagyon megköszönném, ha tudnátok szánni pár percet a problémámra.
Zoli
Sajnos még mindig nem sikerült adatot küldenem az AVR felől a PC-nek. PC-ről AVR-re megy. Légyszi csak vessetek egy pillantást az alábbi regiszter tartalmakra és mondjátok el, mit gondoltok. Azok megfelelőnek tűnnek, vagy nem?
Tehát, TCP kapcsolatról van szó, a modul szerver módban.
A program kb így épül fel:
W5100 server módba állítása
Várok arra, hogy csatlakozzon a PC
Ha csatlakozott, várom, hogy küldjön adatot.
Ha küldött, akkor küldök vissza egy "A" betűt.
Az adatfogadásig megy a dolog, de az A betűmet nem bírom visszaküldeni. Hiába adom ki a send parancsot, nem hajtja végre a modul, a memóriában marad.
Minden küldés előtt kiovasom a TX regisztereket, majd megállapítom, hogy hova kell menteni a küldendő adatot a memóriában.
------------------------------------
(0x0422, 0x0423)-TX Read Pointer: 93C4
(0x0420, 0x0421)-TX Free size: 2048byte
(0x0424, 0x0425)-TX Write Pointer: 93C4
TX offset: 03C4
(A küldésre szánt adat helye a memóriában)TX start addr.: 43C4
New TX Write Pointer: 93C5
Send!
------------------------------------
Miután command regiszterbe beírtam a SEND parancsot, látszólag nem történik semmi. Ha ezután megpróbálok még egy bájtot küldeni, akkor az alábbi regiszer értékeket kapom:
------------------------------------
(0x0422, 0x0423)-TX Read Pointer: 93C4
(0x0420, 0x0421)-TX Free size: 2047byte
(0x0424, 0x0425)-TX Write Pointer: 93C5
TX offset: 03C5
(A küldésre szánt adat helye a memóriában)TX start addr.: 43C5
New TX Write Pointer: 93C6
Send!
------------------------------------
Ami ebből látszik, az az, hogy pontosan egy bájttal kevesebb a hely és a TX Read Pointer értéke nem változott az előző küldési próbálkozás után. Olyan, mintha ki sem adtam volna a SEND parancsot. Pedig kiadtam.
A socket státusza végig 0x17, tehát established.
Ami furcsa a számomra, hogy reset után, első alkalomra a TX Read pointer értéke nem nulla, sőt, minde reset után más és más. Ez normális? Van két modulom is, mind a kettő így viselkedik.
Nagyon megköszönném, ha tudnátok szánni pár percet a problémámra.
Zoli
Szia,
HUB-om nincs, a wiznet-et közvetlenül a gépre kötöttem. Nem megy ki a hálóra az "A" betűm. Viszont van itt valami, ami nem igazán tetszik. Amint megnyitom a pc-n a kapcsolatot a wiznet felé (telnet-et használok erre) a wiznet elkezd [TCP Dup ACK] csomagokat küldözni. Megállás nélkül, pár másodperc alatt több milliót, gondolom, ami a csövön kifér. Aztán pedig [TCP Keep-Alive ACK] csomagokat, ebből is pár milliót, aztán lehúztam a wiznetet, mert befagyasztotta a wireshark-ot.
Mi lehet a gond szerinted?
Helyesbítés:
"Amint megnyitom a pc-n a kapcsolatot a wiznet felé (telnet-et használok erre) a wiznet elkezd [TCP Dup ACK] csomagokat küldözni."
Nem a kapcsolat létrejöttekor kezdi küldeni TCP Dup ACK csomagokat, hanem amikor megpróbálom kiküldeni az "A" betűt.
HUB-om nincs, a wiznet-et közvetlenül a gépre kötöttem. Nem megy ki a hálóra az "A" betűm. Viszont van itt valami, ami nem igazán tetszik. Amint megnyitom a pc-n a kapcsolatot a wiznet felé (telnet-et használok erre) a wiznet elkezd [TCP Dup ACK] csomagokat küldözni. Megállás nélkül, pár másodperc alatt több milliót, gondolom, ami a csövön kifér. Aztán pedig [TCP Keep-Alive ACK] csomagokat, ebből is pár milliót, aztán lehúztam a wiznetet, mert befagyasztotta a wireshark-ot.
Mi lehet a gond szerinted?
Helyesbítés:
"Amint megnyitom a pc-n a kapcsolatot a wiznet felé (telnet-et használok erre) a wiznet elkezd [TCP Dup ACK] csomagokat küldözni."
Nem a kapcsolat létrejöttekor kezdi küldeni TCP Dup ACK csomagokat, hanem amikor megpróbálom kiküldeni az "A" betűt.
A megoldás a problémámra:
A "hiba" az volt, hogy a wiznet-ben úgy állítottam be a socket-et, hogy miután beállítottam a tcp módot és a portot, a command registerbe kiadtam a listen! prancsot. Ezzel nyitottá vált a port a wiznet-en, lehett hozzá csatlakozni és adatot küldeni rá. Csak a wiznet felőli küldés nem ment.
A listen parancs kiadása előtt ki kell adni egy Close és egy Open parancsot is. Tehát helyesen így néz ki a socket szerver módba állítása:
Close
Open
Listen
Az adatlapban nem találtam semmi erre vonatkozót, vagy nagyon elkerülte a figyelmem. Írja ezt az adatlap?
Egy minta progiban láttam, hogy így csinálta valaki.
Köszönöm mindnkinek, aki időt szánt a problémámra.
Zoli
A "hiba" az volt, hogy a wiznet-ben úgy állítottam be a socket-et, hogy miután beállítottam a tcp módot és a portot, a command registerbe kiadtam a listen! prancsot. Ezzel nyitottá vált a port a wiznet-en, lehett hozzá csatlakozni és adatot küldeni rá. Csak a wiznet felőli küldés nem ment.
A listen parancs kiadása előtt ki kell adni egy Close és egy Open parancsot is. Tehát helyesen így néz ki a socket szerver módba állítása:
Close
Open
Listen
Az adatlapban nem találtam semmi erre vonatkozót, vagy nagyon elkerülte a figyelmem. Írja ezt az adatlap?
Egy minta progiban láttam, hogy így csinálta valaki.
Köszönöm mindnkinek, aki időt szánt a problémámra.
Zoli
Wiz812mj - AT24c256
Szervusztok!
A problémám a következő:
Szeretném a 24c256- ból kiolvasott byte-kat kiküldeni a wiz812Mj-n.
Megadom az eeprom start "poziciót" és addig küldöm amíg nem olvasok be egy ASC(094) "^" -t. Terminálon kiküldve tökéletesen megy ki menden.
A wiz812mj csak az első beolvasott karaktert küldi ki.
Ez valahol érthető is.
Próbáltam úgy is ez előtt hogy 680Byte hosszú string-be gyűjtöm ki az adatokat, majd ezután kiküldöm a wiz812mj-n keresztül. Ekkor az volt a gond hogy csak az első 680Byte-t tudtam elküldeni.
Soros porton ellenőrzöm azt amit beolvasok a 24c256-ból.
Ott tökéletes minden. Ott nincs hasonló gondom.
Csak a wiz812mj küldéssel van problémám.
wiz812mj küldést nem igazán látom át...
Kód:
Sub Wiz5100_send
Local Sendsize As Integer , Pos_tx As Word , Freesize As Word , Offset As Word , Tx_wr As Word
Local Startadress As Word , Offsend As Word , Uppersize As Word , Glaenge As Word , Startpos As Word
Local Bfr As String * 20
Local Zz As Word
'_________________________WEBOLDAL------------------------
'We restore the used website data
If Website = 0 Then
nop
Elseif Authentification = 0 Then
Hadress = &H00
Ladress = &H00
I2cstart
I2cwbyte &B1010_0000
I2cwbyte Hadress
I2cwbyte Ladress
I2cstart
I2cwbyte &B1010_0001
Else
nop
End If
Do
I2crbyte Eeprom_byte , Ack
Buffer = String(1 , Eeprom_byte)
If Buffer = Chr(94) Then
Print "<----VÉGE---->"
Exit Do
End If
Print Buffer ;
Sendsize = Len(buffer)
Freesize:
Call Wiz5100_readvalue(w5100_s0_tx_fsr0)
Freesize = Wert
Shift , Freesize , Left , 8
Call Wiz5100_readvalue(w5100_s0_tx_fsr1)
Freesize = Freesize + Wert
If Freesize < Sendsize Then
Goto Freesize
End If
Call Wiz5100_readvalue(w5100_s0_tx_wr0)
Tx_wr = Wert
Shift , Tx_wr , Left , 8
Call Wiz5100_readvalue(w5100_s0_tx_wr1)
Tx_wr = Tx_wr + Wert
Startpos = Tx_wr
Offset = Tx_wr And &H7FF
Startadress = &H4000 + Offset
Offsend = Offset + Sendsize
Pointer = Startadress
If Offsend > &H800 Then
Uppersize = &H800 - Offset
For X = 1 To Uppersize
Tmp_str = Mid(buffer , X , 1)
Tmp_value = Asc(tmp_str)
Call Wiz5100_writevalue(pointer , Tmp_value)
Incr Pointer
Next X
Pointer = &H4000
Incr Uppersize
For X = Uppersize To Sendsize
Tmp_str = Mid(buffer , X , 1)
Tmp_value = Asc(tmp_str)
Call Wiz5100_writevalue(pointer , Tmp_value)
Incr Pointer
Next X
Else
For X = 1 To Sendsize
Tmp_str = Mid(buffer , X , 1)
Tmp_value = Asc(tmp_str)
Call Wiz5100_writevalue(pointer , Tmp_value)
Incr Pointer
Next X
End If
Call Wiz5100_readvalue(w5100_s0_tx_wr0)
Startpos = Wert
Shift , Startpos , Left , 8
Call Wiz5100_readvalue(w5100_s0_tx_wr1)
Startpos = Startpos + Wert
Glaenge = Startpos + Sendsize
'Oldal küldése
Highbyte = High(glaenge)
Call Wiz5100_writevalue(w5100_s0_tx_wr0 , Highbyte)
Lowbyte = Low(glaenge)
Call Wiz5100_writevalue(w5100_s0_tx_wr1 , Lowbyte)
Call Wiz5100_writevalue(w5100_s0_cr , &H20)
Call Wiz5100_writevalue(w5100_s0_cr , &H8)
Loop
I2crbyte Eeprom_byte , Nack
I2cstop
End Sub
Üdv, Sándor
A problémám a következő:
Szeretném a 24c256- ból kiolvasott byte-kat kiküldeni a wiz812Mj-n.
Megadom az eeprom start "poziciót" és addig küldöm amíg nem olvasok be egy ASC(094) "^" -t. Terminálon kiküldve tökéletesen megy ki menden.
A wiz812mj csak az első beolvasott karaktert küldi ki.
Ez valahol érthető is.
Próbáltam úgy is ez előtt hogy 680Byte hosszú string-be gyűjtöm ki az adatokat, majd ezután kiküldöm a wiz812mj-n keresztül. Ekkor az volt a gond hogy csak az első 680Byte-t tudtam elküldeni.
Soros porton ellenőrzöm azt amit beolvasok a 24c256-ból.
Ott tökéletes minden. Ott nincs hasonló gondom.
Csak a wiz812mj küldéssel van problémám.
wiz812mj küldést nem igazán látom át...
Kód:
Sub Wiz5100_send
Local Sendsize As Integer , Pos_tx As Word , Freesize As Word , Offset As Word , Tx_wr As Word
Local Startadress As Word , Offsend As Word , Uppersize As Word , Glaenge As Word , Startpos As Word
Local Bfr As String * 20
Local Zz As Word
'_________________________WEBOLDAL------------------------
'We restore the used website data
If Website = 0 Then
nop
Elseif Authentification = 0 Then
Hadress = &H00
Ladress = &H00
I2cstart
I2cwbyte &B1010_0000
I2cwbyte Hadress
I2cwbyte Ladress
I2cstart
I2cwbyte &B1010_0001
Else
nop
End If
Do
I2crbyte Eeprom_byte , Ack
Buffer = String(1 , Eeprom_byte)
If Buffer = Chr(94) Then
Print "<----VÉGE---->"
Exit Do
End If
Print Buffer ;
Sendsize = Len(buffer)
Freesize:
Call Wiz5100_readvalue(w5100_s0_tx_fsr0)
Freesize = Wert
Shift , Freesize , Left , 8
Call Wiz5100_readvalue(w5100_s0_tx_fsr1)
Freesize = Freesize + Wert
If Freesize < Sendsize Then
Goto Freesize
End If
Call Wiz5100_readvalue(w5100_s0_tx_wr0)
Tx_wr = Wert
Shift , Tx_wr , Left , 8
Call Wiz5100_readvalue(w5100_s0_tx_wr1)
Tx_wr = Tx_wr + Wert
Startpos = Tx_wr
Offset = Tx_wr And &H7FF
Startadress = &H4000 + Offset
Offsend = Offset + Sendsize
Pointer = Startadress
If Offsend > &H800 Then
Uppersize = &H800 - Offset
For X = 1 To Uppersize
Tmp_str = Mid(buffer , X , 1)
Tmp_value = Asc(tmp_str)
Call Wiz5100_writevalue(pointer , Tmp_value)
Incr Pointer
Next X
Pointer = &H4000
Incr Uppersize
For X = Uppersize To Sendsize
Tmp_str = Mid(buffer , X , 1)
Tmp_value = Asc(tmp_str)
Call Wiz5100_writevalue(pointer , Tmp_value)
Incr Pointer
Next X
Else
For X = 1 To Sendsize
Tmp_str = Mid(buffer , X , 1)
Tmp_value = Asc(tmp_str)
Call Wiz5100_writevalue(pointer , Tmp_value)
Incr Pointer
Next X
End If
Call Wiz5100_readvalue(w5100_s0_tx_wr0)
Startpos = Wert
Shift , Startpos , Left , 8
Call Wiz5100_readvalue(w5100_s0_tx_wr1)
Startpos = Startpos + Wert
Glaenge = Startpos + Sendsize
'Oldal küldése
Highbyte = High(glaenge)
Call Wiz5100_writevalue(w5100_s0_tx_wr0 , Highbyte)
Lowbyte = Low(glaenge)
Call Wiz5100_writevalue(w5100_s0_tx_wr1 , Lowbyte)
Call Wiz5100_writevalue(w5100_s0_cr , &H20)
Call Wiz5100_writevalue(w5100_s0_cr , &H8)
Loop
I2crbyte Eeprom_byte , Nack
I2cstop
End Sub
Üdv, Sándor
Ha a lefoglalt string 680 byte, akkor annál hosszabbat ne akarj kiküldeni
TELJES programkód kérhető?
http://avr.tavir.hu/modules.php?name=Fo ... opic&t=827
Milyen IC?
Milyen fordítóverzió?
Milyen deklarációk vannak?
A Buffer-t nem töltöd fel. Szóval a kód is valami katyvasz jelenleg.... (első olvasásra)
Az első If/then/else miért van tele NOP utasítással?
TELJES programkód kérhető?
http://avr.tavir.hu/modules.php?name=Fo ... opic&t=827
Milyen IC?
Milyen fordítóverzió?
Milyen deklarációk vannak?
A Buffer-t nem töltöd fel. Szóval a kód is valami katyvasz jelenleg.... (első olvasásra)
Az első If/then/else miért van tele NOP utasítással?
Igazad van A teljes kód:
A teljes programkód http://members.home.nl/bzijlstra/softwa ... z810mj.htm
(WebServer)
http://members.home.nl/bzijlstra/softwa ... server.txt
Amit változtattam tulajdonképp csak ennyi:
inicializáltam az i2c-bus-t.
$lib "I2C_TWI.LBX"
Config Porte.3 = Output
Config Scl = Portd.0
Config Sda = Portd.1
Dim Hadress As Word
Dim Ladress As Word
Dim Eeprom_byte As Byte
És amit feljebb beillesztettem programkódot abból kibeleztem a restore utasítást. (és eltávolítottam az eredeti programkód végéről a DATA"xy" sorokat.
Az at24c256 tartalmazza a weboldal tartalmát. Majd ebből szeretném kiolvasni ami működik is rendesen.
(az eredeti kódban restore-vel vadászta ki DATA sorokból a weboldal tartalmát.)
Kiolvassa az eeprom-ból rendesen, Soros porton nézve minden ok. (A külső eeprom már tartalmazza a weboldalt)
Csak ép a wiznet modul nem küldi ki jelenleg csak az első byte-t.
Vagy 680Byt-ig amit bele teszek a buffer-be.
De akkor is csak az első 680byte buffer tartalmat küldi ki.
ATmega128 -t használok jelenleg és Bascom 1.11.9.0 -t
A teljes programkód http://members.home.nl/bzijlstra/softwa ... z810mj.htm
(WebServer)
http://members.home.nl/bzijlstra/softwa ... server.txt
Amit változtattam tulajdonképp csak ennyi:
inicializáltam az i2c-bus-t.
$lib "I2C_TWI.LBX"
Config Porte.3 = Output
Config Scl = Portd.0
Config Sda = Portd.1
Dim Hadress As Word
Dim Ladress As Word
Dim Eeprom_byte As Byte
És amit feljebb beillesztettem programkódot abból kibeleztem a restore utasítást. (és eltávolítottam az eredeti programkód végéről a DATA"xy" sorokat.
Az at24c256 tartalmazza a weboldal tartalmát. Majd ebből szeretném kiolvasni ami működik is rendesen.
(az eredeti kódban restore-vel vadászta ki DATA sorokból a weboldal tartalmát.)
Kiolvassa az eeprom-ból rendesen, Soros porton nézve minden ok. (A külső eeprom már tartalmazza a weboldalt)
Csak ép a wiznet modul nem küldi ki jelenleg csak az első byte-t.
Vagy 680Byt-ig amit bele teszek a buffer-be.
De akkor is csak az első 680byte buffer tartalmat küldi ki.
ATmega128 -t használok jelenleg és Bascom 1.11.9.0 -t
Szia!
De igen.
Dim buffer as string * 680
ez okozza a limitet.
Sendsize = Len(buffer)
ha azt mondom neki hogy
Sendsize = 1360
majd 2x elküldöm neki a Buffer tartalmat , más más tartalommal?
Tulajdonképp a 680byte-nél nagyobb változót nem szeretnék, és inkább több részletben szeretném az ennél nagyobb adatcsomagokat kiküldeni.
Dim buffer as string * 680
ez okozza a limitet.
Sendsize = Len(buffer)
ha azt mondom neki hogy
Sendsize = 1360
majd 2x elküldöm neki a Buffer tartalmat , más más tartalommal?
Tulajdonképp a 680byte-nél nagyobb változót nem szeretnék, és inkább több részletben szeretném az ennél nagyobb adatcsomagokat kiküldeni.
A Wiznet belsején a buffer az a belső memóriát töltheti ki. Ez persze több lépésben is feltölthető (csak a felfűzési pontokat kell tudni).
A belső buffer mérete: max 16k! Valamennyi kell a csomagkezeléshez, de így is 8-16k szabadon felhasználható. Persze ez feltételezi, hogy 1 socketet kezelsz egyidőben...
A belső buffer mérete: max 16k! Valamennyi kell a csomagkezeléshez, de így is 8-16k szabadon felhasználható. Persze ez feltételezi, hogy 1 socketet kezelsz egyidőben...
Hali!
A W5100 adatlapja szerint nem támogatja az IP darabolást.
"- Not support IP Fragmentation "
Így 1514 byte a max. méret fejléccel együtt.
A file csere-bere oldalin web.zip-ben találsz kódot a darabolásra.
Csináltam már vele 32k kép átvitelét is, és jól megy. Azért csak 32k, mert a képet befordítottam a forráskódba. Ha külső memóriából olvasod, akkor persze nagyobb is lehet.
A W5100 adatlapja szerint nem támogatja az IP darabolást.
"- Not support IP Fragmentation "
Így 1514 byte a max. méret fejléccel együtt.
A file csere-bere oldalin web.zip-ben találsz kódot a darabolásra.
Csináltam már vele 32k kép átvitelét is, és jól megy. Azért csak 32k, mert a képet befordítottam a forráskódba. Ha külső memóriából olvasod, akkor persze nagyobb is lehet.