ENC28J60 (Mikro-)Web-Server die Nächste

Gast #1941071
Lesenswert?

Gerade wollte ich meinen Source hochladen, da sehe ich den NTP-Source 
von Tobi. Ein Vergleich zeigte, dass ich einfach die udp-Erweiterung in 
der main.c vergessen habe. Habe ich eingefügt und mein bestehender 
NTP-Code funktionierte auf Anhieb!

Hello NTP,
Thank you very much for this link! It solved my problem!

Da ich den uIP-Stack auf dem atxmega implementiere und es bisher 
anscheinend keinen uIP-Code für xmegas gibt, kann ich gerne mein 
komplettes Projekt hier hochladen, sobald es fertig ist.
Ansonsten vielen Dank für eure Hilfe!
Gast #2020753
Lesenswert?

Hallo,

also ich habe gerade ganz aufmerksam den ganzen Beitrag gelesen und find 
es toll, was ihr gemeinschaftlich auf die Beine stellt.

Ich verwende gerade das PIC32 Ethernet Starterkit als Hardwareplattform 
bei meiner Diplomarbeit. Ich soll eine Testplatine entwickeln, mit der 
ich mehrere Steckkarten a 32* 24V-Relais ansteuere. Warum PIC32? Wurde 
mir auf den Tisch gelegt. (Jetzt spiele ich mit dem Gedanken auf Atmel 
um´zusteigen:-))


Ich habe hier leider nach Tagelangem suchen keine richtigen Beiträge in 
Foren gefunden. Heute war ich verzweifelt und habe angefangen nach 
Alternativen zu gucken. Und siehe da!! Nach kurzer Recherche finde ich 
diesen tollen Beitrag. Vieles von den angesprochenen Dingen könnte ich 
in meine Diplomarbeit einfließen lassen.

Die Testplatine von Jörg T., mit der er 8x 24V-Relais anspricht, ist 
genau das, was ich entwickeln will. Und auch die fertigen Webinterfaces 
sind richtig gut gelungen.

Ich habe auf der Arbeit keine Ansprechpartner für den PIC32,
und komme mit meiner Diplomarbeit deshalb nicht in die Gänge. Frust 
statt Erfolg!!

Wenn ich umstelle auf Atmel, könnte ich direkt loslegen und mich mit 
euren Projekten beschäftigen!!

Da ich zeitlich sehr eingeschränkt bin, würde das meiner Diplomarbeit zu 
gute kommen.

Ich könnte euch dann auch immer wieder mit neue Infos anbieten und würde 
meine Arbeit dann auch hier zur Verfügung stellen..

Würdet ihr mir dazu raten??

Lieben Gruß
OP Persönliche Seite #2021873
Lesenswert?

Ich kenne mich mit PICs nicht aus. Aber PIC32 klingt nach nem 32 Bitter, 
wohingegen der hier verwendete AVR nur ein kleiner 8 Bitter ist und von 
der Rechenleistung her um einige Potenzen unter den 32 Bittern liegt.

Ansonsten ist der Umfang von dem was du vor hast abhängig davon, wieviel 
zu letztendlich selber machen willst.

Willst du einen eigenen TCP/IP Stack schreiben: Nimm dir Zeit! ;-) 
Willst du nur den Webserver schreiben, das könnte eventuell hinhauen. 
Aber dafür musst du auch erstmal deine Plattform ans laufen bringen.

Ob 32 Bitter oder 8 Bitter hängt schlussendlich von der benötigten 
Performance ab. Für ein paar Relais über ein Webinterface (und evtl. 
noch UDP) zu schalten reicht ein 8 Bitter mit abgespecktem TCP/IP Stack. 
Für komplexere Sachen (Übertragung von großen Dateien z.B.) musst du 
beim Speicher und bei der Rechenleistung aufstocken.
Gast #2172943
Lesenswert?

@ Simon

Ist in deinem Sourcecode schon die Abfrage auf ein MagicPaket des Wake 
on Lan implementiert?

