Forum: Mikrocontroller und Digitale Elektronik can sendevorgang abbrechen


von Johannes (Gast)


Lesenswert?

Hallo,
ich überfrüfe mit CAN, ob alle anderen Teilnehmer noch da sind. das 
heisst, ich frage nach und die antworten. dazu habe ich zwei Boards mit 
denen ihc das ausprobieren kann (Board A fragt nach, Board B antwortet). 
zur besseren Übersicht, lasse ich eine LED während des sendevorganges 
aufleuchten. Wenn ich jetzt allerdings den stecker von Board B 
herausziehe, kann dieser ja nicht mehr empfangen und auch nicht mehr 
senden. die LED von Board A leuchtet dann aber dauerhaft. Also schickt 
der die Nachricht ja gar nicht auf dem Bus drauf.
kann man das irgendwie ändern, dass er nach einer gewissen Zeit 
abbricht?
1
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
2
{
3
    LATBbits.LATB0 = 1; // Turn on LED D3
4
    C1TX0B1 = 0x0001; // data - attendance check
5
    C1TX0CONbits.TXREQ = 1; //Start to send
6
    while (C1TX0CONbits.TXREQ == 1) {} //TXREQ reset automatically, when the transmission completes
7
    LATBbits.LATB0 = 0; // Turn off LED D3
8
    IFS0bits.T1IF = 0;  // Clear Timer 1 interrupt flag
9
}

von Pandur S. (jetztnicht)


Lesenswert?

Ich wuerde annehmen, der Treiber macht eh einen Fehler, wenn nichts 
zurueck kommt. Was soll das Prozedere denn ?

von Johannes (Gast)


Lesenswert?

Ahso, ok.
danke schön

von Martin L. (maveric00)


Lesenswert?

Hallo,

wenn kein weiterer Teilnehmer auf dem Bus ist (also niemand da ist, der 
eine gesendete Botschaft mit ACK quittiert), dann versucht der Sender in 
der Regel, die Nachricht noch einmal zu senden. Je nach Konfiguration 
auch öfter, wobei am Ende der Sender in einen Error-Mode geht, weswegen 
er beim senden "hängen" bleiben kann (TXREQ wird nicht zurückgesetzt, 
sondern das entsprechende Fehlerflag gesetzt).

Allerdings wird das ACK von jedem Busteilnehmer aufgelegt, der einen 
korrekten CAN-Frame erkennt, also auch von Teilnehmern, die nicht 
unbedingt Ziel der Nachricht waren. Wenn man also erkennen möchte, ob 
wirklich noch alle Teilnehmer zuhören, muss man entweder diese zyklisch 
senden lassen (und dann über einen Time-Out erkennen, dass die 
Nachrichten nicht mehr gesendet werden) oder sie aber einzeln abfragen.

Dabei sollten aber zusätzlich noch die verschiedenen Fehlerflags beim 
Sender abgeprüft werden, um das beobachtete "Hängen" zu vermeiden. Die 
abgefragten Empfänger müssen dann ihre Anwesenheit durch eine 
Rückantwort kundtun, wobei der Sender Buch führen muss, wer schon 
geantwortet hat.

Schöne Grüße,
Martin

von Pandur S. (jetztnicht)


Lesenswert?

Also koennte man die Feststellung, dass ein Teilnehmer fehlt bei 
schwacher Buslast durch zyklisches Pollen verschnellern. Und dabei das 
Timeout auf Minimum setzen, und Repeat=0.

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.