NM7010B - Wiznet

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

Hozzászólás Szerző: zb83 »

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
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Kimegy a hálóra? A Wireshark mit mond, ha HUB-ot kötsz be?
Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

Hozzászólás Szerző: zb83 »

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.
Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

Hozzászólás Szerző: zb83 »

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
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

Wiz812mj - AT24c256

Hozzászólás Szerző: Sanci »

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
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Ha a lefoglalt string 680 byte, akkor annál hosszabbat ne akarj kiküldeni :P


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?
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

Hozzászólás Szerző: Sanci »

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
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az 1.11.9.0 kb. 2 éves!

Nem a Dim buffer(680) as byte sor szerepel? vagy buffer as string*680 ?
Ez okozza a limitet.

Az EEPROM kiolvasás?

ujra:
eeprom byteolvas
buffer=buffer+ASC(byteolvas)
if kiolvasasnak_nincs_vege then goto ujra
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

Szia!

Hozzászólás Szerző: Sanci »

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.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Több TCP csomagot jelent ez ekkor!
Ill a Wiznet kezelést kell kivesézni a W5100 IC adatlap alapján.


Ha a sendsize=kétszeres, akkor hibás működésed lesz....
A feltöltő/bufferáttöltő rutint ekkor át kell írni!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A Wiznet modul az adatcsomag darabolást megoldja, a legnagyobb amivel játszottan a 3,6kByte-s adatcsomag volt....
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

Hozzászólás Szerző: Sanci »

Értem.
Minden esetre KÖSZÖNÖM a segítséget!
Megpróbálom jobban kivesézni az adatlapot. 3.6K nekem időnként azért kevés lesz, így kénytelen vagyok kitalálni hogyan tudom neki "darabokban beadni" a hosszabb adatcsomagokat.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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...
Avatar
pepe
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2008. szeptember 6. szombat, 6:00

Hozzászólás Szerző: pepe »

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.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az én modulom nem olvasta:)

A bufferbe bele a 3.6k adat és HTMLként simán átment :P
Válasz küldése