Hallo Leute,
ich habe da ein Verständnisproblem.
Ganz vereinfacht gesagt besteht ein Can-Protokoll ja aus High- bzw. Low
Pegeln. (Signale).
Mit einem stinknormalen uC mit DIO kann man doch auch High- und Low
Signale senden (zumindest an die Leitung an legen)
Warum braucht man dann ein CAN-Transceiver oder Can-Controller oder
sonst wie die heissen. (Sorry ich kann die zwischenbausteine nicht
richtig zuordnen)??
danke im Voraus
Heizer schrieb:> Warum braucht man dann ein CAN-Transceiver
Um die Signale physikalisch dem CAN Bus anzupassen. Pegel,
differentielle Signale
> oder Can-Controller
Der nimmt dem µC einen Großteil der Arbeit ab. Wenn der µC schnell genug
ist und du genug Ahnung hast kannst du es auch in Software
implementieren.
Weil die High- und Low-Pegel beim CAN eben überhaupts mit den High- und
Low-Pegeln am Mikrocontroller-Ein-Ausgang gemeinsam haben.
Diese Anpassung ist die Aufgabe des CAN-Transceivers (Spannungen des
Mikrocontrollers an die Spannung des gewählten CAN-Busses anpassen).
Der CAN-Controller ist der Teil der die Logik macht. Also
Bitreihenfolge, Arbitrierung, Stuff-Bits einfügen und wegnehmen, CRC,
Timing, Synchronisation ...
Denke schon dass auch ein MegaAVR das CAN Protokoll in Software
nachbilden kann. Bei UART klappts ja auch. Highspeed-CAN liegt mit
500kBit ca. um Faktor 4 höher. Bei 20MHz hast du also 40 Takte pro Bit.
In Assembler auf jeden Fall machbar, in C evtl auch.
Allerdings gibt es auch Mittelwege: CAN-Transceiver, die per SPI
angebunden werden. Auch wenn ich da grade keinen CAN.
Und SPI kann der Atmel ja in Hardware, also praktisch "nebenbei".
Max H. schrieb:> Heizer schrieb:>> Warum braucht man dann ein CAN-Transceiver> Um die Signale physikalisch dem CAN Bus anzupassen. Pegel,> differentielle Signale>> oder Can-Controller> Der nimmt dem µC einen Großteil der Arbeit ab. Wenn der µC schnell genug> ist und du genug Ahnung hast kannst du es auch in Software> implementieren.Christopher schrieb:> Weil die High- und Low-Pegel beim CAN eben überhaupts mit den High- und> Low-Pegeln am Mikrocontroller-Ein-Ausgang gemeinsam haben.>> Diese Anpassung ist die Aufgabe des CAN-Transceivers (Spannungen des> Mikrocontrollers an die Spannung des gewählten CAN-Busses anpassen).>> Der CAN-Controller ist der Teil der die Logik macht. Also> Bitreihenfolge, Arbitrierung, Stuff-Bits einfügen und wegnehmen, CRC,> Timing, Synchronisation ...
danke schön. das nenne ich Hilfe. Statt einfach einen WIki Artikel zu
posten.
le x. schrieb:> In Assembler auf jeden Fall machbar, in C evtl auch.
UART ist aber wesentlich einfacher.
Bit Stuffing und CRC gibt es dort nicht. Klar könnte man das Paket
vorher komplett berechnen und dann "nur" senden, was aber dann nicht
mehr sehr schnell sein wird.
le x. schrieb:> Denke schon dass auch ein MegaAVR das CAN Protokoll in Software> nachbilden kann. Bei UART klappts ja auch. Highspeed-CAN liegt mit> 500kBit ca. um Faktor 4 höher. Bei 20MHz hast du also 40 Takte pro Bit.> In Assembler auf jeden Fall machbar, in C evtl auch.>> Allerdings gibt es auch Mittelwege: CAN-Transceiver, die per SPI> angebunden werden. Auch wenn ich da grade keinen CAN.> Und SPI kann der Atmel ja in Hardware, also praktisch "nebenbei".
moment. vestehe ich das jetzt richtig?
Can Controller kann man in Software realisieren. Can Transciever auch?
Heizer schrieb:> Can Controller kann man in Software realisieren. Can Transciever auch?
Dank der elektrischen Definition vom Interface gehts bei CAN schlecht
ohne Transceiver. RS232 geht ja auch nicht ohne RS232-Bausteine wie
MAX232.
Heizer schrieb:> Can Controller kann man in Software realisieren. Can Transciever auch?
Und warum sollte man so etwas machen ?
Was ist mit Pegel, Kurzschluss ?
CAN-Controller ist machbar, wenn auch wenig sinnvoll, aber uC ohne
Transceiver an CAN Bus dranzuhängen ist Blödsinn.
Peter II schrieb:> UART ist aber wesentlich einfacher.
Das ist unbestreitbar.
> Bit Stuffing und CRC gibt es dort nicht.
Stimmt. Aber z.B. bei USB (LowSpeed=1,5MBit/s), also dem Dreifachen von
CAN. Und selbst da schafft es ein AVR, Bitstuffing und CRC in Echtzeit
zu behandeln, nix mit vorberechneten Paketen. Jedenfalls ab ca. 18MHz
Takt.
Bei einem Drittel der Bitrate rutscht die Sache in Bereiche, die sogar
in (fast) purem C machbar wären.
Ok jetzt ist mir die sache klar geworden(vermute ich)
also so ist die Kommuniklation aufgebaut:
uC[Master]--Can-Contr.--Can-Trans.--
---Can-Leitung---Can-Trans.--Can.Contr.--uC [Master/Slave]
le x. schrieb:> Bei 20MHz hast du also 40 Takte pro Bit.
Das reicht bei CAN nicht, die Teilnehmer müssen sich auf den Bitanfang
synchronisieren können. Dazu unterteilen sie ein Bit in mindestens 8,
besser 16 Slots. Quasi wie eine UART auf das Startbit synchronisiert.
Ein CAN-Controller braucht für 1MBit mindestens einen 8MHz Quarz.
Eine SW-Lösung wird deshalb kaum unter 80MHz gehen.
Peter Dannegger schrieb:> Ein CAN-Controller braucht für 1MBit mindestens einen 8MHz Quarz.> Eine SW-Lösung wird deshalb kaum unter 80MHz gehen.
Üblich sind aber 250Kb und 500Kb. Also hat man schon bei 20MHz etwa
40Cy/bit und das bei der schnelleren Variante.
Da kann höchstens die Adressdekodierung einen TINY4313 z.B. zum
Schwitzen bringen, aber Bit-stuffing und anderes mit Sicherheit nicht.
Ob der AVR dann auch noch was anderes und sinnvolles machen kann,
ist eine andere Frage.
Marc Vesely schrieb:> Peter Dannegger schrieb:>> Ein CAN-Controller braucht für 1MBit mindestens einen 8MHz Quarz.>> Eine SW-Lösung wird deshalb kaum unter 80MHz gehen.>> Üblich sind aber 250Kb und 500Kb. Also hat man schon bei 20MHz etwa> 40Cy/bit und das bei der schnelleren Variante.> Da kann höchstens die Adressdekodierung einen TINY4313 z.B. zum> Schwitzen bringen, aber Bit-stuffing und anderes mit Sicherheit nicht.> Ob der AVR dann auch noch was anderes und sinnvolles machen kann,> ist eine andere Frage.
wäre ja im Falle nicht wichtig, wenn z.B. ein 328p als vorgelagerter
CAN-Baustein funktioniert und sonst nicht viel zutun hätte. Ob das dann
preislich viel Sinn macht steht auf einem anderen Blatt.
Für CAN in Software benötigt man letztlich einen recht schnellen Core,
der nur für den CAN Bus arbeitet, ohne störende Interrupts. Damit der
nicht durch Kommunikation mit dem Rest des Systems gestört wird muss das
also eine Art I/O-Prozessor sein, der ins Gesamtsystem eingebettet ist.
Damit kommt als ein vorgelagerter AVR kaum in Frage. Denn wenngleich
sich der vielleicht mit einem langsamen CAN Bus abmühen kann, würde er
mit dem Hauptsystem nicht kommunizieren können ohne CAN zu
vernachlässigen.
In Frage kommt das in Multiprozessorumgebungen, deren einzelne
Prozessoren für I/O-Aufgaben optimiert sind. Die deshalb keine
spezialisierten Hardwaremodule für allerlei I/O enthalten, wie CAN
Controller, sondern genug I/O-Prozessoren, um solche Hardwaremodule
durch Software zu ersetzen.
Eine solche Konstellation findet man beispielsweise im Parallax
Propeller und bei XMOS. Auf diese Weise kann ein nicht zu kleiner XMOS
Controller auch Ethernet in Software anbinden.
Aber natürlich stellt sich die Frage, ob sich das wirklich lohnt. Es
gibt genug billige Mikrocontroller mit integriertem CAN, deren CAN schon
fix und fertig funktioniert. Nicht erst nach langer Programmierarbeit.
A.K., Du hast es wie immer gut und präzisse auf den Punkt gebracht.
Wenn man sich sehr anstrengt, wären vielleicht dennoch etwas
grenzwertige Sachen ähnlich diese Implementierung hier möglich:
http://www.youtube.com/watch?v=m4f4OzEyueg
CAN in Software zu Realisieren ist Mühselig und fehleranfällig. Steht
auch in keinen Verhältnis zu dem Mehrpreis eines µC der das von haus
aus kann.
Die CAN Pegel sind bei einem 5V system 5V und 0V für Daten und 2,5V für
Idle-mode. Wenn du das also ohne weitere Komponenten wie Tranciver
machen willst brauchst du auch noch DACs und ADCs.
Außerdem schützt der Transciever den µC vor unschönen Sachen die auf der
Busleitung kommen können. Die meisten Tranciever können Spannungsstöße
in kV-Bereich ab. Da macht dein µC schon lange die Grätsche.
Es geht mehr um den Controller als um den Transceiver.
Ich persönlich würde da keine 5min dran verschwenden, dass irgendwie in
Software zu realisieren - nicht alles was geht, ist auch sinnvoll.
Dinge, die man für kleines Geld jederzeit kaufen kann und darf, macht
man nicht selbst, nichtmal beim Hobby (wenn es um echtes Geld geht
sowieso nicht). Ich habe bei mir zu Hause ein inzwischen gut gewachsenes
CAN-Netz, das macht auch Spass, aber auf die Idee das auch mit
Controllern ohne CAN zu machen wäre ich niemals gekommen. Ich finde es
auch wenig spannend, zu versuchen das in Software nachzuklimpern.
Vielleicht schafft man es, wahrscheinlich eher nicht, weil man
irgendwann einsieht, das selbst der Erfolgsfall zu wenig Nutze ist
(ausser fürs Ego vielleicht). Wir leben so schön und so komfortabel,
weil wir die Sachen nutzen, die andere vor uns schon gemacht haben und
netterweise zur Verfügung stellen. Also nehmen.
H.Joachim Seifert schrieb:> Ich persönlich würde da keine 5min dran verschwenden, dass irgendwie in> Software zu realisieren - nicht alles was geht, ist auch sinnvoll.
Versteht sich von selbst, stimme ich dir zu.
A. K. schrieb:> Aber natürlich stellt sich die Frage, ob sich das wirklich lohnt. Es> gibt genug billige Mikrocontroller mit integriertem CAN, deren CAN schon> fix und fertig funktioniert. Nicht erst nach langer Programmierarbeit.
Versteht sich von selbst, stimme ich dir zu.
Fabian F. schrieb:> Außerdem schützt der Transciever den µC vor unschönen Sachen die auf der> Busleitung kommen können. Die meisten Tranciever können Spannungsstöße> in kV-Bereich ab. Da macht dein µC schon lange die Grätsche.
Versteht sich von selbst, stimme ich dir zu.
Und natürlich ist jegliches weiteres Nachdenken über eine
Software-CAN-Controlelr ab hier verboten. Wo kämen wir denn da hin, wenn
jetzt jemand hier noch kreativ wird.
Wieso das denn? Ich kann mir gut vorstellen, dass das einige schon
versucht haben und auch weiterhin versuchen werden. Ne tatsächlich
funktionsfähige Lösung habe ich noch nicht gesehen.
Wenn überhaupt, wäre es ja nur für die kleinen Controller nützlich. Bei
den grösseren Teilen kann man eigentlich immer einen mit CAN on chip
auswählen, kostet deswegen auch nicht mehr.
Und gerade bei den kleinen hat man dann wieder das Problem, dass das
Kerlchen alleine damit ziemlich ausgereizt ist was die Rechenzeit
betrifft. Kostet auch einiges an Programmspeicher, auch nicht gerade in
Hülle und Fülle vorhanden.
Vielleicht macht es Sinn, nur Teillösungen zu programmieren (den listen
only mode z.B.), das kann man sicher gut machen. Man braucht sich nicht
um Arbitrierung, active/passiv-error frame, overload frame oder remote
request zu kümmern. Man bekommt alle Daten und kann damit Aktoren
steuern.
Und irgendwo ins CAN stopfst du ein einzelnes echtes Dummy-CAN, damit
sich wenigstens einer die Mühe macht, die Frames des Masters zu
acknowledgen.
Bloss: Wieso dann CAN? Das geht mit unidirektionalem RS422/485 leichter.
Also ich denke es gibt durchaus Anwendungen für solch einen Soft-Can:
* Bewusst Busfehler erzeugen um Stabilität zu testen
* Debugging auf Bit-Ebene
* Fehler herausfinden, was dort passiert ist.
Sven schrieb:> Also ich denke es gibt durchaus Anwendungen für solch einen Soft-Can:> * Bewusst Busfehler erzeugen um Stabilität zu testen> * Debugging auf Bit-Ebene
Um seine anderen Software-CAN-Implementationen zu testen? :D
> * Fehler herausfinden, was dort passiert ist.
Dafür gibts Logic-Analyzer, DSO's, und fertige CAN-Analyzer/Interfaces.
Das macht aus meiner Sicht auch keinen Sinn. Natürlich kann man CAN in
Software realisieren aber warum?
Will man eine Kommunikation zwischen verschiedenen Geräten aufbauen,
kommt man um den CAN Tranceiver nicht herum. Egal ob als einzelner Chip
oder im µC integriert.
Zum Testen vom CAN würde ich auch auf ein fertiges Interface
zurückgreifen. Wir haben mal einen rudimentären Klon vom CANalyzer und
CANape gebaut. Für kleine Tests geht das mal aber für mehr auch nicht.
Vor allem weil man dann immer mehr Features möchte und dann geht die
Entwicklungszeit quasi ins Unendliche....
Es hat schon seine Berechtigung, dass es Firmen gibt, die sich nur mit
Hard- und Software für CAN ( und natürlich auch andere Protokolle )
auseinandersetzen. Oberflächlich betrachtet ist CAN auch easy: 8
Datenbyte, Priorisierung durch ID, Übertragungsrate auswählen,
Leitungslänge beachten und den Bus terminieren. Geht man ins Detail wird
das ganze dann doch Umfangreicher durch Sachen wie Arbitrierung,
Bit-Stuffing, CRC....
H.Joachim Seifert schrieb:> Wieso das denn? Ich kann mir gut vorstellen, dass das einige schon> versucht haben und auch weiterhin versuchen werden. Ne tatsächlich> funktionsfähige Lösung habe ich noch nicht gesehen.> Wenn überhaupt, wäre es ja nur für die kleinen Controller nützlich. Bei> den grösseren Teilen kann man eigentlich immer einen mit CAN on chip> auswählen, kostet deswegen auch nicht mehr.> Und gerade bei den kleinen hat man dann wieder das Problem, dass das> Kerlchen alleine damit ziemlich ausgereizt ist was die Rechenzeit> betrifft. Kostet auch einiges an Programmspeicher, auch nicht gerade in> Hülle und Fülle vorhanden.> Vielleicht macht es Sinn, nur Teillösungen zu programmieren (den listen> only mode z.B.), das kann man sicher gut machen. Man braucht sich nicht> um Arbitrierung, active/passiv-error frame, overload frame oder remote> request zu kümmern. Man bekommt alle Daten und kann damit Aktoren> steuern.
So was habe ich mal gemacht. Wir mussten bei einem Produkt im nachhinein
auf CAN umsteigen, weil SPI durch EM-Dreck gestört war. Ein µC konnte
von haus aus kein CAN und war auch nicht ersetzbar. Hier haben wir per
Software eine Art Soft-CAN geschrieben, der sich einzelne Bytes vom Bus
geholt hat. Gesendet hat der selber nix. Und dass war schon ein riesen
Aufwand. Insbesondere QC.
Heizer schrieb:> Mit einem stinknormalen uC mit DIO kann man doch auch High- und Low> Signale senden (zumindest an die Leitung an legen)
Sehe ich das richtig, dass Daten nur gesendet werden sollen? Das geht
meiner Einschätzung nach ohne größere Probleme mit einem ganz einfachen
Mikrocontroller (z.B. tiny85) und ohne Transceiver.
Gleiches gilt, wenn Daten nur empfangen werden sollen, etwa um
irgendein Gerät ein- oder auszuschalten.
c-hater schrieb im Beitrag #3813510:
> Pit schrieb:>> Und, last but not least, weil es immer wieder ein innerlicher> Vorbeimarsch ist, die unfähigen C-Frickler mal wieder daran zu erinnern,> auf wie viel Hardwareleistung sie freiwillig verzichten, nur um ihrem> üblen Kult in möglichst reiner Form zu frönen...
Du lebst wahrscheinlich auch in einem Erdloch und benutzt zum kochen,
zähneputzen und Wäsche waschen Steine, weil ja jede Art von
fortgeschritten Werkzeug Blasphemie im Angesicht des Assembler-gottes
ist.
Und während c-hater seinem Fetisch nachgeht bewegt sich die restliche
Welt langsam Richtug model-based-design und darauf basierender
automatische Code-Generierug und lässt auch die C Welt hinter sich...
Früher kontrollierte man den Output vom C-Compiler, das macht heute
keiner mehr. Heute schaut man gelegentlich noch in den Output von
genriertem Code, obwohl das auch schon fast vorbei ist.
Guten Tag allerseits
ich habe eine kurze Frage:
ich habe einen µc mit CAN-Controller von microchip ( pic32), im moment
läuft CAN Transceiver MPC2551 mit.
jetzt möchte ich den MPC2551 durch TJA1051 ersetzen, von pining her,
sind gleich, also keine Layout-Änderung.
soll ich noch software Anpassung auch machen( in CAN-Controller)?
mfg
Tonx
Tonx schrieb:> Guten Tag allerseits> ich habe eine kurze Frage:> ich habe einen µc mit CAN-Controller von microchip ( pic32), im moment> läuft CAN Transceiver MPC2551 mit.> jetzt möchte ich den MPC2551 durch TJA1051 ersetzen, von pining her,> sind gleich, also keine Layout-Änderung.> soll ich noch software Anpassung auch machen( in CAN-Controller)?>> mfg> Tonx
Geht ohne Software-Anpassung! Habe es jetzt für diese Beiden nicht
geprüft, aber ein paar Varianten unterscheiden sich in der Funktion
eines Pins, bitte daher nochmal genauestens prüfen.
Tonx schrieb:> ich habe eine kurze Frage:
Du kannst für eine neue Frage, die ausser den drei Buchstaben "CAN"
nichts mit irgendeinem Vorherigen zu tun hat, ganz problemlos einen
neuen Thread starten.
> jetzt möchte ich den MPC2551 durch TJA1051 ersetzen, von pining her,> sind gleich, also keine Layout-Änderung.> soll ich noch software Anpassung auch machen( in CAN-Controller)?
Was steuert denn die Software an diesem Pegelwandler an? Hast du von
der Software aus Zugriff auf den Pegelwandler?