Interrupt gesteuertes empfangen von Netzwerkpaketen

Gast #3656592
Lesenswert?
• ▲
▼
Hallo Leute,

bin am Entwickeln eines eigenen Netzwerkdienstes auf dem AVR-NET-IO 
Board.
Auf dem Board ist der ATmega32 µC und der ENC28J60 Netzwerkcontroller 
verbaut. Für die Kommunikation mit dem ENC28J60 Controller verwende ich 
den ENC28J60 Treiber Version 2007'0819 vom Simon Schulz.

Das Senden von Frames klappt wunderbar, werden vom PC empfangen.
Das Empfangen von den Frames funktioniert nicht ganz.

Das Problem hab ich auf die Interruptleitung zwischen den zwei 
Controllern eingrenzen können.

Im ENC28J60 wurde der Empfangsinterrupt aktiviert mit setzen von 
EIE.INTIE = 1 und EIE.PKTIE = 1.

Beim ATmega32 ist die Leitung an den Pin PB2 (INT2) angeschlossen.

Hab im Programm DDRB bei PB2 auf Ausgang gesetzt und zum testen PORTB 
bei PB2 auf 1 bzw. 0 gesetzt. Interrupt wurde aktiviert und die Routine 
programmiert.
Zum manuellen testen des Interrupts hab ich die Leitung abgegriffen und 
über ein Taster auf GND geführt. Die Routine wurde korrekt ausgeführt.
Bei PB2 als Ausgang bekomme ich dennoch keinen Interrupt vom ENC28J60 
mit.

Wenn ich den PB2 auf Eingang schalte bekomme ich die Interrupts vom 
ENC28J60 mit solange ich keinen Frame senden möchte, wenn ich dann einen 
Frame gesendet hab geht die Interruptleitung von high auf low und 
bekomme keinen Interrupt mehr mit.

Dank schon mal für die Hilfe

Gruß
Christian
#3656600
Lesenswert?
• ▲
▼
Christian schrieb:

> Hab im Programm DDRB bei PB2 auf Ausgang

Ausgang?

DIe Datenrichtung ist: vom ENC28J60 zum AtMega32. PB2 muss also Eingang 
sein.


> Wenn ich den PB2 auf Eingang schalte bekomme ich die Interrupts vom
> ENC28J60 mit solange ich keinen Frame senden möchte, wenn ich dann einen
> Frame gesendet hab geht die Interruptleitung von high auf low und
> bekomme keinen Interrupt mehr mit.

Hast du schon mal das Datenblatt zum ENC28J60 studiert?
Im Abschnitt 12.0 'Interrupts'
1
When an enabled interrupt occurs, the interrupt pin will
2
remain low until all flags which are causing the interrupt
3
are cleared or masked off (enable bit is cleared) by the
4
host controller.

Hast du das gemacht? Bzw. hast du mal nachgesehen, was du mittels
> EIE.INTIE = 1 und EIE.PKTIE = 1.
alles freigegeben hast?

Lies in der ISR vom Mega32 ESTATE und EIR aus und sieh nach, was der 
ENC28J60 von dir will. Danach löscht du die Bits im ENC28J60.
Gast #3660742
Lesenswert?
• ▲
▼
Hab den Fehler gefunden.
Der Fehler war, dass ich nicht alle Interrupt vom ENC28J60 abgearbeitet 
hab. Da die Interruptroutine für den Timer abgearbeitet wurde.

Bin jetzt am überlegen wie ich es am schönsten und performanentesten 
hinbekomme möglichst viele Frames zeitnah abzuarbeiten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.