Bzw was muss ich beim ENC und im ATmega ändern das ich einen GPIO 
geschaltet bekomme wenn ein MagicPaket kommt?
#2172972
Lesenswert?

Thomas schrieb:

> Ich verwende gerade das PIC32 Ethernet Starterkit als Hardwareplattform
> bei meiner Diplomarbeit. Ich soll eine Testplatine entwickeln, mit der
> ich mehrere Steckkarten a 32* 24V-Relais ansteuere. Warum PIC32? Wurde
> mir auf den Tisch gelegt. (Jetzt spiele ich mit dem Gedanken auf Atmel
> um´zusteigen:-))

> Ich habe hier leider nach Tagelangem suchen keine richtigen Beiträge in
> Foren gefunden.

Brauchst Du eigentlich auch nicht. Bei Microchip gibts alles, was Du 
brauchst. Versuche erstmal, die TCP/IP Demo Application zu übersetzen. 
Das sollte so auf Anhieb funktionieren. Wenn Du Den C32 1.12 hast, musst 
Du irgendwo eine Funktion auskommentieren, die der Compiler in der neuen 
Version schon eingebaut hat (ultoa), aber das siehst Du dann schon.

Wenn das läuft, dann kannst Du weitermachen und das Zeugs an Deine 
Bedürfnisse anpassen.

Solltest Du Probleme mit dem On-Board JTAG Debugger haben, lass den sein 
und klemm einfach extern ein ICD3 oder ein PicKIT3 an.

Und der richtige Ort für Fragen sind die Microchip-Foren. Da lesen auch 
Microchip-Leute, und die antworten auch.

> Würdet ihr mir dazu raten??

Nein.
1. Andere Plattform - andere Probleme.
2. Später im Job kannst Du das auch nicht einfach so machen.
3. Die Informationen, die Du brauchst, sind alle auf der Webseite von 
Microchip verfügbar. Als fertiger Ing. wird von Dir erwartet, dass Du 
Dir eigenständig Informationen besorgen und konsumieren kannst, auch 
wenn alls nur auf Englisch ist. Das hast Du zu können, ansonsten hast Du 
Dein Diplom nicht verdient.

fchk
#2371512
Lesenswert?

OK, Danke.

Ich habe den Code auf einen STM32 mit ENC28J60 portiert. Es fängt auch 
an zu funktionieren. Leider nicht stabil. Ich kann mit dem Browser unter 
der IP die Seite einige male abrufen, dann hängt sich das System auf. 
Manchmal geht es auch nur 1 mal. Dann kommt keine Antwort mehr. Es geht 
im Browser überhaupt nur, wenn ich nach der IP noch :8080 anfüge.

Ebenso beim Ping, klappt mal, mal nicht.

Im Prinzip habe ich nur die SPI Routinen an dem STM32 angepasst und 
alles was mit der AVR Progmem-Spezifik zu tun hat rausgenommen.

Wo soll ich anfangen zu suchen?
#2372751
Lesenswert?

Als Anhang ein Dump. 192.168.2.29 ist der ENC/STM32 Server.

Bis zu Eintrag 55 geht der funktionierende http Abruf unmittelbar nach 
Reset der Schaltung. Dann folgt der 2. Aufruf der IP, wo keine 
Verbindung mehr zu Stande kommt. Browser meldet nach einer Weile 
Zeitüberschreitung. Ping geht dann auch nicht mehr. (Manchmal geht der 
Aufruf auch mehremals hintereinander gut.)

Das µC System hängt sich dabei offensichtlich nicht auf. Andere 
Funktionen gehen noch. Es gibt auch keinen Hardfault-Error, was auf 
einen Zugriff auf ungenehmigten Speicher hindeuten könnte. Ein 
Bufferüberlauf könnte es trotzdem sein.

