Forum: PC-Programmierung Mit VB 2005 Express einen AVR mit RTL8019AS steuern


von Alex W. (a20q90)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Alex W. (a20q90)


Lesenswert?

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!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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 ;-)

von Alex W. (a20q90)


Lesenswert?

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!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Alex W. (a20q90)


Lesenswert?

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!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.