Forum: Mikrocontroller und Digitale Elektronik Atmega16M1 CAN Bus OFF herausfinden


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Program (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich nutze einen Atmega16M1. Zumeist verwendet ich CAN. Es kann aber auch 
sein, dass ein Knoten getrennt wird, seine Arbeit aber weiter verrichten 
soll.

Dh. der Knoten ist vom Bus getrennt, es kann aber sein, dass er versucht 
Nachrichten auf den Bus zu schicken. Wenn er dies tut, bleibt er hängen. 
Sobald ich den Bus wieder verbinde geht es weiter.

Nun ist meine Frage, wie kann ich erkennen, ob der Bus gerade OFF ist, 
sodass erst garnicht versucht wird, eine Nachricht zu senden.

Im Register CANGSTA gibt es das BOFF Bit. Wenn ich aber vor senden 
folgendes prüfe:
if (CANGSTA & ( 1 << BOFF) == 0 {
// senden
}

Versucht er trotzdem zu senden. Merkt er erst das der Bus off ist, wenn 
er versucht hat zu senden? Wie kann ich hier rangehen um mein Problem zu 
lösen?

von Program (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt eingestellt, dass der BUSSOFF Interrupt EN ist.
CANGIE = ( 1 << ENIT ) | (1 << ENBOFF) | ( 1 << ENRX );

Und die ISR sieht so aus:
1
ISR (CAN_INT_vect) {
2
3
    // if (CANGIT & (1 << CANIT)) {
4
        // PORTB |= (1 << PORTB6);
5
    // }
6
    if(CANGIT & (1 << BOFFIT)) {
7
        CANGIT |= (1 << BOFFIT);
8
        PORTB |= (1 << PORTB6);
9
    }
10
    else if (CANGSTA & (1 << BOFF)) {
11
        PORTB |= (1 << PORTB6);
12
    }
13
    else if (CANGSTA & (1 << ERRP)) {
14
        PORTB |= (1 << PORTB6);
15
    } else {
16
          // senden  
17
    }
18
}

An PB6 ist eine LED. Trenne ich das Gerät vom Bus, geht die LED aber 
nicht an. (LED funktioniert im sonstigen Programmablauf)

von Harald (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Program schrieb:
> Trenne ich das Gerät vom Bus, geht die LED aber
> nicht an.

BUS-OFF bedeutet nicht, dass das Gerät einfach nur getrennt ist. Es 
bedeutet, dass der CAN-Controller nach x Fehlern nicht mehr am Bus 
teilnimmt. Siehe auch zig Seiten mit CAN Grundlagen im Netz.

von Program (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich den verhindern, dass mein Gerät versucht zu senden, obwohl 
es vom Bus getrennt ist. Oder ist das einfach nicht vorgesehen?

von Rudolph (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Lass ihn doch versuchen zu senden, stört doch nicht weiter.
Nur hängen bleiben muss die Software dabei natürlich auch nicht.
1
CANPAGE = (1<<4); // select MOB1
2
if(CANSTMOB & (1<<TXOK)) // fertig mit Senden?
3
{
4
  CANSTMOB &= ~(1<<TXOK); // reset flag
5
6
  CANMSG = 42;
7
  CANMSG = can_counter++;
8
  CANCDMOB |= (1<<CONMOB0); // Transfer einleiten
9
}

Das kann man so oft aufrufen wie man will, ob der CAN nun angeschlossen 
ist oder nicht.

Was man da drüber und drum herum natürlich noch machen kann ist zum 
Beispiel mit einem Timeout den CAN-Controller zu resetten.

von Harald (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Program schrieb:
> Wie kann ich den verhindern, dass mein Gerät versucht zu senden, obwohl
> es vom Bus getrennt ist. Oder ist das einfach nicht vorgesehen?

Ist nicht so richtig vorgesehen.

Wenn es aus Sicht des Systems ein Slave ist, könnte man mit dem Senden 
solange warten bis man dazu aufgefordert wird. Wenn man im Livebetrieb 
unterbricht gibt es halt für den Slave einen BUS-OFF - ist das schlimm? 
Ich denke nicht. Dann weiß der Knoten ja, dass da etwas faul ist und 
sich per LED oder sonstwie bemerkbar machen.

Der Kommunikationsmaster muss natürlich als Erster senden und würde 
einen BUS-OFF hinlegen wenn keiner zuhört. Das ist dann aber ja 
gewissermaßen richtig. Auch hier wäre eine Fehleranzeige angebracht.

von Rudolph (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Oh ja, Tipp, ich habe zwar lange den ATMega16M1 benutzt, bin aber wegen 
CAN-FD auf die ATSAMC21 / ATSAME51 umgestiegen.
Der ATSAMC21E18A-AU ist im gleichen Gehäuse wie der ATMega16M1-AU, 
kostet dabei aber weniger, läuft auch bei 5V, hat 256k FLASH, 48MHz und 
Peripherie ohne Ende.

von Harald (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rudolph schrieb:
> Der ATSAMC21E18A-AU

Interessantes Teil, wie wird denn der programmiert? Habe gerade mal das 
Datasheet quergelesen, konnte mal eben schnell nichts finden.

von Rudolph (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Der hat SWD, dafür benutze ich die "SAM" Seite von dem Atmel ICE.
Oder einen JLink Edu Mini wenn ich den ATSAM mit 3,3V betreibe.

Im Kapitel 50.8.1 ist das zu sehen.

von Tilo R. (joey5337) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Nochmal zum nicht funktionierenden Bus:
Wenn es keinen Bus gibt (oder auch keinen anderen Busteilnhemer, der am 
Ende die CAN-Nachricht bestätigt), dann gibt es für diese Nachricht kein 
TXOK.
Das MOB wird damit auch nicht wieder frei zum Verschicken weiterer 
Nachrichten.
Ich vermute, dass dein Code bei der Suche nach einem freien MOB hängen 
bleibt. Oder kurz danach, wenn keines gefunden wurde.

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]
  • [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.