Forum: Mikrocontroller und Digitale Elektronik Webserver [Ulrich Radig] - bleibt hängen in eth_get_data


von André R. (andr_r23)


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?

von LuXXuS (Gast)


Lesenswert?

Was ist die Definition ETH_INT_ACTIVE?

von André R. (andr_r23)


Lesenswert?

#define ENC_PIN                 PINB
  #define ENC_INT                 1
  #define ETH_INT_ACTIVE          (!(ENC_PIN & (1<<ENC_INT)))

von André R. (andr_r23)


Lesenswert?

Es ist gut möglich das es was mit dem INT zu tun hat. Wenn ich das Kabel 
abziehe funktioniert der Webserver noch ganz normal weiter ka ob das 
Sinn hat .

Hab leider zu wenig AHnung von sowas:(

von holger (Gast)


Lesenswert?

Wieso benutzt du PB1? Der Original Code nimmt
PB2 / INT2.

von André R. (andr_r23)


Lesenswert?

Das wars wohl :-( Mit Int 2 gehts .......

Danke!!

von André R. (andr_r23)


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?

von Oliver (Gast)


Lesenswert?

André R. schrieb:
> Was kann das sein?

Das ist ein schwierig zu debuggendes Problem ;)

Oliver

von Osche R. (Gast)


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

von André R. (andr_r23)


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?

von Mat (Gast)


Lesenswert?

1
// configure pin MISO as input
2
  SPI_DDR &= ~(1<<SPI_MISO);
3
  SPI_PORT |= (1<<SPI_MISO);
4
  SPI_DDR |= (1<<SPI_SS);
lg Mat

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.