Forum: Mikrocontroller und Digitale Elektronik CAN mit ATMega128 und MCP2515


von Wolf41244 (Gast)


Lesenswert?

Hallo

ich habe Probleme mit meinem ATMega128 und dem CAN-Controller MCP2515.
Ich kann CAN-Nachrichten senden und empfangen.
Eingehende Nachrichten werden mit einem Interrupt des MCP2515 dem
ATMega signalisiert. Interrupt extern 3 auf dem Mega.
Habe nun aber ds Problem, das der Mega sich aufhängt und nicht einmal
mit dem Watchdog wieder auf die Beine kommt.
In desem Zustand ist die Interruptleitung low. Habe auf der Leitung
10kOhm auf VCC drin.
Die Resetleitung ist i.O.
Wenn ich nun die Interruptleitung unterbreche läuft der Mega ohne
Probleme. Mir ist aufgefallen, das die Interruptsignale relativ lange
auf low sind. Also keine Pulse. Eingestellt ist der MCP so, das er nur
Nachrichtenempfang anzeigt.
Hat jemand eine Idee, was ich falsch mache.

Gruß

von crazy horse (Gast)


Lesenswert?

das liegt an der Software! (wo ist sie denn?)
-status lesen
-id lesen
-length lesen
-entsprechende anzahl von Datenbytes abholen
-interrupt-flags löschen

ich vermute, du hast letzteres vergessen.
in der Art:
// Interrupt Flag löschen
  if (status & 0b01000000){      //Bit 6 set?
    mcp2515_bit_modify(CANINTF, (1<<RX0IF), 0);
  } else {
    mcp2515_bit_modify(CANINTF, (1<<RX1IF), 0);
  }

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Ich würde sagen, dass der externe Interrupt momentan auf den Lowpegel
reagiert und nicht auf die negative Flanke.
Bei der Einstellung auf den L-Pegel bleibt der Interrupt so lange
aktiv, wie er freigegeben ist. Der Controller springt also in die ISR,
bearbeitet sie und springt sofort nach Beendigung wieder in die ISR.

von crazy horse (Gast)


Lesenswert?

nene, pegelgesteuert ist schon richtig.
Und wenn der MCP gelesen und dessen Interruptanforderung zurückgesetzt
ist, nimmt der MCP auch den L-Pegel von der Leitung. Das passiert alles
noch in der ISR.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Warum sollte man es nicht per Flanke machen? Wegen Spikes? (Nur so
interessehalber)

von crazy horse (Gast)


Lesenswert?

damit du solche Spässchen wie hier auch erkennst :-)
Der MCP hat ja mehrere Interruptquellen, die alle auf einer Leitung
angezeigt werden. Und nur wenn die Anforderung richtig bearbeitet
wurde, kannst du die ISR auch verlassen.
Theoretisch ginge es auch flankengesteuert, gewinnen würdest du dabei
aber nichts.
Ausserdem funktionieren diverse Aufwachfunktionen nur mit
pegelgesteuertem Int, das habe ich schon mehrfach benutzt. Also Frage
andersrum: warum sollte man es per Flanke machen?

von Gast (Gast)


Lesenswert?

Pegelgesteuert ist schon richtig.
Denn tritt ein INT auf, springt der Pegel auf 0, du arbeitest ihn ab,
löschst das Flag, beendest die ISR. Das Flag vom INT wird gelöscht.
Ende. Das aber während deiner ISR nochmals ein anderer INT am MCP2510
aufgetreten ist, kriegste nicht mit. Genausowenig wie alle noch
kommenden INTs, da der MCP2510 den Pegel konstant unten hält (es steht
ja noch die Bearbeitung eines INTs aus)

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Danke! Den MCP2515 hatte ich damals nur durch Polling betrieben...
Wird wohl Zeit, das Ding mal wieder zum Leben zu erwecken...

von Wolf41244 (Gast)


Lesenswert?

Hallo zusammen,

ich habe noch ein bischen probiert und den "Hauptfehler" gefunden.
Habe auch mal auf Flanke gestellt gehabt, aber dann ging der CAN nicht
(wenn der MC doch mal hochgekommen ist).
Ich habe als erstes den MC initialsiert und den Interrupt freigegeben.
Danach die 6 Displays initialisiert usw.
Nach all dem Zeug habe ich den MCP resetet und eingestellt.
Das heist es verging schon eine ganze Zeit bis der MCP dran war.
Die ganze Zeit war auch der L-Pegel am Interrupt. Und deshalb habt ihr
recht, das er die meiste Zeit in der Interruptroutine verbracht hat.
Jetzt aktiviere ich das Globale Interruptflag erst nach dem Reset und
der initialsierung der ganzen Display und des MCP und er läuft.
Was ich aber nicht verstehe ist, das nach dem ersten Durchlauf der
Int.Routine der MCP nicht den Interrupt zurücknimmt.
Kann es sein, das beim MCP defaultmäßig noch ein andere Int-Quelle
aktiviert ist (Bufferüberlauf oder so)?

Gruß

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.