Hier mein main-loop:
1
 while (1) {
2
  if (keypressed()) clear_tft(BLACK);        // TFT löschen
3
    uip_len = Enc28j60Receive(uip_buf);
4
    if (uip_len> 0) {
5
      if (((struct uip_eth_hdr *)&uip_buf[0])->type == htons(UIP_ETHTYPE_IP)) {
6
        // uip_arp_ipin();
7
        sprintf(tft.buffer,"LAN UIP_ETHTYP_IP: %d",UIP_ETHTYPE_IP);
8
      printf_tft(1,90,tft.buffer);
9
        uip_input();
10
        if (uip_len > 0) {
11
          sprintf(tft.buffer,"LAN uip_len=%d (%d)",uip_len, temp1); temp1++;
12
         printf_tft(1,105,tft.buffer);
13
          uip_arp_out();
14
          uip_split_output();
15
        }
16
      } else if (((struct uip_eth_hdr *)&uip_buf[0])->type == htons(UIP_ETHTYPE_ARP)) {
17
        uip_arp_arpin();
18
        if (uip_len> 0) {
19
          uip_split_output();
20
        }
21
      }
22
    }
23
  if (g_nFlags.fPeriodic) {
24
    printf_tft(1,120,"Periodic             ");
25
    // cli();
26
      g_nFlags.fPeriodic = 0;
27
      // sei();
28
      int i= UIP_CONNS;
29
      while (i) {
30
        i--;
31
        uip_periodic(i);
32
        if (uip_len> 0) {
33
          printf_tft(1,120,"Periodic-OUT");
34
          uip_arp_out();
35
          uip_split_output();
36
        }
37
      }
38
      g_nPrescaler--;
39
      if (g_nPrescaler == 0) {
40
        //Every 10 seconds
41
        printf_tft(1,120,"Periodic 0");
42
        uip_arp_timer();
43
        g_nPrescaler = 100;
44
      }
45
    }
46
  }
Angehängte Dateien:
(Firma: privat) #3277344
Lesenswert?

Hallo!

Die Schaltung ist mit wenigen Worten beschrieben:

- PIC18F4585 oder ähnlich mit internem Takt

- Das Breakout-Board:
http://www.ebay.de/itm/ENC28J60-Ethernet-LAN-Netzwerk-Modul-Arduino-RJ45-SPI-mit-Befestigungsbohrungen-/121158045138

CS auf  A3
SI auf C5 (SDO)
SO auf B4 (SDI)
SCK auf C3 (SCK)
RES auf B4

Den ENC28J60 über einen 3,3 V Regler versorgen.

In den Sourcen bitte usb.c (Hab noch einen UM245 zum loggen dran) und 
die printf's löschen, ist noch eine Testversion.

Compiler: C18 und MPLAB 8.91. Auf die Sourcen erhebe ich keine 
Ansprüche, ich habe es ja nur portiert.

vg

Jürgen
Angehängte Dateien:
Gast #3467907
Lesenswert?

Ich bin zwar erst bei ca 40% des Threads, aber gibt es irgendwo noch den 
original Code des Programms das darauf lief ? oder ist das uIP ? Und was 
wurde aus klinkerstein.de ?

Dieser Webserver scheint eine alternative zu dem CrumbX1-NET zu sein, 
der mir letztens abgeraucht ist. Und vor allem billiger ...
Leider war da das 'OS' schon drauf...
Gast #3770242
Lesenswert?

Hallo zusammen

Weiß jemand was ich in der Software ändern muss, dass bei Empfang des 
MagicPaket (WoL) ein Port geschaltet wird...an dem ein Relais hängt?
Will damit eine externes Gerät per WoL starten.

Danke, euch.
Gast #4263293
Lesenswert?

Hallo,

ich verwende den Uip stack und tcp funktioniert wunderbar, kann neben 
http auch noch über andere ports daten senden und empfangen.
Nun möchte ich, da ich mehrere dieser Webserver habe, von meinem Qt 
Programm einen UDP Broadcast aussenden, sodass sich die Webserver beim 
Qt Programm melden...
soweit sogut udp apphub ist schließlich vorhanden.
Qt Applikation sendet brav UDP Broadcasts aus (Wireshark)..

