CAN: Latentzeit messen!

Gast #660229
Lesenswert?

Hallo, ich habe bereits mit einem Mikrocontroller, der mit einer 
CAN-Schnittstelle ausgestattet ist, die Latenzeit mal mit einem Oszi 
gemessen. Wenn eine bestimmt CAN-Nachricht eintrifft, dann wurde am Pin 
von einem Port X auf +5V gezogen und anschließend gleich wieder auf 0V.
Was mir dabei aufgefallen ist, dass der Pin nicht erst nach dem Ende der 
CAN-Nachricht auf +5V gezogen wurde, sondern ziemlich am Anfang der 
CAN-Nachricht.
                       ____________________ 
______________
CAN-Nachricht:_______|  -                    |______________|   _
Portpin:      _________| |_____________________________________| 
|___________


Warum ist der kurze Impuls vom Portpin nicht nach dem Ende der 
CAN-Nachricht zu sehen?

Hat sich schon jemand mit der Latenzeitmessung auf einem 
Mikrocontrollersystem befasst?
Gast #660245
Lesenswert?

Die Übertragungsrate steht bei mir auf 100kBaud fest. Die 
CAN-Nachrichten sende ich von einem PC aus. Alle 200ms wird eine 
CAN-Nachricht vom PC an den Mikrocontroller gesendet. Der Zeitabstand 
zwischen Anfang von der CAN-Nachricht und dem Portpin liegt in etwa im 
Mikrosekundenbereich.
#660264
Lesenswert?

Anzahl Bits im CAN-Frame zählen. Multipliziert mit der Dauer eines Bits 
und ein paar Prozent Stopfbits obendrauf ergibt das die zu erwartende 
Länge des Frames.

Dauert der angezeigte Frame erheblich länger, dann ist das nicht 1 Frame 
sondern mehere. Warum auch immer (z.B. Error-Frame).
Gast #660521
Lesenswert?

Der Begriff Latentzeit stimmt doch nicht oder? Es müsste Latenzzeit 
heissen.
Stimmt dies?

>>Anzahl Bits im CAN-Frame zählen. Multipliziert mit der Dauer eines Bits
>>und ein paar Prozent Stopfbits obendrauf ergibt das die zu erwartende
>>Länge des Frames.

Muss ich da die komplette Zeit vom CAN-Frame überprüfen?

Hat hier jemand schon mal so eine Zeitmessung durchgeführt?
Gast #660593
Lesenswert?

Der Begriff Latentzeit stimmt doch nicht oder? Es müsste Latenzzeit
heissen.
Stimmt dies?

>>Anzahl Bits im CAN-Frame zählen. Multipliziert mit der Dauer eines Bits
>>und ein paar Prozent Stopfbits obendrauf ergibt das die zu erwartende
>>Länge des Frames.

Muss ich da die komplette Zeit vom CAN-Frame überprüfen?

Hat hier jemand schon mal so eine Zeitmessung durchgeführt?
Gast #661150
Lesenswert?

Guten Morgen,

so nun habe ich eine Oszi. Mit dem Oszi habe ich soeben festgestellt, 
dass die Telegrammlänge (ganze CAN-Nachricht) insgesamt 1ms lang ist.
Die Baudrate steht bei mir aug 100kBaud und die CAN-Nachricht wird alle 
200ms von dem PC aus zu dem Mikrocontroller gesendet. Ich komme nie auf 
die 100kBaud.
Gast #661166
Lesenswert?

Mit dem Oszi habe ich nun beobachtet, dass die Latenzzeit zwischen Ende 
des CAN-Telegramms und +5V Anstieg des Portpins ca. 27ms beträgt.
Das ist doch nocht akzeptabel oder? Ich muss dazu sagen dass ich dazu 
keinen Interrupt verwende, sondern das Empfangen der CAn-Telegramme 
erfolgt in dem Hauptprogramm in der while(1) Schleife.
#661176
Lesenswert?

> so nun habe ich eine Oszi. Mit dem Oszi habe ich soeben festgestellt,
> dass die Telegrammlänge (ganze CAN-Nachricht) insgesamt 1ms lang ist.

Das wären dann bei 100Kbps ungefähr 100 Bits inkl. Stopfbits. Wäre 
möglich, aber die zu erwartende Länge kann ich nicht erraten. die Bits 
musst du schon selber zählen.
Gast #661182
Lesenswert?

>>Ähhm - fing dein Problem nicht umgekehrt an? Mit einer negativen
>>Latenzzeit? Oder war die so gross, dass sie zufällig schon in den
>>nächsten Frame reinfiel?

Ja du hast recht. Ich hab am falschen CAN Anschluss gemessen.
#661216
Lesenswert?

Dann passt das doch. 500µs bei 100Kbps sind 50 Bits. Ein kompletter 
11bit Frame mit 8 Bytes liegt bei grob 100. Sehe ich das richtig: Ein 
500µs Frame hat hintenweg nochmal 180µs Latenz drin. Das ist das doch 
ganz ordentlich. Hast du eigentlich überhaupt noch ein Problem?
Gast #661245
Lesenswert?

Naja, dann ist das schon korrekt so.
Noch ein Problem habe ich:

In der while(1) Schleife ist die Latenzzeit zwischen Ende CAN-Telegramm 
und +5V Anstieg des Portpins 27ms groß.
Wenn ich das ganze in einer Interruptroutine packe, dann ist die 
Latenzzeit wesentlich kürzer und liegt bei ca. 180us bzw. 200us.
Warum ist die while(1) Schleife zu zeitlastig?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren