Forum: Mikrocontroller und Digitale Elektronik AT90CAN mit sechs externen CAN-Controllern


von ee_ (Gast)


Lesenswert?

Hallo,

ich habe vor mit einem AT90CAN (AVR-CAN von Olimex) sechs externe 
CAN-Controller (MCP2515)über SPI zu steuern. Meine Frage ist ob das 
geht, und welche zusätzlichen Bauteile ich hierfür speziell noch dazu 
kaufen müsste.

von TestX .. (xaos)


Lesenswert?

das geht nur bei geringer bus-last, da die dinger keinen fifo/queue 
besitzen (nur 3 rx/tx) messages.
wenn du wirklich 6+1 can bus brauchst und mit entsprechendes bus-last 
als can-gateway verwenden willst solltest du dich in die richtung 
cortex-m3 orientieren... der hat dann auch genug power und mehr als 1spi 
interface..

selber verwende ich für sowas pro can-bus jeweils 1nen cortex m0 als 
can-controller (der kann dann auch puffern..)

von ee_ (Gast)


Lesenswert?

Könntest du mir vielleicht auch gleich ein geeigenetes Board dazu 
empfehlen??


Vielen Dank für die schnelle Antwort.

von Frank K. (fchk)


Lesenswert?

... oder zumindest SJA1000, die Du ans External Memory Interface über 
PORTA, PORTC und PORTG anschließt. Die SJA1000-Register liegen dann 
direkt im Adressraum des AVR, d.h. Du sparst Dir den SPI-Overhead.

fchk

von Andi (Gast)


Lesenswert?

Zb lpc.xpresso ... Allerdings solltest du wenn schon ein Board 
selberbauen. SJA1000 wären auch eine Alternative bei geringer buslast. 
Was erwartest du denn an Daten und was willst du machen ? Klingt nach 
nem Uni Projekt ohne das erforderliche hintergrundwissen..

von ee_ (Gast)


Lesenswert?

Ich würde die Alternative mit dem SJA1000 vorziehen....

Was für ein AVR würde denn für die Ansteuerung für sechs 
SJA1000-CAN-Controller genügen? Also was für Eigenschaften sollte der 
Mikrocontroller haben?

Und wie müsste ich die SJA1000-Controller an den MCU anschließen?

von TestX .. (xaos)


Lesenswert?

erzähl uns doch erstmal was du genau vorhast...evtl reicht ein AVR für 
sowas bei weitem nicht aus...

wenn du dir das datenblatt des SJA1000 anschaust wirst du sehen dass das 
ding über einen parallelen datenbus an den controller angebunden wird 
(wie schon erwähnt, Stichwort ExternalMemory)

von ee_ (Gast)


Lesenswert?

Also ich möchte einen kleinen Restbussimulator bauen. Mein Board soll 
sechs CAN-Teilnehmer haben, die fürs erste nichts anderes als 
ACK-Messages verschicken sollen. Im Weiteren möchte ich dann weitere 
Fehler-Messages verschicken können.

von Frank K. (fchk)


Lesenswert?

ee_ schrieb:
> Ich würde die Alternative mit dem SJA1000 vorziehen....
>
> Was für ein AVR würde denn für die Ansteuerung für sechs
> SJA1000-CAN-Controller genügen? Also was für Eigenschaften sollte der
> Mikrocontroller haben?

Er muss einen 8051-kompatiblen externen Memory Bus haben. Rein 
theoretisch könntest Du das auch per Port IO machen, aber das wird viel 
zu langsam.

Das haben die Mega64/128/640/641/1280/1281/2560/2561 sowie die alten 
Mega162 und Mega8515. Wenn DU AVR nehmen willst, dann einen der modern 
Typen Mega 64x/128x/256x

> Und wie müsste ich die SJA1000-Controller an den MCU anschließen?

Hier wirds mit einem SJA1000 gemacht:

http://www.kreatives-chaos.com/images/175.png

Bei mehreren SJA1000 nimmst Du Dir ein paar der oberen Adressleitungen 
von Port C und einen 74HC138.
Vorschlag:
HC138 (Pin) -> AVR
A0(1) ->A8/PortC0
A1(2) ->A9/PortC1
A2(3) ->A10/PortC2
!E1(4)->A15/PortC7
!E2(5)->A14/PortC6
E3(6) ->A13/PortC5

!Y0(15) -> !CS vom 1. SJA
!Y1(14) -> !CS vom 2. SJA
...
!Y6(9)  -> !CS vom 7. SJA
!Y7(7)  -> !CS vom 8. SJA

Die SJAs sind dann unter der Adresse 001x xnnn rrrr rrrr ansprechbar,
d.h.
1. SJA: 0x2000-0x20ff
2. SJA: 0x2100-0x21ff
....
8. SJA: 0x2700-0x27ff

In die oberen 32k des Adressraums kannst Du noch ein externes 32k SRAM 
einblenden, falls Dir der interne Speicher nicht reicht.

Zum Interrupt: Es gibt zwei Möglichkeiten. Entweder bedienen alle SJA 
eine gemeinsame Interrupt-Leitung - dann muss die Interrupt-Routine 
nachschauen, wer den Interrupt ausgelöst hat. Oder Du nutzt die 
Pin-Change Interrupts der modernen AVRs (die alten Mega64/128/90CANxx 
und die noch älteren 162/8515 haben das nicht) und klemmst jeden SJA auf 
einen eigenen Interrupt Pin.

fchk

von Peter D. (peda)


Lesenswert?

Den HC138 kann man sparen, man nimmt einfach A8..A13 direkt als /CS.
Der AT90CAN128 hat 9 Interrupteingänge, sollte also reichen.

Und die 16MHz für die SJA kann man bequem von Pin 42 abgreifen, den man 
als CLKO fused.

von ee_ (Gast)


Lesenswert?

Vielen Dank für die schnellen und sehr hilfreichen Antworten. Echt 
tolles Forum!!!

Ich werde nun erstmal die notwendige Hardware kaufen und das Board 
bauen. Ich werde darüber berichten und gegebenenfalls noch mal auf eure 
Hilfe zurückgreifen ;)

Nochmals vielen Dank

ee_

von maveric00 (Gast)


Lesenswert?

Hallo,

ee_ schrieb:
> Also ich möchte einen kleinen Restbussimulator bauen. Mein Board soll
> sechs CAN-Teilnehmer haben, die fürs erste nichts anderes als
> ACK-Messages verschicken sollen. Im Weiteren möchte ich dann weitere
> Fehler-Messages verschicken können.

Soll nur ein Bus simuliert werden und nur "logische" Ack und Errors? 
Dann würde auch ein CAN-Controller reichen, der die entsprechenden 
Nachrichten sendet. Wenn jedoch die physikalischen Ack und Errors 
(Collision,...) getestet werden sollen, muss die Buslast sehr hoch 
ausfallen. Da Du dann je nachdem bis zur 6-fachen Buslast mit dem MC 
bearbeiten musst (ausser die Controller filtern die jeweiligen anderen 
Nachrichten aus, so dass sie nicht abgerufen werden müssen), könnte ein 
AVR recht knapp werden. Speziell wenn er neben der Simulation auch noch 
die Auswertung (Auslesen von Fehler-Registern, Kommunikation der 
Ergebnisse etc.) durchführen soll.

Schöne Grüße,
Martin

von Peter D. (peda)


Lesenswert?

maveric00 schrieb:
> Wenn jedoch die physikalischen Ack und Errors
> (Collision,...) getestet werden sollen, muss die Buslast sehr hoch
> ausfallen.

Nö, das hat mit der Buslast nichts zu tun.

Der CAN verträgt 100% Buslast ohne Murren, genau dafür ist er nämlich 
ausgelegt (Carrier Sense Multiple Access / Collision Resolution).

Alle Sender reihen sich automatisch mit ihrer ID ein, die niedrigste 
sendet zuerst.

Störungen kannst Du nur mit einem speziellen Störgenerator erzeugen, die 
CAN-Controller können nur gültige Pakete senden.

von TestX .. (xaos)


Lesenswert?

Peter Dannegger schrieb:
> Störungen kannst Du nur mit einem speziellen Störgenerator erzeugen, die
> CAN-Controller können nur gültige Pakete senden.

bei hoher buslast und 2 teilnehmern die die gleichen Message-IDs senden 
kommt es zuverlässig zu kollisionen...

von Peter D. (peda)


Lesenswert?

Andi D. schrieb:
> 2 teilnehmern die die gleichen Message-IDs senden

Dann ist Dein Konzept falsch. Bei CAN dürfen nicht 2 Sender die gleiche 
ID benutzen.

Wenn Du es machst, dannn laufen bei beiden die Errorcounter über und sie 
verabschieden sich vom Bus. Das brauchst Du also nicht erst 
ausprobieren.

Es ist auch unabhängig von der Buslast. Nur die Häufigkeit ändert sich.
Bei geringer Last passiert es eben seltener.

von ee_ (Gast)


Lesenswert?

Also ich habe mich für den ATxMEGA128A3U entschieden, an denen ich sechs 
SJA's anschließen möchte.

Leider habe ich noch immer noch nicht ganz verstanden, wie ich die SJA's 
an den MCU anbringen soll.

Frank K. schrieb:
> Bei mehreren SJA1000 nimmst Du Dir ein paar der oberen Adressleitungen
> von Port C und einen 74HC138.
> Vorschlag:
> HC138 (Pin) -> AVR
> A0(1) ->A8/PortC0
> A1(2) ->A9/PortC1
> A2(3) ->A10/PortC2
> !E1(4)->A15/PortC7
> !E2(5)->A14/PortC6
> E3(6) ->A13/PortC5
>
> !Y0(15) -> !CS vom 1. SJA
> !Y1(14) -> !CS vom 2. SJA
> ...
> !Y6(9)  -> !CS vom 7. SJA
> !Y7(7)  -> !CS vom 8. SJA

Damit habe ich ja nur die !CS-Pins der SJA's angeschlossen, die ich laut 
Peter Danneggerja auch direkt anschließen könnte.

Jedes der SJA's besitzt ja auch noch 8 Daten-Pins (A0...A7), einen 
RD-Pin, einen WR-Pin und einen CS-Pin. Dafür würden die Pins des MCU ja 
nicht ausreichen???

Ich weiß leider nicht wie ich das anstellen soll und bitte um Hilfe.

von Peter D. (peda)


Lesenswert?

Mit den Xmega kenne ich mich nicht aus.

Die standard AVRs (z.B. AT90CAN128) haben jedenfalls alle benötigten 
Signale /RD, /WR, ALE und AD0..AD7 für die SJA1000.

Und sie brauchen auch keine Pegelwandler 3,3V<->5V.