Leider kommt am Webserver nichts an..


hier mein verwendeter code am Webserver:
1
#define BROADCASTPORT 65535
2
void uip_UdpAppHubCall(void)
3
{
4
  printf_P(PSTR("UDP Call!\n"));
5
  switch(uip_udp_conn->lport){
6
    case HTONS(BROADCASTPORT): printf_P(PSTR("Broadcast received!\n")); 
7
    printf("Remote address:%d%d\n",uip_udp_conn->ripaddr[0],uip_udp_conn->ripaddr[1]);
8
    //uip_connect(uip_udp_conn->ripaddr,HTONS())
9
    break;
10
    default: printf_P(PSTR("undefined UDP packet on PORT:"));printf("%d",uip_udp_conn->lport);printf_P(PSTR(" received!\n")); break;
11
  }
12
  printf_P(PSTR("undefined UDP Call!\n"));  
13
}
14

15
void uip_UdpAppHubInit(void)
16
{
17
  uip_ipaddr_t addr;
18

19
  uip_ipaddr(&addr, 10,0,0,230);
20
  c = uip_udp_new(&addr, HTONS(BROADCASTPORT));
21
  uip_udp_bind(c, HTONS(BROADCASTPORT));
22
  
23
  printf_P(PSTR("UDP init! Listen on Port:65535\n"));
24
}


in der uipopt.h

sind natürlich alle UDP optionen aktiviert:
1
#define UIP_UDP           1
2

3

4
#define UIP_UDP_CHECKSUMS 1
5

6

7
#define UIP_UDP_CONNS    3
8

9

10
#define UIP_ACTIVE_OPEN 1
11
#define UIP_CONNS       4
12
#define UIP_LISTENPORTS 5


abgesehen vom Empfangen von Broadcast Nachrichten, erhalte ich auch 
leider keine NichtBroadcast Pakete...

Sieht jemand meinen Fehler, bin mittlerweile etwas ratlos...
(Firma: figlux electronix) #4263534
Lesenswert?

also config vom uip stack sieht wie folg aus:
1
void init_uip_user(void){
2
        uip_ipaddr_t IpAddr;
3
        uip_ipaddr(IpAddr, 10, 0, 0, 230);
4
        //uip_ipaddr(IpAddr, 192, 168, 77, 78);
5
        uip_sethostaddr(IpAddr);
6
        uip_ipaddr(IpAddr, 10, 0, 0, 138);
7
        //uip_ipaddr(IpAddr, 192, 168, 77, 77);
8
        uip_setdraddr(IpAddr);
9
        uip_ipaddr(IpAddr, 255, 255, 255, 0);
10
        uip_setnetmask(IpAddr);
11
    }

broadcasts sende ich vom qt aus via:
1
void MainWindow::on_BroadcastTimeOut(void){
2
    if(ui->gb_onlineDevs->isVisible()){
3
        broadcaster->writeDatagram("ON?",QHostAddress::Broadcast,BROADCASTPORT);
4
        qDebug() << "Write Udp Broadcast!";
5
    }
6
}
diese funktion rufe ich periodisch auf.

und ipconfig von meinem Notebook:
ip:10.0.0.xx
sub:255.255.255.0
gw:10.0.0.138


Zu deiner Frage:
ich verwende:
1
QHostAddress::Broadcast
lauf QT doku:

QHostAddress::Broadcast  1  The IPv4 broadcast address. Equivalent to 
QHostAddress("255.255.255.255").

Btw:
warum kann ich von meinem Notebook unangemeldet hier posten und von 
meinem PC aus nur angemeldet, egal welcher browser?^^
Gast #4263576
Lesenswert?

Also 2 verschiedene Netze so wie es scheint.

