mikrocontroller.net

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


Autor: kalhou (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>
#include <stdio.h>
#include <string.h>
#include "config.h"
#include "usart.h"
#include "networkcard/enc28j60.h"
#include "stack.h"
#include "timer.h"
#include "base64.h"

void tcpFunktion(unsigned char buffer);

int main(void){

  long a;
  
  DDRA = 0xFF;
  PORTA = 0xC4;
  
  //UART initialisieren
  usart_init(BAUDRATE);
  
  //Erfolgsmeldung
  usart_write("\n\rSystem Ready\n\r");
  usart_write("Compiliert am "__DATE__" um "__TIME__"\r\n");
  usart_write("Compiliert mit GCC Version "__VERSION__"\r\n");
  
  //Verzögerung
  for(a=0;a<1000000;a++){asm("nop");};
  
  //Stack initialisieren
  stack_init();
  
  //Ethernetcard Interrupt enable
  ETH_INT_ENABLE;
  
  //Globale Interrupts einschalten
  sei(); 
  
  add_tcp_app(1337, &tcpFunktion);
  
  for(;;){
    eth_get_data();
  }

}

void tcpFunktion(unsigned char buffer){

  int value;
  char usart_buffer[30];
  int a;
  
  usart_write("Data received!!!!!\n");
  
  for(a=TCP_DATA_START; a < TCP_DATA_END_VAR; a++){
    usart_write_char(eth_buffer[a]);
  }
  
  usart_write_char('\n');
}

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



System Ready

Compiliert am Jul 14 2008 um 15:45:54
Compiliert mit GCC Version 4.2.2 (WinAVR 20071221)


NIC init:READY!
My IP: 192.168.0.99

Data received!!!!!
hello
Data received!!!!!
hello
Data received!!!!!
hello
Data received!!!!!
hello
Data received!!!!!
hello
Data received!!!!!
¦žUuÔ$¦èÀ¨
bÀ¨c–Í€(ÿÿÿÀ¨
Ám9”:Ú ±o| ±oé hÆvçÿŒãÒÐëN
s/ü7Ç(w}y=•ïl¶Ôˆµ1/ßz, û¯©—Çÿ›Úå§ÿóJi—˾ó5·cè;›Ov{òðgof½MÒ?‰-0¯ûN
§û:ÁžÞSv¨‹eö^ü¾»¿$T® ¼[ñ¥ÔÙo±ëÏÆÍ\û]ûèž7S}=·¸ô‡ú†ý¾”ï÷ÿǝãï~Â$Ä—ïÐ%ÿ4hÞüæ…g?«ej¾Úf+$Ã4–ùôÍß\T€`ÿ¶êzô-úqÌÍ•^åÆËâØøë<ª>·¸ûûðÜÿ
Ì×k—cv¶¥œ
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
ž}ãòw»¶ÿ™wÚlÞt¿(Oër}¨Þl÷xëÐ+’žõeüÃöøɾÝ
Data received!!!!!
hello
Data received!!!!!
hello

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

Mit freundlichen Grüssen

Autor: kahou (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.