Forum: Mikrocontroller und Digitale Elektronik *CAN Baudrate Berechnung*


von Freddi (Gast)


Lesenswert?

Hi!

Weiss jemand woher ich ein Tool bekomme, womit ich die Baudrate für den
CAN (SJA1000) berechnen kann?


Gruß Freddi

von Freddi (Gast)


Lesenswert?

z.B. 250Kbit/s --> mit welchen Werten muss ich das Register BTR0 und
BTR1 laden (Taktfrequenz 8Mhz)?

von Rahul (Gast)


Lesenswert?

schade, ich hab mich nur mit MCP2515 beschäftigt...

von Freddi (Gast)


Lesenswert?

Was meinst du damit?
Hast du solch ein Tool?

von Rahul (Gast)


Lesenswert?

nee, aber es gibt hier im Forum ein Beitrag von Mike Schaub, wo er
seinen Quell-Code zur Verfügung stellt.
Darin werden auch die Zeiten bzw. Werte für eine 125kbps-Kommunikation
bei 16MHz beschrieben.
Arbeitet der SJA auch mit Zeitquanten? Vielleicht hilft dir der Code ja
etwas dabei. Es handelt sich beim MCP2515 (im Forum nach MCP oder 2515
suchen) und die CNF-Register.

Wenn ich die Zeit finde (ist gerde etwas knapp), kann ich mal gucken,
ob ich die Datenblätter dahingehend vergleichen kann.

Gruß Rahul

von Rahul (Gast)


Lesenswert?

relativ simpel...

Soweit ich es verstanden habe, genauso wie beim MCP2515:

Gegeben:
  Taktfrequenz: 8MHz => tCLK = 0,125µs
  CAN-Geschwindigkeit: 250kbps => Bitlänge = 4µs

Laut Datenblatt (Kapitel 6.5.2.2) setzt sich ein Bit aus folgenden
Segmenten zusammen:


SyncSeg    1 tSCL
tSeg1   1-16 tSCL
tSeg2   1- 8 tSCL

Somit mein Vorschlag:
BRP = 1 (Takteilung durch 2, dadurch insgesamt 16 verfügbare Segmente
im Bit)
SyncSeg = 1 tSCL (fest)
tSeg1   = 9 tSCL
tSeg2   = 6 tSCL
----------------
         16 tSCL
         =======
Somit müsste BTR1 = 0x58 und BTR0 = 0x00.

Müsste so funktionieren... Garantieren kann ich es dir nicht. Meiner
läuft bis jetzt auch noch nicht (bisher nur die Parameter berechnet und
die Ansteuerung in C realisiert).
Gruß
Rahul

von Dirk B (Gast)


Lesenswert?

Ich habs mir jetzt nicht ganz genau angeschaut, aber hier könnte was
dabei sein:

http://www.port.de/deutsch/canprod/content/sv_req_form.html

http://www.esacademy.com/faq/calc/sja1000.htm

von tüddel (Gast)


Lesenswert?

@Rahul

ist es vielleicht möglich einblick in deine codes vom mcp2515 / 2510 zu
bekommen? ich versuche mich auch gerade mit ihm.

mfg
tüddel

von Rahul (Gast)


Lesenswert?

Bis jetzt habe ich nur den Code von Mike Schaub
(http://www.mikrocontroller.net/forum/read-2-137064.html)  quasi
aktualisiert, und bin gerade am Testen (und auf der Suche nach nem
Oszi...).

Gruß Rahul

von Freddi (Gast)


Lesenswert?

Hallo Rahul!

Ich komme mit dieser Berechnung nicht klar.
Ich verstehe die Berechnung nicht.

SyncSeg    1 tSCL
tSeg1   1-16 tSCL
tSeg2   1- 8 tSCL

Somit mein Vorschlag:
BRP = 1 (Takteilung durch 2, dadurch insgesamt 16 verfügbare Segmente
im Bit)
SyncSeg = 1 tSCL (fest)
tSeg1   = 9 tSCL
tSeg2   = 6 tSCL
----------------
         16 tSCL
         =======
Somit müsste BTR1 = 0x58 und BTR0 = 0x00.

Gibt es jemand der solch ein Tool besitzt wo dann die Berechnugn
automatisch macht?

von ElMachel (Gast)


Lesenswert?

Hi

für den MCP2515 gibt auch einen extra Calculator:
http://www.intrepidcs.com/mcp2510/

mfg

von Freddi (Gast)


Lesenswert?

Super Seite! Danke ElMachel

Gibt es auch ein Beispielcode wie sowas berechnet wird?

von Rahul (Gast)


Angehängte Dateien:

Lesenswert?

@Tüddel:
Mein Code hängt...
.. nicht nur hier hinten dran, sondern auch einfach so.
Es passiert nichts (Oszi mit Logic-Analyzer gefunden....)

von Rahul (Gast)


Lesenswert?

@Freddie:
BTR0 und BTR1 sind die Register deines SJA1000.
Wenn Du dir das Datenblatt ansiehst, gibt es da diverse Formeln zur der
einzelnen Zeit-Segmente im CAN-Bit.
Ich habe einfach die Segmentlängen von Mike Schaub übernommen, und auf
die entsprechende Takt- und CAN-Bus-Frequenz umgerechnet.

Gruß Rahul

von Rahul (Gast)


Lesenswert?

@tüddel:
Laut Logik-Analysator funktioniert zumindest die Kommunikation zwischen
den beiden Controllern. Der MCP antwortet auf ein READ-Kommando...
Jetzt stellt sich wohl die Frage nach der Konfiguration bei 24MHz und
125kbps. Da werde ich wohl auch mal das Tool herunterladen müssen...

Schönes Wochenende!

Rahul

von Georg X. (schorsch666)


Lesenswert?

Nabend Leute,


ich bin grad dabei einen SJA1000 in Betrieb zu nehmen.
Leider komme ich da irgendwie nicht weiter.

Ich habe folgende Konstellation.

ATMega16 mit 16MHz Takt
SJA1000 mit 16MHz Takt
PCA82C251 als Treiber (hier liegt der RS Pin auf GND)
Als Gegenstelle habe ich einen CAN_USB


Irgendwie bekomme ich die Baudrate nicht eingestellt.
Bei 125kBaud hab ich folgendes eingestellt:

BTR0 0x0f
BTR1 0x14

leider bekomme ich sofort nach dem ersten Sendeversuch einen BusOFF.
Ich habe schon mehrer Baudraten durchgetestet. Irgendwie haut das nicht 
hin. Wenn ich mir die Signale vor dem Bustreiber anschaue würde an sich 
die Bitlänge zu der Baudrate passen. Aber der CAN_USB sagt was anderes.
Ich kann auch nichts empfangen. Die interruptbits bzw. auch die im 
Statusregister werden nicht gesetzt.

Kann mir den jemand erklären wie ich die Baudrate einstelle oder ev. 
einen informativen Link posten.
Vielleicht hat der eine oder andere eine Idee was es ev. sein könnte.

Gruss,
Schorsch.

von Werner B. (werner-b)


Lesenswert?

Mein SJA1000 hatte die Macke dass ich den unbenutzten TX Ausgang nicht 
einfach unbeschaltet lassen durfte. Ein Pull-IP oder Pull-Down von 10k 
angeschlossen und das Problem war weg.

von Georg X. (schorsch666)


Lesenswert?

Hi,

bist du sicher dass es der TX und nicht der 2 RX Eingang war.
Ich teste es aber gleich mal.

Ich habe grad noch mal nachgemessen. Meine Bitlängen passen doch nicht.
Irgendwie sind diese um welten länger als dass was ich eigentlich 
einstelle.

Mein Quarz schwingt aber mit 16MHz und ist an xtal1 und xtal2 
angeschlossen.

Entweder stelle ich komplett die falschen werte bei btr0 und btr1 ein 
oder ich habe hier ein grundsätzliches problem.

Was mir grad noch aufgefallen ist dass ich auf der CAN_LOW leitung 
überhaupt kein signal habe wenn ich vom SJA1000 sende. Das ist doch 
seltsam.
Ich hoffe nur dass der Treiber nicht defekt ist. Ich hab nähmlich grad 
keinen Ersatz da.


Gruss
Schorsch

von Georg X. (schorsch666)


Lesenswert?

Nabend Leute,


jetzt hab ich alles geprüft.
Bei CAN Low kommt jetzt auch ein Signal raus.
Was ich als erstes festgestellt habe dass die eingestellt Baudtrate 
nicht stimmt. Meine Bitlänge ist kürzer als berechnet.
Könnte dies ev. am 16MHz Quarz liegen????

Des weiteren habe ich festgestellt dass egal was ich Sende das signal 
auf dem Bus immer gleich aussieht.
Kann sich dass jemand erklären?

Ich habe jetzt meine komplette initialisierung geprüft und weiss nicht 
woran dass liegen kann.

Hat jemand ein ähnliches Verhalten beobachten können?

Gruss,
Georg.

von dude (Gast)


Lesenswert?

wie kommst Du auf die errechneten werte von btr0 un btr1? versuchs mal 
mit 0x43 und 0x1C

von Georg X. (schorsch666)


Angehängte Dateien:

Lesenswert?

Hi,

wie ich auf die Werte gekommen bin weiss ich auch nicht mehr.
Ich habe heute Abend mal für 250kBaud mit BTR0 = 0x01 und BTR1 = 0x17 
getestet.

Mit deinen Werten habe ich eine Bitlänge von 8µsec. Die einzelnen Bits 
liegen aber 200µsec von einander weg.
Was sehr seltsam ist dass auf dem Oszi die Message total seltsam 
ausschaut.
Egal was ich versende ich sehe immer das gleich Muster.

Im Anhang hab ich mal ein Oszi Bild angehängt. Zu sehen sind CANLOW und 
CANHIGH Signal.
Ich verstehe das nicht. Bei mir sieht die komplette Nachricht so aus.

Im Moment bin ich ziemlich ratlos.

Gruss,
Georg.

von Otto (Gast)


Lesenswert?

Hallo Georg X.,

hast Du bei dem CAN-USB die richtige Baudrate eingestellt ?

Wie sieht die Initialisierung aus ?

Was bedeutet für Dich "Bus-off" ?

Was zeigen RX- und TX-Error-Counter des SJA an ?

Gruss Otto

von Georg X. (schorsch666)


Lesenswert?

Hallo Otto,

die Baudrate im CAN_USB ist 100% richtig.

Mit Bus-Off mein ich das Bit 7 im Status Register da steht nach dem 
ersten Sendeverusch 0xC4 drin.

Der SJA1000 ist in BasicCAN Mode initialisiert da hab ich keine RX- und 
TX-Counter.

Die initialisierung sieht wie folgt aus:

  //SetPorts
CAN_DATA_WRITE       = 0x00;
CAN_DATA_DIRECTION     = PORT_INPUT;

CAN_CONTROL_WRITE    |= CAN_CS | CAN_RD | CAN_WR | CAN_RST;
CAN_CONTROL_WRITE    &= ~CAN_ALE;

CAN_CONTROL_DIRECTION  |= CAN_ALE | CAN_CS | CAN_RD | CAN_WR | CAN_RST; 
/
CAN_CONTROL_DIRECTION  &= ~CAN_INT;

//reset SJA1000 after this SJA1000 is in Reset Mode
CAN_CONTROL_WRITE    &= ~CAN_RST;
asm("nop");
CAN_CONTROL_WRITE    |= CAN_RST;

  //set to reset mode for configuration
fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data);
uc_Read_Data |= 0x01;
fn_Write_SJA(CAN_CONTROL_R, uc_Read_Data);

  //wait until SJA1000 in Reset mode
fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data);
uc_Timeout = 1000;
while( ((uc_Read_Data & 0x01) != 0x01) || uc_Timeout <= 0 )
{
  fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data);
  uc_Timeout--;
}
if (uc_Timeout == 0) return 1;


//Clock-Divider-Register setzen

fn_Write_SJA(CAN_CLOCK_DIV_R, 0x08);
//set acceptance mask and code to filter CAN-Massages
fn_Write_SJA(CAN_ACCEPT_CODE_R, ACCEPTANCE_CODE);
fn_Write_SJA(CAN_ACCEPT_MASK_R, ACCEPTANCE_MASK);

// Bustiming-Register einstellen
fn_Write_SJA(CAN_BTR0_R, BTR0_REG);
fn_Write_SJA(CAN_BTR1_R, BTR1_REG);

//Output Control Register einstellen
fn_Write_SJA(CAN_OUTCONTRO_R, 0x1A);

//set to normal mode
fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data);
uc_Read_Data &= 0xFE;
uc_Read_Data |= 0x02; //activate receive interrupt
fn_Write_SJA(CAN_CONTROL_R, uc_Read_Data);

//wait until SJA1000 in normal mode
fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data);
uc_Timeout = 1000;
while( ((uc_Read_Data & 0x01) != 0x00) || uc_Timeout <= 0 )
{
  fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data);
  uc_Timeout--;
}
if (uc_Timeout == 0) return 1;

Ich denke dass sollte so weit ok sein.

Ich hoffe ihr könnt mir weiter helfen.

Gruss,
Georg.

von Otto (Gast)


Lesenswert?

> fn_Write_SJA(CAN_CLOCK_DIV_R, 0x08);

Damit schaltest Du den Clockout-Pin aus und den Divider auf CLK/2 - 
weshalb ?

Weshalb arbeitest Du nicht im PeliCan-Mode ?

Otto

von Otto (Gast)


Lesenswert?

; #define BTR0_125k   0x07
; #define BTR1_125k   0x14

