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

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