mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CAN mit ATMega128 und MCP2515


Autor: Wolf41244 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
  }

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: Wolf41244 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.