Das funktioniert bei mir mit 16MHz

Otto

von Schorsch666 (Gast)


Lesenswert?

Morgen,

den CLOCK Out benötige ich nicht. Deswegen ist der aus.

Den SysClk divider könnte ich natürlich auf 1 stellen.

PeliCAN - Mode kommt noch. Ich will beide Modi realisieren und hab halt 
mit dem BasicCAN angefangen.

Deine Einstellung probier ich mal heute Abend mal aus.
Vorausgesetzt ich komme hier früh genug ausm Geschäft raus.

Kannst du dir den Signalverlauf auf den CAN-Leitungen erklären?

Gruss,
Georg.

von Otto (Gast)


Lesenswert?

Hallo Georg,

> Kannst du dir den Signalverlauf auf den CAN-Leitungen erklären?

nein - wenn Dein SJA aber kein "ACK" sendet, ist spätestens nach dem 
ersten gesendeten Frame von Deinem CAN-USB Feierabend und Du siehst 
sowieso nichts mehr.

Daher: versuche mal, mit dem SJA1000 zu senden und prüfe, ob Du mit dem 
CAN-USB (ggf. nach Anpassung der Baud-Rate) empfangen kannst.

Gruss Otto

von Georg X. (schorsch666)


Lesenswert?

Hallo Otto,

genau dass probier ich doch schon die ganze Zeit.
Aber ich bekomme beim Senden nur Errorframes.
Da kann ich probieren so viel ich will.

Ich denke ich habe da nen Fehler in der Verdrahtung oder in der 
initialisierung.
Wenn ich die Register des SJA beschreibe und danach lese passt alles.

Gruss,
Georg.

von Otto (Gast)


Lesenswert?

Hallo Georg,

es war nicht ganz klar, ob Du sendest oder empfängst....

1. Zeige mal den Schaltplan.
2. Ist der SJA während der Parametrierung im Reset-Mode ?
3. Beendest Du den Reset-Mode durch schreiben von "0" in SJA_MODE ?
4. Setzt Du SJA_OUTCTR richtig ?

Otto

von Georg X. (schorsch666)


Lesenswert?

Hallo,

zu 1. Schaltplan hab ich grad keinen. Ist noch alles auf dem Steckbrett 
verdrahtet.
Ich habe die Daten und Adressleitungen auf einen Port gehägt und die 
Steuerleitungen auf ein anderen Port. Alles direckt verbunden nur an der 
Reset Leitung habe ich einen PullUP drann.
Das Lesen und Schreiben der Register funktioniert ja.

zu 2. Der SJA ist währen der Parametrierun im Reset Mode. Siehe Code 
weiter oben.
zu 3. Danach wird er auch zurück in Normal Modus gesetzt.

zu 4. SJA_OUTCTR wird auf 0x1A gesetzt. Sollte auch passen.

Kommunikation mit dem SJA1000 aus µC Seite funktioniert soweit. Nur nach 
Aussen auf den CAN kommt nichts vernünftig raus.

von Otto (Gast)


Lesenswert?

Hallo Georg,

ich habe ebenfalls Daten und Adressleitungen an einem Port (Adressen 
werden über ALE "gelatched"). Der Transceiver ist der selbe.

Das Programm ist allerdings in Assembler geschrieben.

.equ CAN_OUTCTR = 0b00011010 ; SJA Daten Output
.equ PELI_CLK   = 0b11000111 ; SJA Daten PeliCAN,Komp Byp,CLK1:1

Im Register "OUTCTR" steht bei mir "0x1A" siehe oben.
Im Register "CLK" ist noch der Komperator Bypass gesetzt.

Gruss Otto

von Georg X. (schorsch666)


Lesenswert?

Hallo Otto,

wie schaut es bei dir mit dem Oszillator aus.
Ich habe z.B. einen 16MHz an XTAL1 und XTAL2 parallel 1mOhm und dann 
jeweils ein 22pF auf Masse.

Den Rx1 habe ich an einem Spannungsteiler auf 2,5V gesetzt.
Langsam weiss ich wirklich nicht mehr was ich noch falsch machen 
könnten.
Ist bestimmt nur ne kleinigkeit die ich noch nicht beachtet habe.

Gruss,
Georg.

von Otto (Gast)


Lesenswert?

Hallo Georg,

ich habe einen 16MHz Quarz mit 2 22pF-Kondensatoren ohne einen 
Widerstand - das ist aber nicht Dein Problem, denn der SJA arbeitet ja.

Der "RX1" liegt bei mir an GND, der "TX1" ist offen

RX0 geht an RX des Transtceivers
TX0 an TX des Transceivers