Ein Broadcast bleibt im Normalfall immer in dem eigenen Netz, wo er 
losgeschickt wird.

Bei Deinem Notebook mit der Maske 255.255.255.0 geht der also auf die 
10.0.0.255 als Ziel.
(Firma: figlux electronix) #4263587
Lesenswert?

Hallo,

aber mein uip Webserver ist auch im selben Netz:
1
       uip_ipaddr(IpAddr, 10, 0, 0, 230);
2
        uip_sethostaddr(IpAddr);
3
        uip_ipaddr(IpAddr, 10, 0, 0, 138);
4
        uip_setdraddr(IpAddr);
5
        uip_ipaddr(IpAddr, 255, 255, 255, 0);

Oder übersehe ich da etwas?
#4316774
Lesenswert?

Hi,

ich habe jetzt in der Main.c die Schleife für das abschalten eingefügt:
1
  if (g_nPrescaler == 0)
2
  {
3
           //Every 10 seconds
4
    uip_arp_timer();
5
    g_nPrescaler = 100;
6
          
7
    //Automatisches ausschalten der Ports nach 10 Sekunden
8
    uint8_t i;
9
    for (i=0; i<8; i++)
10
    {
11
      GpioSetPort(i, 0);
12
    }
13
  }

Das abschaltet funktioniert wie gewünscht. Nur wie teile ich das der 
Webseite nochmal mit? Wenn diese geöffnet ist, üßberträgt sie bei jedem 
"window.setInterval" erneut. Das submit() habe ich versuchsweise mal mit 
reset() getauscht aber dann lädt die Seite nicht mehr richtig und muss 
ebenfalls erneut aufgerufen werden.
Hat jemand ne Idee?
Gast #4492867
Lesenswert?

Hallo Liebes Forum,
Hallo Lieber Simon,

soeben bin ich auf diesen Webserver von Simon gestossen und wollte den 
gleich mal ausprobieren auf meinen Atmega8 16 DIP. Leider bekomme ich 
ein paar Fehler die mich seit ein paar Stunden aus den Konzept werfen.
Das ist einmal "unknown type name 'prog_void'" und einmal 'TIMSK1' 
undeclared(first use in this function). Da ja C Ansicode ist sollte das 
doch mit jeder IDE gehen wenn man das richtig kopiert. Ich denke auch 
nicht, dass es ein Codefehler ist sondern eher das es an der IDE liegt. 
Mit welcher IDE wurde das ursprünglich erstellt? Oder besser, hat jemand 
eine lauffähige Solution AtmelStudio 6 SP2 die er mir zu Verfügung 
stellen kann. Das wäre das allerbeste. Ich möchte den nur benutzen und 
die Webseite evlt. an meine Bedürfnisse anpassen. Daher wäre das eine 
sehr elegante Lösung. Danke für eure Mithilfe.

Liebe Grüße

Falkner
Gast #4494134
Lesenswert?

So heute endlich konnte ich das Projekt kompilieren. Für alle die das 
dann auch mal nachvollziehen wollen hier was ihr braucht:

Ich habe das jetzt auf WinXP SP3 unter VirtualBox auf einem Macbook Pro 
am laufen. Und es läuft stabil.

1. Diese IDE downloaden AVR Studio 4.13-528 (73 MB, updated 03/07): 
https://www.mikrocontroller.net/articles/Atmel_Studio

2. Nun braucht ihr den WinAVR der ist hier zu finden: 
https://sourceforge.net/projects/winavr/files/WinAVR/20100110/

3. Beides installieren

4. Jetzt könnt ihr das Projekt von Simon downloaden und mit der IDE 
öffnen:
http://de.klinkerstein.m-faq.de/index.php/MicroWebServer/Downloads

5. Ich benutze den myAVR light Pogrammer und für den gibt es das myAVR 
Prog Tool. Aufspielen auf den ATMEGA 168-20DIP und fertig.

Liebe Grüße

Falkner

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren