Hallo liebe Forenmitglieder,
In meinem kleinen Hausbus (bisher I2C und völlig ungeeignet) möchte ich
nun endgülig auf ein einfachereres Bussystem umsteigen. CAN scheint mir
da fast das richtige zu sein, da schön einfach und fehlerquellenfreier.
Die Sache hat nur einen Haken deren Lösung mir nicht bekannt ist. Es
muss allerdings eine Lösung geben, da scheinbar einige von euch CAN im
Hausbus nutzen.
also FRAGE:
Welche Topologie nutzt ihr, dass ihr den CAN-bus in euer Haus bringt?
CAN schreibt ja quasi eine Linientopologie mit Abschlusswiderständen
vor.
Im Haus kann ich aber quasi nur Baumtopologien verwirklichen...
Wie soll das laufen? die 120Ohm Abschluss-Widerstände aufteilen in
mehrere größere?
Oder schafft ihr das wirklich mit einer Linientopologie?
Vielen Dank
Michael
Es gibt HUB Chips für den CAN Bus, z.B. AMIS42700 von ON Semi, mit denen
Du verschiedene CAN-Segmente designen kannst. Damit kannst Du auch eine
Stern-Topologie verwirklichen. Aber auch hier gilt die Regel jedes
Segment ordnugsgemäss mit einem Widerstand zu terminieren.
Linientopologie muss sein.
Wir haben, aufgeteilt in mehrere Stränge mit dem AMIS Chip, bereits über
400 CAN Knoten vernetzt. Mehrere km Kabel.
Und es geht!
Es gab von Maxim, glaube ich, mal eine App. Note wie die Widerstände
aufgeteilt werden muessen, damit du wieder 60Ohm auf dem Kabel hast,
sprich Sterntopo. Mehr kann ich dir dazu aber auch nicht berichten, es
soll aber "theoretisch" funktionieren.
Hmm wie löse ich denn mein Problem?
diese AMIS42700 hab ich jetzt bei keiner meiner Bezugsquellen gefunden,
wobei mir das auch nicht ganz gefällt für quasi jeden Knoten einen
Verteiler zu brauchen...
Es muss doch irgend einen simplen, bezahlbaren, mulimasterfähigen Bustyp
geben den man in Baumstrukturen bringt!
Mit simpel meine ich etwas in Richtung CAN-einfachheit.
Und bezahlbar heißt unter 5€ pro Knoten...
Kann ich durch begrenzen der Baudrate da was machen? ich wüsste eh keine
großen Datenmengen die über den Bus müssten...
Also ich habe hier ein Hausbus-System in der Entwicklung, das Routing
beherrscht, sodass du einfach mehrere Linienbusse vernetzen kannst.
So hat man wirklich von einander unabhängige Segmente, zwischen denen
man allerdings trotzdem kommunizieren kann. Das funktioniert auch
soweit, inklusive Bootloader.
Was mir bisher mehr Sorgen macht, ist der Stromverbrauch: Bisher bin ich
bei ca. 100 mW pro Knoten, mit ein wenig Arbeit schaffe ich wohl auch
noch ca. 60 mW/Knoten. Ist irgendwie immer noch viel, dafür, dass der
Knoten eigentlich nichts tut. Dummerweise kann man den Stromsparmodus
beim von mir eingesetzten MCP2515 nicht nutzen, weil man dann laut
Datenblatt das Frame verliert, das ankommt während der MCP2515 schläft.
Daher ist eine Idee, eventuell "dumme" Knoten einzuführen, die kein CAN
benutzen und schon daher weniger Strom brauchen.
Hallo,
im Forum gab es mal eine Liste oder einen Hinweis darauf, wieviele und
dann wie lang, die Ableger/Stichleitungen beim CAN.-Bus sein durften.
http://www.opendcc.de/info/can/can_info.html dort Netztopologie, Längen,
Reflexionen steht ja eine Datei
http://focus.ti.com/lit/an/slla270/slla270.pdf von TI mit 5 m ist dort
eine Stichleitung angegeben.Wenn aber eine Buchsen/Stecker Kombination
it 3m gerechnet wird, kommat man nicht wirklich weit.
@NochAmBasteln:
wenn der schlafende Empfänger nicht quittiert, wird doch nochmal
gesendet oder nicht, oder wohl, oder doch?
Horst Hahn schrieb:> @NochAmBasteln:> wenn der schlafende Empfänger nicht quittiert, wird doch nochmal> gesendet oder nicht, oder wohl, oder doch?
Eine zuverlässige Nachrichtenverteilung mit Rückmeldung hatte ich zwar
zuerst vor, allerdings ist CAN zum einen sehr zuverlässig,
und zum anderen kann man davon ausgehen, dass jeder Knoten, den man
ansprechen möchte, schläft. Dadurch würden die Nachrichten in jedem Fall
doppelt versendet werden, was auch unelegant ist.
Implementiert sind beide Protokolle, aktuell wird aber das nicht
zuverlässige genutzt.
Denn das zuverlässige erlaubt nur Punkt-zu-Punkt-Verbindungen, und das
ist nicht genug, weil oftmals mehr als ein Knoten angesteuert werden
muss.
Sowas wird aktuell als Broadcast auf Linienebene oder global gemacht,
einfach und schmerzlos, aber ohne Möglichkeit, dass jeder Empfänger
quittiert.
Das ganze sequentiell anstatt per Broadcast zu machen, wäre zwar
möglich, aber doch sehr mühsam.
Und es wäre wohl viel eleganter, wenn der MCP2515 einen Schlafmodus
hätte, wo der Quarz läuft und nur Teile des Chips schlafen, bis
Aktivität auf dem Bus erkannt wird. Und dann sollte man doch wohl
schnell genug aufwachen können. Kennt jemand zufällig einen
Mikrocontroller oder CAN-Controller, der sowas beherrscht?
Also außer AT90CAN*, der braucht schon im IDLE-Modus mehr Strom als mein
ATmeta644 (IDLE) + MCP2515 (aktiv) zusammen.
Schaue mal in das Datenblatt vom STM32F103. Lasse den gemütlich mit 8MHz
ohne PLL laufen. Alle Pheriperieeinheiten kann der Clock einzeln
zugeschaltet werden.
Schaue mal hier, Artikel: STM32
Ich habe mir eine Heizungssteuerung gebaut, mit CAN-Displays in der
Wohnung:
Beitrag "Re: Heizungssteurung im Eigenbau"
(Und der STM32 ist drin verbaut)
Markus Müller schrieb:> Schaue mal in das Datenblatt vom STM32F103. Lasse den gemütlich mit 8MHz> ohne PLL laufen. Alle Pheriperieeinheiten kann der Clock einzeln> zugeschaltet werden.> Schaue mal hier, Artikel: STM32
Das gucke ich mir mal an, sieht wirklich vielversprechend aus. Danke.
Wird wohl langsam Zeit, auch für die Hobby-Projekte auf ARM-Kerne
umzusteigen. Nur schade, dass man dann seinen Code schwer mitnehmen kann
auf die neue Plattform. :-(
Welche Bitrate faehrst du denn mit dem MCP? Ich hab meinen Bus auf
20kBit am Laufen, zuerst alle Pakete einfach 3fach nacheinander gesendet
um mit den ersten beiden die Knoten aufzuwecken (Alternativ nutzloses
Wakeup-Paket vorwegschicken wenn die Events nicht mehrfach auftreten
duerfen), inzwischen ist das rausgeflogen und ich sende nur einfach...
weder die MCPs im Sleep-Mode noch der 90CAN128 im PowerDown-Mode haben
ein Problem damit bereits das erste Paket zu empfangen, da die
Arbitrierungsphase bei 20kBit fuer den Chip wohl gefuehlt 1 Jahr lang
ist ;-)
Der Bus selbst ist einfach als Pseudo-Stern aufgebaut, also zu jedem
Knoten CAN-L/H-hin und CAN-L/H-rueck, also halt 6 statt 4 Leitungen
(incl. Versorgung).
dridders schrieb:> 90CAN128 im PowerDown-Mode
Also mit abgeschaltetem Oszillator? Mir schiene da eher der StandBy
Modus mit laufendem Oszillator angebracht, vorausgesetzt der hat den.
NochAmBasteln schrieb:> Nur schade, dass man dann seinen Code schwer mitnehmen kann> auf die neue Plattform. :-(
Wenn man den richtig schreibt, dann kann man bei bei nicht zu kleinen
Projekten durchaus einiges mitnehmen.
Ich habe beispielsweise einen eigenen CAN Layer, der nach oben hin auf
AVR+MCP2515, PIC16F258, LPC2119, STM32 und Windows (via
FTDI/AVR/MCP2515) ziemlich gleich aussieht. Eine darauf laufende
Anwendung ist dann nicht mehr von den Fisematentchen dieses Teils der
Hardware abhängig.
Hallo zusammen, ich will Timer lernen, aber weiße noch nicht wie man das
programmieren kann, also ich habe ein Programme geschrieben und weiße
nicht ob es gut laufen kann.
Also was sollt das Programm Machen
Der Timer arbeitet in Up-Modus
Der Timer wird beim Systemstart mit einer Zeit von 1,0 Sekunden
initialisiert werden.
P1.0 Startet den Timer
P1.1 Erhöht den Takt um 1s
P1.2 Verringert den Takt um 1s,
ich habe versucht so zu programmieren, kann mir jemand sagen ob es gut
programmiert ist??
TIMER_A_Init
MOV #TACLR,&TACTL ; S e t z t Timer A B i t s z u r ü c k
MOV #TASSEL_1+ID_4+MC_1+TAIE ,&TACTL ; T a k t q u ell
ACLK
Start Timer MOV #0x2000 ,R5 ; Entspricht 1s
MOV #R5 ,&TACCR0 ; Entspricht 1s
ENDE TIMER_A_Init
P1_ISR
BIT.B #BIT0 ,& P1IFG ; I n t e r r u p t von P1.0
ausgelöst?
JNZ ja weiter bei Start Timer
LOOP2 BIT.B #BIT1 ,& P1IFG;I n t e r r u p t von P1.1 a u s g e l ö s
t ?
JZ LOOP1, Nein Weiter bei LOOP1
ADD R5, R5
MOV #R5 ,&TACCR0
BIC.B #BIT1 ,& P1IFG ; L ö s c h e P1.1 im F l a g −
RETI
LOOP1 BIT.B #BIT2 ,& P1IFG; I n t e r r u p t von P1.2 a u s g e l ö s
t ?
JZ LOOP2
SUB R5, R5
MOV #R5 ,&TACCR0
BIC.B #BIT2 ,& P1IFG ; L ö s c h e P1.2 im F l a g −
RETI
ENDE P1_ISR
A.K.
ja, mit abgeschaltetem Oszillator, denn die anderen Modi kann man sich
bei dem Chip auch schenken, solange der Oszi noch laeuft braucht der
Unmengen. RX vom CAN-Transceiver hab ich auf einen der INT-Eingaenge
gelegt, durch die erste Flanke wird der Chip dann aufgeweckt und im
wachen Zustand gehalten bis das Paket da ist.
Wichtig ist natuerlich auch direkt den Transceiver aus dem Sleep-Mode zu
holen, sonst kann der Controller kein ACK senden und der Bus zaehlt
froehlich seine Fehler hoch.
Mein Bus geht mit 20 KBit durchs Haus.
4 Drähte, CAN und Versorgungsspannung 24V. Es bis jetzt nur die
Heizungssteuerung mit zwei Display-Einheiten und einer
Analog-Messwertplatine dran. Alle Einheiten beziehen den Strom aus der
24V Versorgung, Batteriegepuffert. Denn da wo ich wohne ist Stromausfall
jederzeit möglich.
Anbei ein paar Bilder der Display-Einheit (mit STM32F103).
Eingebaut habe ich die Teil-Bestückte Variante.
Vollbestückt hat noch einige Extras wie Echtzeituhr, COM-Port, Relais,
Stiftleisten mit Signalen und Analogeingänge, Feuchte/Temperatur Sensor,
EEPROM.
Wenn's nicht auf die Geschwindigkeit ankommt wäre LIN velleicht noch
eine alternative. Da es als Eindrahtbus konzipiert ist reicht
(theoretisch) eine Leitung und Masse, wobei es sicher nicht schadet
alles auf eine gemeinsame Masse zu ziehen.
Weiß jemand welche Kabellängen bei den typischen LIN Geschwindigkeiten
19.2kbaud bis 2.4k möglich sind?
Kenne es nur aus dem Fahrzeug und da sind es eben nur ein paar meter bei
19.2kbaud.