Forum: Mikrocontroller und Digitale Elektronik ATMega128 + ENC28J60 + Webserver (Radig)


von kalhou (Gast)


Lesenswert?

Hi

Ich habe heute den Webserver von Radig so angepasst, dass ich TCP-Daten 
empfangen und sie direkt über UART ausgeben kann. Es scheint alles zu 
klappen, allerdings bleibt ein Problem. Wenn ich mit "Advanced Serial 
Port Terminal" über TCP/IP Daten an den Controller schicke, scheint es 
als ob er diese mehrere Male bekommt. D.h. ich bekomme mehrere Male 
etwas über UART gesendet obwohl ich es nur einmal im Terminal sende.
1
#include <avr/io.h>
2
#include <stdio.h>
3
#include <string.h>
4
#include "config.h"
5
#include "usart.h"
6
#include "networkcard/enc28j60.h"
7
#include "stack.h"
8
#include "timer.h"
9
#include "base64.h"
10
11
void tcpFunktion(unsigned char buffer);
12
13
int main(void){
14
15
  long a;
16
  
17
  DDRA = 0xFF;
18
  PORTA = 0xC4;
19
  
20
  //UART initialisieren
21
  usart_init(BAUDRATE);
22
  
23
  //Erfolgsmeldung
24
  usart_write("\n\rSystem Ready\n\r");
25
  usart_write("Compiliert am "__DATE__" um "__TIME__"\r\n");
26
  usart_write("Compiliert mit GCC Version "__VERSION__"\r\n");
27
  
28
  //Verzögerung
29
  for(a=0;a<1000000;a++){asm("nop");};
30
  
31
  //Stack initialisieren
32
  stack_init();
33
  
34
  //Ethernetcard Interrupt enable
35
  ETH_INT_ENABLE;
36
  
37
  //Globale Interrupts einschalten
38
  sei(); 
39
  
40
  add_tcp_app(1337, &tcpFunktion);
41
  
42
  for(;;){
43
    eth_get_data();
44
  }
45
46
}
47
48
void tcpFunktion(unsigned char buffer){
49
50
  int value;
51
  char usart_buffer[30];
52
  int a;
53
  
54
  usart_write("Data received!!!!!\n");
55
  
56
  for(a=TCP_DATA_START; a < TCP_DATA_END_VAR; a++){
57
    usart_write_char(eth_buffer[a]);
58
  }
59
  
60
  usart_write_char('\n');
61
}

Die ganzen Register habe ich natürlich angepasst. Wenn ich nun über das 
Terminal den String "hello" über TCP/IP sende erscheint folgendes

1
System Ready
2
3
Compiliert am Jul 14 2008 um 15:45:54
4
Compiliert mit GCC Version 4.2.2 (WinAVR 20071221)
5
6
7
NIC init:READY!
8
My IP: 192.168.0.99
9
10
Data received!!!!!
11
hello
12
Data received!!!!!
13
hello
14
Data received!!!!!
15
hello
16
Data received!!!!!
17
hello
18
Data received!!!!!
19
hello
20
Data received!!!!!
21
¦žUuÔ$¦èÀ¨
22
bÀ¨c–Í€(ÿÿÿÀ¨
23
Ám9”:Ú ±o| ±oé hÆvçÿŒãÒÐëN
24
s/ü7Ç(w}y=•ïl¶Ôˆµ1/ßz, û¯©—Çÿ›Úå§ÿóJi—˾ó5·cè;›Ov{òðgof½MÒ?‰-0¯ûN
25
§û:ÁžÞSv¨‹eö^ü¾»¿$T® ¼[ñ¥ÔÙo±ëÏÆÍ\û]ûèž7S}=·¸ô‡ú†ý¾”ï÷ÿǝãï~Â$Ä—ïÐ%ÿ4hÞüæ…g?«ej¾Úf+$Ã4–ùôÍß\T€`ÿ¶êzô-úqÌÍ•^åÆËâØøë<ª>·¸ûûðÜÿ
26
Ì×k—cv¶¥œ
27
7/B2<,÷·ï¡çÙäÌj]Üô×ôíû[ÇÓ¦æë¦>lm±÷Ûtð©¢0˜˜Édÿ¿~VñžžZ$΁yKßßK7ÆùüßÝYO'ì{ÿí”Ò~8|sµ²åž¿Ò{£ê|ÇŸs¤Ùi¹¦{,ÇW½¼Óú¾éjÿ”½ö/9û×¼é;UüÖç¾:úû¯n¥|Ö*°ÿ´ÈÝï÷ÝݬçÑ“Ïÿ‡»ÿ+6óÓûæ\ÇâÝiìþODüßfÀÑm—¤cU§CWOkÜ{˜¿ÌÑMH®_ZY÷ïщïùö6nbÌ.³ÔT²\Ñ[qÈÖÔÙõŸäC*Uú:çُ#«CÙ¼g}ø_]àDßj}eù=ž|ÿsÏ.G«™ÿ–OÕù[ºé`TÓbèÑ|˜°f7
28
ž}ãòw»¶ÿ™wÚlÞt¿(Oër}¨Þl÷xëÐ+’žõeüÃöøɾÝ
29
Data received!!!!!
30
hello
31
Data received!!!!!
32
hello

Hat jemand eine Idee warum diese Nachricht so oft übertragen wird und 
wie man das beheben kann?

Mit freundlichen Grüssen

von kahou (Gast)


Lesenswert?

So...

Ich habe das Problem nun gelöst.

Einerseits muss man zuerst testen ob der Interrupt, den wir kriegen, 
wirklich auch durch ankommende Daten verursacht wird, was im Register 
EIR und dem Bit PKTIF getestet wird.

Weiter muss man nach jedem Empfangenen Packet dem ENC28J60 mitteilen, 
dass das Packet bearbeitet wurde, was wir im Register ECON2 und mit dem 
Bit PKTDEC bewerkstelligen. Dadurch wird das Register EPKTCNT um 1 
dekrementiert.

Als letztes sollte man dann statt TCP einfach UDP verwenden, da es mit 
TCP noch andere Probleme zu geben scheint.

Mit freundlichen Grüssen

kalhou

von Simon K. (simon) Benutzerseite


Lesenswert?

kahou wrote:
> Einerseits muss man zuerst testen ob der Interrupt, den wir kriegen,
> wirklich auch durch ankommende Daten verursacht wird, was im Register
> EIR und dem Bit PKTIF getestet wird.

Du meinst vor dem Auslesen des (mglw.) angekommenen Pakets? Du kannst 
dafür auch den Packet-Counter nachgucken, und schauen ober > 0 ist.

> Weiter muss man nach jedem Empfangenen Packet dem ENC28J60 mitteilen,
> dass das Packet bearbeitet wurde, was wir im Register ECON2 und mit dem
> Bit PKTDEC bewerkstelligen. Dadurch wird das Register EPKTCNT um 1
> dekrementiert.

Das auf jeden Fall. Damit bestätigt man das Frame. Wichtig ist, dass du 
solche Bitzugriffe (auf PKTDEC) per Masken-Setz Befehl des ENC28J60 
machst und nicht per Read/Modify/Write über die SPI Schnittstelle. Da 
handelt man sich ganz schnell ärger ein...

> Als letztes sollte man dann statt TCP einfach UDP verwenden, da es mit
> TCP noch andere Probleme zu geben scheint.

Wo ist denn das Problem? Ich kenn aber Radigs TCP Stack auch nicht so 
gut.

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.