Forum: Mikrocontroller und Digitale Elektronik Interrupt gesteuertes empfangen von Netzwerkpaketen


von Christian (Gast)


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

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Christian schrieb:
> Bei PB2 als Ausgang bekomme ich dennoch keinen Interrupt vom ENC28J60
> mit.

Es gibt grössere Wunder...

von Christian (Gast)


Lesenswert?

Danke für die schnelle Antwort, da muss ich noch was nach lesen.

von Christian (Gast)


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.

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.