Hallo, ich hoffe der Betreff ist nicht verwirrend! Ich möchte in VB 2005 Express einen Befehl an meinen Einplatinen-Server senden. Das Problem dabei ist, das wenn ich einen Beispielcode nutze (winsock) mäckert er das es nicht deklariert ist. Ok, ich bin noch Anfänger in VB05Exp! Benutzt soll das ganze mit meinem RTL8019AS-Webserver. In Bascom gibt es eine NE2000 library, die allerdings garnicht funktioniert! Eventuell hat die jemand schon zum laufen gebracht? Weis eventuell jemand eine Möglichkeit den "Einplatinen-Webserver" zum COM-Port umzukonfigurieren? Warscheinlich benötige ich für den PC auch noch einen Treiber der sich mit dem Server verbindet. Gibts da was? Wäre prima, dann könnte ich einfach RS232 übers LAN machen und hätte mir viele Probleme gespart! Grüße Alex
Alex W. wrote: > Hallo, > > ich hoffe der Betreff ist nicht verwirrend! Der Betreff ist vorbildlich und glasklar. > > Ich möchte in VB 2005 Express einen Befehl an meinen Einplatinen-Server > senden. Das Problem dabei ist, das wenn ich einen Beispielcode nutze ^^^^^^^^^^^^ Welchen? > (winsock) mäckert er das es nicht deklariert ist. Ok, ich bin noch ^^ Was? > Anfänger in VB05Exp! > > Benutzt soll das ganze mit meinem RTL8019AS-Webserver. > > In Bascom gibt es eine NE2000 library, die allerdings garnicht > funktioniert! Eventuell hat die jemand schon zum laufen gebracht? > > Weis eventuell jemand eine Möglichkeit den "Einplatinen-Webserver" zum > COM-Port umzukonfigurieren? Warscheinlich benötige ich für den PC auch > noch einen Treiber der sich mit dem Server verbindet. Gibts da was? Wäre > prima, dann könnte ich einfach RS232 übers LAN machen und hätte mir > viele Probleme gespart! > > Grüße > Alex
Hi, ok hier erstmal den Schaltplan des Webservers. Er basiert auf U.Radigs miniWebServer (RTL8019) http://defencemercury1.dyndns.org/spasslex/fotos/webserver.jpg Als Code nutze ich den von Bascom :
1 | $regfile = "m128def.DAT" |
2 | $crystal = 4000000 |
3 | $baud1 = 9600 |
4 | $baud = 9600 |
5 | |
6 | Config Porta = Output |
7 | 'Define the pins used for network card. |
8 | 'Define the pins used for network card. |
9 | |
10 | Ne2000_a0_pin Alias Pinc.0 |
11 | Ne2000_a1_pin Alias Pinc.1 |
12 | Ne2000_a2_pin Alias Pinc.2 |
13 | Ne2000_a3_pin Alias Pinc.3 |
14 | Ne2000_a4_pin Alias Pinc.4 |
15 | Ne2000_ior_pin Alias Pinc.5 |
16 | Ne2000_iow_pin Alias Pinc.6 |
17 | Ne2000_reset_pin Alias Pinc.7 |
18 | |
19 | Ne2000_a0 Alias Portc.0 |
20 | Ne2000_a1 Alias Portc.1 |
21 | Ne2000_a2 Alias Portc.2 |
22 | Ne2000_a3 Alias Portc.3 |
23 | Ne2000_a4 Alias Portc.4 |
24 | Ne2000_ior Alias Portc.5 |
25 | Ne2000_iow Alias Portc.6 |
26 | Ne2000_reset Alias Portc.7 |
27 | |
28 | |
29 | Ne2000_d0_pin Alias Pina.0 |
30 | Ne2000_d1_pin Alias Pina.1 |
31 | Ne2000_d2_pin Alias Pina.2 |
32 | Ne2000_d3_pin Alias Pina.3 |
33 | Ne2000_d4_pin Alias Pina.4 |
34 | Ne2000_d5_pin Alias Pina.5 |
35 | Ne2000_d6_pin Alias Pina.6 |
36 | Ne2000_d7_pin Alias Pina.7 |
37 | |
38 | Ne2000_d0 Alias Porta.0 |
39 | Ne2000_d1 Alias Porta.1 |
40 | Ne2000_d2 Alias Porta.2 |
41 | Ne2000_d3 Alias Porta.3 |
42 | Ne2000_d4 Alias Porta.4 |
43 | Ne2000_d5 Alias Porta.5 |
44 | Ne2000_d6 Alias Porta.6 |
45 | Ne2000_d7 Alias Porta.7 |
46 | |
47 | 'Load the library. |
48 | |
49 | $lib "ne2000.lbx" |
50 | $external Ne2000_init , Ne2000_poll , Ne2000_udp_tx |
51 | |
52 | 'Dimention some variables for the libary. |
53 | Dim Host_mac(6) As Byte |
54 | Dim Host_ip(4) As Byte |
55 | Dim Host_port As Word |
56 | Dim My_mac(6) As Byte |
57 | Dim My_port As Word |
58 | Dim My_ip(4) As Byte |
59 | Dim Udp_data(128) As Byte At &H270 |
60 | 'overlay the string s over the array Udp_data() just to make things easy later. |
61 | Dim S As String * 128 At &H270 Overlay |
62 | |
63 | 'helper varible |
64 | Dim X As Byte |
65 | |
66 | Init: |
67 | ' include the waitms 10 even if you don't have a LCD as the cls will load the required |
68 | ' _waitms routine from the MCS.LBX |
69 | |
70 | Waitms 10 |
71 | |
72 | ' Setup Our Ip Address. |
73 | My_ip(1) = 192 |
74 | My_ip(2) = 168 |
75 | My_ip(3) = 1 |
76 | My_ip(4) = 102 |
77 | |
78 | 'call the initilisation routine for the ne2000 card. |
79 | Gosub Ne2000_init |
80 | |
81 | Main: |
82 | ' Poll the card to see if there is data for us. |
83 | ' The Poll routine takes car of decoding to packets. |
84 | ' It will automaticly reply to ARP requests. and Decode UDP data packets. |
85 | Gosub Ne2000_poll |
86 | |
87 | |
88 | S = "Hello World" |
89 | ' and make the Network card send it. |
90 | Gosub Ne2000_udp_tx |
91 | ' the subroutine Ne2000_udp_rx must be ended with a return. |
92 | Return
|
93 | |
94 | |
95 | ' Go back and do it all again |
96 | Goto Main |
97 | |
98 | 'This is a subroutine that the Ne2000_poll routine calls when there is |
99 | 'UDP data for us. |
100 | Ne2000_udp_rx: |
101 | ' the array Host_mac() contains the PC's mac address this is needed if we |
102 | ' want to send some data back. |
103 | Print "Host ethernet address:"; |
104 | For X = 1 To 6 |
105 | Print Host_mac(x); |
106 | Print " "; |
107 | Next X |
108 | Print
|
109 | ' the array Host_ip() contains the PC's IP address also needed if we |
110 | ' want to send some data back. |
111 | Print "Host IP address:"; |
112 | For X = 1 To 4 |
113 | Print Host_ip(x); |
114 | Print " "; |
115 | Next X |
116 | Print
|
117 | ' the word Host_port is the IP port of the PC. Needed as well if we |
118 | ' want to send some data back. |
119 | Print "Host Port:"; |
120 | Print Host_port |
121 | ' the array My_ip() contains the AVR's IP address also needed if we |
122 | ' want to send some data back. |
123 | Print "AVR's IP address:"; |
124 | For X = 1 To 4 |
125 | Print My_ip(x); |
126 | Print " "; |
127 | Next X |
128 | Print
|
129 | ' the word My_port is the IP port of our AVR. Needed as well if we |
130 | ' want to send some data back. |
131 | Print "AVR Port:"; |
132 | Print My_port |
133 | ' you can check My_port to see if it agrees with a predefined port if you like |
134 | If My_port = 1234 Then |
135 | ' so to get here the PC had to have the right IP address of our AVR and |
136 | ' the right Port address too. |
137 | ' the udp data is placed in the array Udp_data() |
138 | ' we have overlayed the string s over the Udp_data() so that s will also contain |
139 | ' the udp data but in a string format. |
140 | Print S |
141 | End If |
142 | ' now lets send something back to the PC. |
143 | ' fill the string s with some text. |
144 | S = "Hello World" |
145 | ' and make the Network card send it. |
146 | Gosub Ne2000_udp_tx |
147 | ' the subroutine Ne2000_udp_rx must be ended with a return. |
148 | Return
|
149 | 'thats all |
150 | End
|
151 | |
152 | 'The rest of this example is for Visual Basic. |
153 | 'It shows how to interface with the AVR using |
154 | 'the Microsoft Winsock Control. |
155 | |
156 | 'In VB place a Microsoft Winsock Control on your form called Winsock1. |
157 | |
158 | 'You then setup the Winsock Control with the remote host IP address and port. |
159 | |
160 | ' Winsock1.Close |
161 | ' Winsock1.Protocol = sckUDPProtocol |
162 | ' Winsock1.RemoteHost = "192.168.254.102" |
163 | ' Winsock1.RemotePort = "1234" |
164 | |
165 | 'To send a UDP packet to the host (AVR): |
166 | |
167 | ' Winsock1.SendData "What ever you want to send, up to 128 bytes" |
168 | |
169 | 'Data arrives back from the host (AVR) through an event: |
170 | |
171 | ' Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) |
172 | ' Dim strData As String |
173 | ' Winsock1.GetData strData |
174 | |
175 | 'strData now contains the returned text / data |
176 | 'bytesTotal is the length it should be 128 |
177 | |
178 | ' End Sub |
In VB2005 Express nutze ich (habs hinbekommen mit MS Winsock6. Zumindest hoffe ich das)
1 | Winsock1.SendData "What ever you want to send, up to 128 bytes" |
Ich hab an dem WebServer 3 LEDs zusätzlich drann. Ich möchte über den WinSock.SendData-Befehl die LEDs erstmal steuern (damit ich überhaupt weis obs geht) Zwischenzeitlich hab ich festgestellt das der AVR-Code einen Prozessorreset bewirkt (zumindest springt er immer von vorne los). Fuses hab ich geprüft (jtag,xtal, m128-mode) Ich weis einfach nicht weiter!
Dann bringe zunächst den Code auf dem AVR in Ordnung. Vielleicht hilft es hier einen Webserver nach U.Radig-Nachbau zu suchen, der ebenfalls einen Atmega128 verwendet. Vorausgesetzt der angegebene Schaltplan ist kompatibel könntest du ein fremdes Programm übernehmen. Wenn du den BASCOM Code debuggen musst, schau als erstes nach, ob es auf der Herstellerseite oder in der Cummunity Bugreports gibt. Dann versuche einzugrenzen, wo der Fehler passiert. Wahrscheinlich hast du den Sourcecode zu der Library wohl nicht und du kannst nicht viel machen. Mit den drei LEDs und Warteschleifen oder einer EIngabe kannst du dich aber vortasten und prüfen, welche der Unterfunktionen in der Library den Reset auslöst (init, poll, udp_tx). Wenn das steht, kannst du probieren mit Standardtools vom PC aus mit dem AVR zu quatschen. Um Pakete über UDP an deinen AVR auf Port 1234 zu schicken und zu empfangen, kannst du z.B. die Freeware Hercules SETUP benutzen. http://www.hw-group.com/products/hercules/index_de.html Erst anschliessend solltest du dich mit dem Unterschied zwischen VB und VB2005 befassen, um den für VB angegebenen Winsock-Kram hinzubekommen. ADD: Ich hätte mir nicht eine UART mit der LED zugebaut. DEr Atmega128 hat UARTs, da würde ich zumindest an einer eine Debugschnittstelle aufbauen, um mit einem RS232 Terminalprogramm eine weitere Spionagemöglichkeit in das Hirn des kleinen Kerls zu bekommen ;-)
Stefan "stefb" B. wrote: > Dann bringe zunächst den Code auf dem AVR in Ordnung. > > Vielleicht hilft es hier einen Webserver nach U.Radig-Nachbau zu suchen, > der ebenfalls einen Atmega128 verwendet. Vorausgesetzt der angegebene > Schaltplan ist kompatibel könntest du ein fremdes Programm übernehmen. > Die Soft von Ulrich läuft auf den Server! Hab ich schon getestet! > Wenn du den BASCOM Code debuggen musst, schau als erstes nach, ob es auf > der Herstellerseite oder in der Cummunity Bugreports gibt. Dann versuche > einzugrenzen, wo der Fehler passiert. Wahrscheinlich hast du den > Sourcecode zu der Library wohl nicht und du kannst nicht viel machen. > Mit den drei LEDs und Warteschleifen oder einer EIngabe kannst du dich > aber vortasten und prüfen, welche der Unterfunktionen in der Library den > Reset auslöst (init, poll, udp_tx). Der Reset wird bei Ne2000_init ausgelöst > > Wenn das steht, kannst du probieren mit Standardtools vom PC aus mit dem > AVR zu quatschen. Um Pakete über UDP an deinen AVR auf Port 1234 zu > schicken und zu empfangen, kannst du z.B. die Freeware *Hercules SETUP* > benutzen. http://www.hw-group.com/products/hercules/index_de.html > > Erst anschliessend solltest du dich mit dem Unterschied zwischen VB und > VB2005 befassen, um den für VB angegebenen Winsock-Kram hinzubekommen. Danke! Referenzen die funktionieren sind wichtig! Ich werd das Programm mal testen!
Dann bist du in einer blöden Lage. Fehlerursachen in einer proprietären Library zu suchen, ist nicht wirklich spassig. Wie geschrieben - vielleicht ist bereits der Fehler bekannt (und hoffentlich gefixt), oder er kann gemeldet werden. Auch die Doku der Library peinlich genau lesen - vielleicht muss ein Parameter so und so eingestellt werden. An einer Stelle (beim poll) wird ja mit einer Userdefinierten Funktion gearbeitet - vielleicht gibt es für die init was ähnliches (vielleicht Fehlerbehandlung durch User ö.ä.). Hast du einen Link zu der Doku der Ne2000 Library von BASCOM? ADD: Hab den Link: http://www.mcselec.com/index.php?option=com_content&task=view&id=90&Itemid=57
Stefan "stefb" B. wrote:
> http://www.mcselec.com/index.php?option=com_content&task=view&id=90&Itemid=57
Genau diese benutz ich! Im MCS-Forum hab ich nix gefunden!
Nur ein Bauchgefühl: Ich würde beim Debuggen an dieser Stelle anfangen:
1 | Dim Udp_data(128) As Byte At &H270 |
2 | 'overlay the string s over the array Udp_data() just to make things easy later. |
3 | Dim S As String * 128 At &H270 Overlay |
Der Democode ist für einen Atmega8535 (512 Bytes SRAM) geschrieben und du hast einen Atmega128 (4096 Bytes SRAM). Im Original ist statt der Adresse &H270 die Adresse &H79 angegeben. Die Adresse muss bei der Portierung vom Atmega8535 zum Atmega128 geändert werden, weil beim Atmega128 dort Register vom Timern liegen. Aber ist &H270 richtig? Wie kommst du auf die &H270? Die zweite Frage - hat die Library die &H79 fix eincodiert oder kann die auf deine Änderung reagieren?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.