Widerstand 33k von RS des Transceivers nach +5V
120 Ohm Abschlusswiderstand zwischen CANH und CANL

Fotos siehe:

http://www.priuswiki.de/wiki/CAN-Display

Gruss Otto

von Georg X. (schorsch666)


Lesenswert?

Nabend Leute,

ich habs jetzt mit PeliCAN Probiert.
Leider das gleiche ergebniss.

Am Anfang des Frames wird der Pegel 200µsec lang auf Dominant gezogen
danach folgen kurze rezessive signale mit der eingestellten Bitlänge 
alle 200µsec.
Ist mein SJA1000 hinüber oder sehe ich die Bäume vor lauter Wald nicht.

Weiss den jemand noch Rat?

Gruss,
georg.

von Otto (Gast)


Lesenswert?

Funktioniert Dein CAN-USB ?
Was zeigen die Errorcounter ?
Wie ist der Status ?

von Georg X. (schorsch666)


Lesenswert?

Hallo Otto,

du wirst es nicht glauben es geht.

Ich habe deine Einstellung mal übernommen
PELI_CLK   = 0b11000111 ; SJA Daten PeliCAN,Komp Byp,CLK1:1

Ich habe hier im PeliCAN Mode 0x88 reingeschrieben. Sollte eigentlich 
auch funktionieren. Scheinbar aber nicht.

Das hätte ich gerne noch verstanden.

Gruss,
Georg.

von Otto (Gast)


Lesenswert?

Hallo Georg,

> du wirst es nicht glauben es geht.

ich vermute, dass nur Dein CAN-USB geht - was macht Dich so sicher ?

Wie hast Du es geprüft ?

Wenn dieses kein ACK sendet, dann kannst Du nur eine Botschaft versenden 
und das war es dann.

Wichtig ist, dass Du Dir alle Register des SJA ansehen kannst.

Der SJA hat ein sehr hilfreiches Statusregister - das gibt deutliche 
Hinweise auf die Fehlerursache.

Hast Du die Busbeschaltung überprüft - ist kein Dreher darin ?

Falls Du meinem Link gefolgt bist, hast Du evtl. den Lochrasteraufbau 
gesehen. der ohne Probleme mit 500kBAUD und auch mit 1MBaud arbeitet.

Gruss Otto

von Georg X. (schorsch666)


Lesenswert?

hi,

beim CANUSB kann ich einstellen ob ein ACK gesendet wird oder nicht.
Ich kann im Moment so viele Nachrichten senden wie ich will.

Die Beschaltung hab ich glaub schon an die 20 mal geprüft.

Von deiner zu meiner Einstellung ist der gravierende Unterschied nur das 
Setzen des Komperator Bypass und dass du den ext. Clockausgang nicht 
abschaltest.

Interessant wäre es zu wissen ob bei dir deine Applikation noch läuft 
wenn der Bypass und Clockout deaktiviert sind.

Die Register im Fehlerfall hab ich mir noch nicht angeschaut.
Werde ich aber müßen um das Verhalten zu verstehen.

Gruss und Danke,
Georg.

von Otto (Gast)


Lesenswert?

Hallo Georg,

Der Unterschied ist, dass Du RX1 auf UB / 2 gelegt hat

> Der "RX1" liegt bei mir an GND, der "TX1" ist offen

Deshalb muss ich den Comperator Bypass setzen.

Mein Controller arbeitet mit externem Clock und zwar dem, der aus 
"CLKOUT" des SJA herauskommt.

Meinen RS232-CAN Umsetzer konnte ich im Zweifelsfall immmer am PKW 
prüfen.

Damit have ich eine mehrminütige Log-Datei erstellt, mit der ich dann 
das Verhalten der Schaltung auch am "Basteltisch" prüfen konnte.

Mir hat die Ausgabe der Register am meißten geholfen.

Wichtig: bevor Du irgendetwas abderes machst, musst Du zumindest im 
PELI-CAN zuerst das Register beschreiben, das auf Peli-CAN umschaltet, 
da sonst die Adressen nicht stimmen.

Gruss Otto

von Georg X. (schorsch666)


Lesenswert?

hi,

ich hat den Fehler gefunden. Jetzt gehts auch mit meinen Einstellungen.
Ist ganz schön peinlich.... :(

Der Spannungsteiler am RX1 war gar keiner. Gingen beide Widerstände auf 
GND.

Ich danke dir herzlich für deine Hilfe.

Gruss,
Georg.

von Otto (Gast)


Lesenswert?

Hallo Georg,

hauptsache ist, dass es jetzt funktioniert !

Bis dann mal....

Gruss Otto

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.