Forum: Mikrocontroller und Digitale Elektronik (Daten-) Bus Programmieren in C


von Thomas S. (tommythecomputer)


Lesenswert?

Hallo,
ich bin noch recht neu in der Welt der Mikrocontroller und C. Ich habe 
mir schon einige Bücher zu den Themen gekauft und bin am einarbeiten, 
jedoch mein Problem ist folgendes:

Ich möchte später mehrere Microchips ansteuern (Schalter auslesen und an 
eine Zentrale stelle senden und von dort dann die richtige Reaktion von 
einem anderen Mikrocontroller ausführen lassen.

Dazu werde ich einen BUS brauchen, jedoch habe ich schon viel bei Google 
und co gesucht, aber noch keine brauchbare Seite gefunden wo beschrieben 
steht wie ich das realisieren kann.

Ich hoffe ihr könnt mir da ein wenig helfen. (PS: die Seite wo 
beschrieben ist was ein Bus ist usw. von Mikrocontroller.net habe ich 
mir schon durchgelesen).

Kennt ihr vielleicht irgendwo eine Anleitung oder einen guten Quellcode 
(vll. mit dokumentation/Beschreibung)?

Danke

Lg Thomas

von Toadie R. (marcel_r)


Lesenswert?

Das kommt ganz darauf an, welche Eigenschaften der Datenbus haben soll. 
Ggeschwindigkeit, Leitungslänge, Anzahl der Teilnehmer, Datenmenge, etc. 
sind interessante Infos.

Ein Beispiel ist der CAN-Bus. Da gibt es entweder Controller, die 
CAN-Funktionalitäten bereits implementiert haben (z.B. AT90CAN128), oder 
Controller, die mit CAN-Controllern über SPI kommunizieren (z.B. ATmega8 
+ MCP2515)

Wenn nicht CAN, gibt es die Möglichkeit zur seriellen Schnittstelle. Man 
könnte sich aber auch ein eigenes Bussystem mit eigenem, selbst 
ausgedachten Protokoll aufbauen.

von Thomas S. (tommythecomputer)


Lesenswert?

Hallo, also Geschwindigkeit ist in erster Linie zweitrangig.

Leitungslänge:
Vom "verarbeitendem" Controller-MC zu den "Slave" (Ausführenden oder 
Meldenden) MC's rund 1-2 Meter, mehr nicht.

Anzahl der MC's: grob geschätzt 40-45 (auf jeden Fall unter 100)

Datenmenge: Die Slave's sollen lediglich Schalter auslesen und Eingänge 
schalten bzw. Temperatursensoren auslesen. Daten sollen eigentlich nur 
dann gesendet werden von den Sklaven wenn sich etwas ändert, also nicht 
nach jedem mal auslesen. Dürfte sich also in grenzen halten.

Über CAN-Bus habe ich schon viel gelesen, bin aber noch nciht so richtig 
schlau geworden.

Würde als MC's gerne die kleineren Atmel nehmen die aufs STK500 drauf 
passen (ATmega8 usw.) nehmen.

Lg Thomas

von BUSman (Gast)


Lesenswert?

auch wenn ich jetzt gesteinigt werde:
Suche einmal nach Elektor BUS. Da wird die Erstellung einer Vernetzung 
step by step erklärt und umgesetzt.

von Thomas S. (tommythecomputer)


Lesenswert?

Um es nicht zu Geheimnisvoll zu machen:

Ich möchte eine Haussteuerung (früher oder später) auf die Beine 
stellen, die rund 180 Relais schalten kann und ebenfalls rund 180 
Schalter beinhaltet. Das ganze soll dann auch über eine Webseite 
ansteuerbar sein (über einen Raspberry Pi als Webserver) und auch eine 
selbstentwickelte Alarmanlage beinhalten sowie eine Zutrittskontrolle 
für mehrere Türen.

Sollte nicht so extem schwer sein da vieles nur Schalter einlesen und 
passende Befehle ausgeben ist. Lediglich der Bus bereitet mir noch 
sorgen.



Danke für den Tipp, werde ich mir sicher durchlesen.

Hoffe das es direkt für C anwendbar ist, da ich ja die anderen Sprachen 
bisher auch nur deuten kann.

Lg Thomas

von Toadie R. (marcel_r)


Lesenswert?

Thomas S. schrieb:
> Über CAN-Bus habe ich schon viel gelesen, bin aber noch nciht so richtig
> schlau geworden.

warum, woran haperts? Vielleicht ist das ja dein passender Bus.

Ganz grob sendet man mithilfe der zahlreichen CAN-Bibliotheken für C, 
die es im Internet gibt, CAN-Frames mit den "Eigenschaften" Adresse, 
Länge und bis zu 8 Datenbytes. Häufig für digitale Stationen mit 8 
Ein-/Ausgängen auch nur das erste Byte. Eventgesteuertes senden heißt 
dann, dass der Teilnehmer sein Prozessabbild in das erste Byte legt und 
absendet. Anhand der Adresse ist zu erkennen, von wem das kommt. Willst 
Du ihn aber ansprechen, sendest Du ein Frame an eine Adresse, die er 
verarbeitet.

von Thomas S. (tommythecomputer)


Lesenswert?

Aber für das Atmel STK-500 Entwicklungsboard gibt es glaube ich keinen 
Mikrocontroller der auch das CAN-Bus System/Protokoll unterstützt oder 
irre ich mich da jetzt komplett?

Lg Thomas

von Toadie R. (marcel_r)


Lesenswert?


von Thomas S. (tommythecomputer)


Lesenswert?

Ja, aber die sind bisweilen leider sehr teuer. Deswegen würde ich es bei 
Möglichkeit vermeiden.

Ich habe zwar schon einige Adapter gesehen (z.b.: 
https://dx.com/p/ic-socket-plcc20-plcc24-plcc28-plcc32-plcc40-with-plcc-extractor-tool-117717?rt=1&p=2&m=2&r=3&k=1&t=1&s=124488&u=117717 
), weiß aber nicht ob das Funktionieren kann.

Lg Thomas

von holger (Gast)


Lesenswert?

>Aber für das Atmel STK-500 Entwicklungsboard gibt es glaube ich keinen
>Mikrocontroller der auch das CAN-Bus System/Protokoll unterstützt oder
>irre ich mich da jetzt komplett?

AT90CAN128?

Aber CAN ist nichts für dich.

>Hoffe das es direkt für C anwendbar ist,

Ich hoffe das die Sonne morgen aufgeht und es keinen Regen oder
Glatteis gibt.

von KeinerLachtOhneHoden (Gast)


Lesenswert?

Ich hab keine Ahnung von nix, will aber mein Haus vernetzen. Helft mir.
Manche Dinge ändern sich nie.

von Thomas S. (tommythecomputer)


Lesenswert?

Ich denke da hast du was in den falschen Hals bekommen.

Ich möchte ja gerne etwas lernen und habe ja auch nur gefragt ob ihr 
irgendwelche Seiten o.ä. kennt wo man das lernen kann wie man einen Bus 
programmiert.

Ich will nicht einfach copy- and paste-Quellcode haben, sondern ich will 
es sehr wohl verstehen was ich mache.

Dachte ja eigentlich das ein Forum für das stellen von Fragen da ist, 
aber da hab ich hier vielleicht ja das falsche Forum gefunden?

Lg Thomas

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Ich hätte jetzt fast auch den CAN-Bus empfohlen, aber letztlich ist er 
doch zu kompliziert für dein Vorhaben. Du kommst mit einem Master aus, 
der die Slave-Mikrocontroller der Reihe nach abfragt. Also ist keine 
Kollisionsbehandlung bzw. Kollisionsvermeidung notwendig.

An deiner Stelle würde ich das LIN-Bus-Protokoll verwenden. Das ist 
schön einfach, die einzelnen Knoten brauchen nichtmal ein Quarz, weil 
die Synchronisation mitgesendet wird. Das Protokoll kannst du selbst 
programmieren, so dass du keine zusätzlichen Bibliotheken und auch auch 
keine zusätzliche Hardware (z.B. Buscontroller usw.) brauchst.

von Thomas S. (tommythecomputer)


Lesenswert?

Danke, das klingt interessant, werd mal schauen das ich im Netz etwas 
dazu finde wie man das am besten programmiert und wie die Hardware 
vernetzt wird.

Lg Thomas

von Hmm (Gast)


Lesenswert?

Lieber Thomas,

Du bist schon richtig hier.

Erlaube mir Dir zu sagen, das die Art Deiner Fragestellung und der 
Reaktion auf die fachlichen Antworten hier, einen deutlichen Mangel an 
Erfahrung und Problemverständnis offenbaren. Ich will das hier aber 
nicht im Einzelnen belegen. Für den Erfahrenen 
Elektroniker/Programmierer ist das offensichtlich.

Selbstverständlich sagt das weder etwas über Deinen Wert als Person noch 
über Deine vorhandene oder potentielle Fähigkeit aus, Dein Vorhaben zu 
verwirklichen und das Fehlende zu lernen.

Aber in Summe muss man Dir doch deutlich machen, das Du noch mindestens 
Monate wenn nicht Jahre davon entfernt bist, diese Dinge zu verstehen 
und die Antworten hier nachzuvollziehen. Dir ist, meiner Wahrnehmung 
nach, auch nicht gewärtig, das Du bis zu einem, nach Deinen 
Vorstellungen laufenden System, eine Unmenge an Einzelfragen zu 
beantworten hast von denen Du (noch) nichts weisst.

Letztes stellt wiederum uns vor ein Problem. Wir können Dir hier, 
einfach wegen der Menge und der durchaus nicht einfachen Zusammenhänge, 
nicht alle und jedes Problem einzeln erklären, so das Du mit Deinem 
heutigen Wissensstand Dein Projekt verwirklichen kannst.

Im Gegenteil: Du wirst, wie wir auch, Schritt für Schritt vorgehen 
müssen. Erstmal hier die Tutorien durchlesen. C lernen. Ein LED zum 
leuchten und dann zum blinken bringen. Grundlagen der Elektronik lernen. 
Mal eine Schnittstelle programmieren (z.B. RS-232). Ein Menüsystem. Eine 
Sortierroutine. Etcpp. Jeder einzelne dieser Punkte ist eine 
Herausforderung für den Anfänger. Das ist einfach so und es gibt keine 
Abkürzung.

Die etwas launigen Kommentare hier, wollen Dir genau das vermitteln.
Es gibt einfach keinen kurzen Weg.

von Werner (Gast)


Lesenswert?

Thomas S. schrieb:
> Ich möchte ja gerne etwas lernen und habe ja auch nur gefragt ob ihr
> irgendwelche Seiten o.ä. kennt wo man das lernen kann wie man einen Bus
> programmiert.

Es gibt nicht "einen Bus". Das ist ein Oberbegriff. Mach dir also 
erstmal keine Sorgen um die Programmiersprache. Das ist sekundär.

von Thomas S. (tommythecomputer)


Lesenswert?

Das ich noch viel zu lernen habe ist mir klar, jedoch habe ich zu den 
meisten anderen Themen die mit meinem Projekt zu tun haben schon infos 
sammeln können, aber zum Thema Bus habe ich wie schon erwähnt nicht 
wirklich etwas finden können (zu den anderen jedoch schon).

Jedoch finde ich so tolle Kommentare wie:

"Ich hab keine Ahnung von nix, will aber mein Haus vernetzen. Helft 
mir."

oder

"Ich hoffe das die Sonne morgen aufgeht und es keinen Regen oder
Glatteis gibt."

für absoluten Schrott.

Ich verlange von niemanden das er sich hier beteiligt wenn ihn das nicht 
interessiert oder er mir nicht helfen möchte, jedoch kann ich dennoch 
erwarten zumindest keinen Mist auf ernst gemeinte Fragen zu bekommen. 
Wenn es jemanden nicht interessiert soll er einfach zu einem Thema 
posten welches ihn interessiert und mich in ruhe lassen.

Lg Thomas

von Wolfgang (Gast)


Lesenswert?

Thomas S. schrieb:
> Ich möchte eine Haussteuerung (früher oder später) auf die Beine
> stellen,

Dann ist vielleicht das Hausbus Forum die richtige Quelle für Ideen
http://www.mikrocontroller.net/forum/hausbus

von Thomas S. (tommythecomputer)


Lesenswert?

Es geht jetzt aber nicht nur um die Haussteuerung für mich, sondern ich 
will wissen wie das funktioniert, was da dahinter steckt und etwas bei 
der entwicklung davon lernen (über Bauelemente a'la ULN 2803, 
Mikrocontroller usw., Programmieren).

Sonst könnte ich mir ja so ein bescheidenes Fertigkonstrukt zulegen das 
aber absolut keinen (lern-)Spaß mit sich bringt.

Lg Thomas

von Hmm (Gast)


Lesenswert?

Lieber Thomas,

verzeih' mir bitte, wenn ich mich nochmal kritisch zu Deiner Frage 
äussere.

Verstehst Du, das Du hier eine Frage stellst, die äusserst abstrakt und 
global ist?

>wie das funktioniert, was da dahinter steckt...
Wie "was" funktionert?
Was "wohinter" steckt?

Frag' uns bitte etwas Konkretes. Und beachte dabei das soetwas wie "Bus" 
wiederrum ein abstrakter Begriff ist. Zum Beleg nenne ich mal ein paar 
Busse:

USB
SCSI
Firewall
Daten-/Adressbus bei Prozessor (intern/extern)
ATA
S-ATA
CAN
LIN
I2C

Jeder davon hat seinen eigenen Einsatzzweck und besondere Eigenschaften, 
die ihn für seinen Einsatzzweck geeignet scheinen lassen.

Wenn Du uns also fragst: Wie funktioniert ein Bus, müssen wir Dir 
mindestens Neun, können Dir aber noch viel mehr Busse erklären. Das 
ganze wird dann so ein paar Tausend Buchseiten füllen.

Dann kommt dazu, das Busse sich über zwei Dinge definieren: Das 
physische Interface, das die Anzahl Leitungen, die Strom- oder 
Spannungspegel, evtl. Steckverbinder etc. definiert und ein Protokoll, 
d.h. den genauen Ablauf des Austauschs von Informationen definiert.

Was willst Du also genau wissen. Wie gesagt, keine Rundumfragen, bitte!
Beschäftige Dich mit den einzelnen Bussen und frage nach Details. Alles 
andere findest Du in Büchern und im Internet.

von Hmm (Gast)


Lesenswert?

Damit Du in die Lage versetzt wirst, unter Verwendung von üblichen 
Begriffen zu fragen und damit Du die in der Technik üblichen 
Unterscheidungen kennelernst, empfehle ich Dir Lektüre über das 
OSI-Schichtenmodell.
Zur Einführung hier Z.B. : http://de.wikipedia.org/wiki/OSI-Modell

von Thomas S. (tommythecomputer)


Lesenswert?

Ja, ich verstehe was du (Hmm) meinst. Wie gesagt, ich habe leider nur 
den allgemeinen begriff Bus gekannt leider nicht die unterarten.

Werde mich mal mit dem empfohlenen LIN-Bus auseinander setzen und mich 
bei Fragen nochmals melden. Nach der oben geposteten Beschreibung 
scheint das ganz gut für mein Projekt zu passen.

Danke schonmal an alle hilfreichen Helfer.

Lg Thomas

von KeinerLachtOhneHoden (Gast)


Lesenswert?

Thomas S. schrieb:
> Ja, ich verstehe was du (Hmm) meinst.
Ich glaube nicht dass du wirklich irgendwas verstanden hast von dem was 
Hmm gesagt hat.

> Wie gesagt, ich habe leider nur
> den allgemeinen begriff Bus gekannt leider nicht die unterarten.
q.e.d

Es geht nicht um spezielle Unterarten, es geht darum dass Bus so irre 
allgemein ist dass man nicht einfach Bus sprechen kann.
>
> Werde mich mal mit dem empfohlenen LIN-Bus auseinander setzen
Wie soll das gehen ohne entsprechendes Vorwissen beim Thema Elektronik, 
Microcontroller und Programmierung? Das wäre so als ob du dich mal 
schnell über Space Shuttles informierst weil du morgen gerne in den 
Weltraum starten willst.

> Danke schonmal an alle hilfreichen Helfer.
Mich meinst du dabei bestimmt nicht. Liegt aber daran dass dir mit 
dieser herangehenweise niemand auf der Welt helfen kann.

von weinbauer (Gast)


Lesenswert?

Ein Bus ist nur ein Kommunikationskanal, der kann von einem Teilnehmer 
zum nächsten oder von vielen Teilnehmern genutzt werden.

Beispiel Luft, wäre so ein Kommunikationskanal. Du kannst ein 
4-Augengespräch führen oder in einem Saal Deine Information an hunderte 
übertragen.
Die Art der Daten, deren Information, ist vom Übertragungsmedium 
unabhängig.

Oft werden Busse in der Elektronik verwendet um die Schaltungen 
möglichst einfach halten zu können.
Vereinfachtes Beispiel, im PC z.B. hast Du verschiedene Speicher und 
Ein-Ausgabe-Medien (CD, HDD, Graphikkarte, USB-Maus Tastatur, RAM etc.) 
würdest Du nun alle Komponenten fest mit der CPU verdrahten wollen, dann 
bräuchte die CPU 2000 Pins für alle Verbindungen und die Platine wäre 
groß und teuer. Man geht daher hin und hängt die Komponenten auf einen 
Bus parallel, alle Komponenten teilen sich physikalisch die Leiterbahnen 
auf der Platine miteinander, aber, es quatscht immer nur einer auf der 
Leitung.
Was da jede einzelne Komponente quatscht ist dabei physikalisch zunächst 
mal zweitrangig.

von Biertrinker (Gast)


Lesenswert?

weinbauer schrieb:
> Vereinfachtes Beispiel, im PC z.B. hast Du verschiedene Speicher und
> Ein-Ausgabe-Medien (CD, HDD, Graphikkarte, USB-Maus Tastatur, RAM etc.)
> würdest Du nun alle Komponenten fest mit der CPU verdrahten wollen, dann
> bräuchte die CPU 2000 Pins für alle Verbindungen und die Platine wäre
> groß und teuer. Man geht daher hin und hängt die Komponenten auf einen
> Bus parallel, alle Komponenten teilen sich physikalisch die Leiterbahnen
> auf der Platine miteinander, aber, es quatscht immer nur einer auf der
> Leitung.

Leider ein unglückliches Beispiel. Im PC werkelt nicht der BUS für alle 
Teilnehmer, sondern verschiedene BUSse. Je nach Einsatzzweck:
Daten-/Adressbus
I/O Ports
SATA/IDE/SCSI/...
USB/FireWire/RS232/...
und in den komplexen Bridges mit CMOS-RAM, RTC & Co. sind noch andere 
vorhanden.
Der PC ist ein gutes Beispiel, dass der Anwendungszweck den geeigneten 
BUS bestimmt.

von scherzkeks (Gast)


Lesenswert?

also wenn Du AVRs verwenden willst dann schau mal was die an vorhandenen 
Schnittstellen haben, TWI = I2C hat z.B. der Mega88 usw. schon drin.
Bevor Du nun losbastelst schreieb Dir genau auf was Du alles abfragen 
willst, was Du alles steuern willst und wie schnell das von statten 
gehen muß.
Dann suchst Du dir anhand Deiner aufgestellten Daten den Bus heraus der 
diese Anforderungen doppelt erfüllt und bist damit schonmal auf der 
sicheren Seite.

von Biertrinker (Gast)


Lesenswert?

scherzkeks schrieb:
> TWI = I2C

Für Hausautomation einen Geräte-internen BUS? >:-(((

von scherzkeks (Gast)


Lesenswert?

Biertrinker schrieb:
> Für Hausautomation einen Geräte-internen BUS? >:-(((

Gibt es hier sogar einen eigenen Artikel drüber:
http://www.mikrocontroller.net/articles/I2C_als_Hausbus

Aber das war ja nur als Anregung gemeint, er soll sich erstmal Gedanken 
machen was er braucht und dann passend auswählen.
Er könnte auch alles mit Bluetooth oder WLAN oder den "billigen Chinesen 
aus'm Kühlschrank" (die die immer das Licht ausschalten) realisieren ;-P

von Ralph (Gast)


Lesenswert?

Du brauchst in dem Fall einen Multiuser fähigen Bus.
Also bei dem
1. im Protokoll eine Adressierung der Teilnehmer enthalten ist.
2. die gerade passiven Busteilnehmer nicht stören.

In Frage kommen da
Can
Lin
I2C ( bei sehr begrenzter Buslänge )
Ethernet

Ich würde Can bevorzugen, alleine schon wegen aktiven transeiver die 
bereits einen Teil der Fehlerüberwachung und Übertragung in HW 
selbstständig übernehmen.

von Thomas S. (tommythecomputer)


Lesenswert?

Hmm, wenn doch eher Can jetzt empfohlen wird, dann sollte ich nochmal 
genau die Vor und Nachteile der einzelnen Bus-Systeme vergleichen.

Lg Thomas

von Eumel (Gast)


Lesenswert?

Thomas S. schrieb:
> Hmm, wenn doch eher Can jetzt empfohlen wird, dann sollte ich nochmal
> genau die Vor und Nachteile der einzelnen Bus-Systeme vergleichen.
>
> Lg Thomas

Lass doch erstmal eine LED blinken bevor du dich mit sowas beschäftigst.

von Spess53 (Gast)


Lesenswert?

Hi

>In Frage kommen da
>Can
>Lin
>I2C ( bei sehr begrenzter Buslänge )
>Ethernet

RS285 vergessen.

MfG Spess

von Spess53 (Gast)


Lesenswert?

Hi

Ups. RS485 war gemeint.

MfG Spess

von idvdS (Gast)


Lesenswert?

scherzkeks schrieb:
> Aber das war ja nur als Anregung gemeint
Klar, es gibt auch Bobbycars mit Motor. Demnächst Wettbewerber für Smart 
und Co als City Car. ;-)))


Spess53 schrieb:
> RS485 war gemeint
Das schließt CAN nicht aus, oder?

von Ralph (Gast)


Lesenswert?

Spess53 schrieb:
> RS485

RS485 ist nichts anderes als der kabelbebundene Übertragungweg für z.b. 
CAN

Man kann CAN allerdings auch über LWL schicken, dann brauch man 
allerdings andere Transeiver als die Standard Teile.

von OSI (Gast)


Lesenswert?

Ralph schrieb:
> RS485 ist nichts anderes als der kabelbebundene Übertragungweg für z.b.
> CAN
>
> Man kann CAN allerdings auch über LWL schicken, dann brauch man
> allerdings andere Transeiver als die Standard Teile.

OSI, Mädels, OSI, das ist doch nicht so schwer, oder???

von Ralph (Gast)


Lesenswert?

OSI schrieb:
> OSI

so ist es , und rs485 ist da ganz weit unten bei den Schichten.

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.