von maveric00 (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Dann ist Dein Konzept falsch. Bei CAN dürfen nicht 2 Sender die gleiche
> ID benutzen.

Korrekt, wenn alles so läuft wie es soll.

> Wenn Du es machst, dannn laufen bei beiden die Errorcounter über und sie
> verabschieden sich vom Bus. Das brauchst Du also nicht erst ausprobieren.

Ebenfalls korrekt, wenn alles läuft wie es soll.

Stellt sich somit die Frage: Was möchte der TO eigentlich ausprobieren, 
wenn er mit dem Aufbau nicht das Verhalten bei Fehlern testen möchte? 
Wenn er 6/7 Busse haben möchte (was ich aus den bisherigen Antworten 
nicht herauslesen kann), dann sind 6/7 zusätzliche Controller notwendig.

Wenn er nur einen funktionierenden "Restbus" mit 6 Teilnehmern 
simulieren möchte, dann würde ich maximal zwei zusätzliche Controller 
verwenden (zwei, um auch die ganz hohen Buslasten oder auch 'mal 
identische IDs zu simulieren). Die lassen sich einfacher Verwalten, sind 
billiger und einfacher anzuschließen als sechs - können aber genau das 
gleiche. Die Situation, dass ein MC sich sowohl um das Senden als auch 
um das Empfangen der gleichen Botschaft kümmern muss, ändert sich 
jedenfalls auch nicht.

Bei zwei Controllern würde ich allerdings eventuell doch wieder eher die 
MCP2515 nehmen, da diese 2 (mit einer 2-Message-Fifo) und zusätzliche 4 
(ohne Fifo) Acceptance-Filter haben, während der SJA1000 nur eines hat 
(bei Extended ID). Damit würden nicht beide Controller alle Nachrichten 
abarbeiten müssen, sondern man könnte entsprechende Zuordnungen tätigen. 
Eine Anbindung an eine Hardware-SPI mit entsprechend schneller 
Bearbeitung hereinkommender Nachrichten (ggf. Interrupt-getriggert) ist 
dann allerdings Pflicht, um nicht langsamer als der CAN zu werden.

Der Sinn von sechs zusätzlichen Controllern erschließt sich mir 
jedenfalls noch nicht.

Schöne Grüße,
Martin

von Frank K. (fchk)


Lesenswert?

ee_ schrieb:
> Also ich habe mich für den ATxMEGA128A3U entschieden, an denen ich sechs
> SJA's anschließen möchte.

Das ist ein 3.3V Chip. Die Atmegas laufen mit 5V, genauso wie die 
SJA1000. Schau im Datenblatt nach, ob Dein Chip einen externen 
Adress/Datenbus hat und ob er 5V-Signale abkann. Sonst hast Du einen 
Einweg-Leuchtprozessor.

> Leider habe ich noch immer noch nicht ganz verstanden, wie ich die SJA's
> an den MCU anbringen soll.
>
> Frank K. schrieb:
>> Bei mehreren SJA1000 nimmst Du Dir ein paar der oberen Adressleitungen
>> von Port C und einen 74HC138.
>> Vorschlag:
>> HC138 (Pin) -> AVR
>> A0(1) ->A8/PortC0
>> A1(2) ->A9/PortC1
>> A2(3) ->A10/PortC2
>> !E1(4)->A15/PortC7
>> !E2(5)->A14/PortC6
>> E3(6) ->A13/PortC5
>>
>> !Y0(15) -> !CS vom 1. SJA
>> !Y1(14) -> !CS vom 2. SJA
>> ...
>> !Y6(9)  -> !CS vom 7. SJA
>> !Y7(7)  -> !CS vom 8. SJA
>
> Damit habe ich ja nur die !CS-Pins der SJA's angeschlossen, die ich laut
> Peter Danneggerja auch direkt anschließen könnte.
>
> Jedes der SJA's besitzt ja auch noch 8 Daten-Pins (A0...A7), einen
> RD-Pin, einen WR-Pin und einen CS-Pin. Dafür würden die Pins des MCU ja
> nicht ausreichen???

Die gehen an alle SJA parallel. Die !CS-Pins wählen den jeweils aktiven 
SJA aus.

von ee_ (Gast)


Lesenswert?

Die ATxMega sind wohl nicht sehr geeignet wegen den 3,3V.

Ich werde nun einen ATmega324P nehmen, außer jemand meint, dass der aus 
irgendeinem Grund nicht für mein Vorhaben geeignet ist.

von Frank K. (fchk)


Lesenswert?

ee_ schrieb:
> Die ATxMega sind wohl nicht sehr geeignet wegen den 3,3V.
>
> Ich werde nun einen ATmega324P nehmen, außer jemand meint, dass der aus
> irgendeinem Grund nicht für mein Vorhaben geeignet ist.

Der hat kein External Memory Interface, und das brauchst Du zwingend, 
damit die Zugriffe einigermaßen schnell ablaufen.

Aus einem meiner früheren Postings:
----
> Was für ein AVR würde denn für die Ansteuerung für sechs
> SJA1000-CAN-Controller genügen? Also was für Eigenschaften sollte der
> Mikrocontroller haben?

Er muss einen 8051-kompatiblen externen Memory Bus haben. Rein
theoretisch könntest Du das auch per Port IO machen, aber das wird viel
zu langsam.

Das haben die Mega64/128/640/641/1280/1281/2560/2561 sowie die alten
Mega162 und Mega8515. Wenn DU AVR nehmen willst, dann einen der modern
Typen Mega 64x/128x/256x
----

Meine Empfehlung: Atmega 1281. Ist einer der neueren Megas. Wenn Du 
unbedingt einen DIL-Baustein brauchst, muss es der Mega 162 sein. Der 
hat auch ein External Memory Interface, aber nur 1k RAM. Da empfehle 
ich, gleich ein 32k SRAM zusätzlich extern anzuschließen.

fchk

von Peter D. (peda)


Lesenswert?

Frank K. schrieb:
> Er muss einen 8051-kompatiblen externen Memory Bus haben.
...
> Das haben die Mega64/128/640/641/1280/1281/2560/2561 sowie die alten
> Mega162 und Mega8515.

Und die AT90CAN32/64/128.

ee_ schrieb:
> ich habe vor mit einem AT90CAN (AVR-CAN von Olimex) sechs externe
> CAN-Controller ... zu steuern.

Paßt also super.

von Frank K. (fchk)


Lesenswert?

So, und wenn es aus Performance-Gründen einen XMega sein soll (was ich 
nachvollziehen kann), dann brauchst Du einen ATxmega192/256A1. Der hat 
im Gegensatz zu Deinem A3 ein External Bus Interface. Als Pegelwandler 
für den gemultiplexten Adress-Daten-Bus nimmst Du einen 74LVCC3245, für 
die Steuerleitungen 74HCTxxx-Baustein(e). Dann geht das auch.

Ansonsten schaust Du mir so aus, als wüsstest Du nicht, was Du da tust. 
Vielleicht mal ein Grundlagenbuch lesen? Gestapeltes und gebundenes 
Papier - Du weißt schon. Soll in ähnlichen Fällen schon geholfen haben.

fchk

von ee_ (Gast)


Lesenswert?

Vielen Dank!!

Frank K. schrieb:
> Ansonsten schaust Du mir so aus, als wüsstest Du nicht, was Du da tust.
> Vielleicht mal ein Grundlagenbuch lesen? Gestapeltes und gebundenes
> Papier - Du weißt schon. Soll in ähnlichen Fällen schon geholfen haben.

ich bin dabei :)

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.