Webserver [Ulrich Radig] - bleibt hängen in eth_get_data

OP #2488790
Lesenswert?

Ich habe das Problem, dass die while(1) schleife bei mir nicht 
funktioniert.
Webserver läuft und ist problemlos zu erreichen. Anpingen geht auch.

In der While Schleife steht eth_get_data(); und alles was danach kommt 
wird nie erreicht. Er kommt nie aus eth_get_data heraus.

hier ist die eth_get_data Funktion (habe sie gekürzt, so dass nur der 
Code für den ENC28J60 drinne steht:

void eth_get_data (void)
{
  if(eth.timer)
  {
    tcp_timer_call();
    arp_timer_call();
    eth.timer = 0;
  }
  if(eth.data_present)
  {
    while(ETH_INT_ACTIVE)
    {
        unsigned int packet_length;

        packet_length = ETH_PACKET_RECEIVE(MTU_SIZE,eth_buffer);
        if(packet_length > 0)
        {
          eth_buffer[packet_length+1] = 0;
          check_packet();
        }
    eth.data_present = 0;
    ETH_INT_ENABLE;
  }
  return;
}

Warum genau verlässt er diese Funktion nicht?
OP #2494190
Lesenswert?

So neues Problem,

Webserver läuft die meiste Zeit ohen Probleme. Manchmal aber scheint er 
abzuschmieren.... warum auch immer. Ping geht dann ganz normal aber die 
Website kann ich nicht mehr aufrufen im Browser steht dann immer sowas 
wie warten auf [IP-ADDRESSE] ...

Manchmal lädt er die Webpage auch nur zur hälfte und braucht dafür 
ewigkeiten.

Was kann das sein?
Gast #2494285
Lesenswert?

Schau dir mal die Pegel an der SPI an. MISO braucht einen Pullup, sonst 
liefert der mit 3,3V betriebene ENC28J60 nicht genug Pegel. Entweder 
einen 10k-Widerstand dranlöten oder den internen Pullup im ATmega 
benutzen. Dazu muss in der Funktion spi_init der Pin MISO auf high 
gesetzt werden (obwohl das ein Eingang ist).
OP #2494447
Lesenswert?

Danke für deinen Beitrag,

Die FUnktion sieht so aus:

static inline void spi_init(void)
{
  // configure pins MOSI, SCK as output
  SPI_DDR |= (1<<SPI_MOSI) | (1<<SPI_SCK);
  // pull SCK high
  SPI_PORT |= (1<<SPI_SCK);

  // configure pin MISO as input
  SPI_DDR &= ~(1<<SPI_MISO);
  SPI_DDR |= (1<<SPI_SS);

  //SPI: enable, master, positive clock phase, msb first, SPI speed 
fosc/2
  SPCR = (1<<SPE) | (1<<MSTR);
  SPSR = (1<<SPI2X);

  usdelay(10000);
}

Was muss ich genau ändern um das umzuschalten?

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