Forum: Mikrocontroller und Digitale Elektronik Bus per MISO MOSI


von Christian R. (holle)


Lesenswert?

Hallo erstmal :-)

Ich beabsichtige Bus-gesteuerte Module zu erstellen. Von diesen Modulen 
sollten >100 ansteuerbar sein.

Nun dachte ich mir, dass ich es vielleicht so realisieren kann, dass ich 
einfach einige Module parallel betreibe und an diese jeweils in Reihe 
weitere Module hänge.
Die Daten sollen vom PC gesendet werden.

Das "Kaskadieren" (in Reihe) sollte laut dieser Beschreibung 
funktionieren:

https://de.wikipedia.org/wiki/Serial_Peripheral_Interface
siehe Bild 1

Wenn ich es richtig verstanden habe, dann werden die Daten einfach 
ausgewertet und wenn man nicht der Empfänger ist werden diese 
weitergeleitet.

Dazu meine erste Frage: Wie viele kann ich in Reihe hängen (kaskadieren) 
?

Dann sollten welche parallel angeschlosse werden. Das dürfte ja 
eigentlich rein empfangstechnisch funktionieren, problematisch wird es 
aber wenn die Module antworten müssen (z.B. fehlerhaft empfangen), denn 
dann kommt es zu Kollisionen.
Ist das so überhaupt möglich (evtl. ohne das der Slave antwortet)?


Vielleicht hilft es etwas genauer zu erklären, was ich überhaupt will:
Ich möchte vom PC Daten an Module senden, welche diese dann auswerten. 
Der erste Teil soll die Adresse sein und der zweite Teil die Daten.
Stimmt die Adresse nicht überein, dann sollen diese einfach an das 
dahinter hängende Modul weitergereicht werden. Stimmt die Adresse sollen 
die Daten (eine Zahl) auf einer 7-Segment-Anzeige dargestellt werden.
Der Hintergrund ist, dass man eine "Stückliste" an ein Regal schickt und 
die Fächer selber zeigen wie viel vom jeweiligen Fach gebraucht wird.

Für die Module würde ich gerne den ATTiny 2313 verwenden.

Ich habe noch nie mit einem Mikrokontroller gearbeitet, deswegen wollte 
ich vorher mal fragen ob mein Vorhaben so realisierbar ist.

Vielen Dank.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich würde an deiner Stelle I²C benutzen. Dort kannst du jeden Teilnehmer 
einzeln adressieren, und nur der adressierte antwortet.

SPI wird bei vielen Teilnehmern immer langsamer.

von Falk B. (falk)


Lesenswert?

@Christian R. (holle)

>Ich beabsichtige Bus-gesteuerte Module zu erstellen. Von diesen Modulen
>sollten >100 ansteuerbar sein.

Hmm, der 1001 selbstgestrickte Bus?

>Nun dachte ich mir, dass ich es vielleicht so realisieren kann, dass ich
>einfach einige Module parallel betreibe und an diese jeweils in Reihe
>weitere Module hänge.

Warum nicht alles direkt und parallel an den Bus?

>Das "Kaskadieren" (in Reihe) sollte laut dieser Beschreibung
>funktionieren:

>https://de.wikipedia.org/wiki/Serial_Peripheral_Interface
>siehe Bild 1

Naja, SPI-Busse können zwar kaskadierte Slaves nutzen, im Normalfall 
sind die aber NICHT kaskadiert. Also wie auf der Seite oben eine 
Sternverbindung. Und einen SPI-Bus mit 100 Teilnehmern hab ich noch nie 
gesehen. Theoretisch möglich, praktisch eher unsinnig. Denn dann wird 
der Verdrahtungs- und Signalaufwand sehr hoch, man braucht 100 Slave 
Select Signale.

Busse mit vielen (ca. >10) Teilnehmern nutzen "in band addressing", 
sprich, der angesprochene Teilnehmer dekodiert die Adresse aus den 
Busdaten, es gibt kein extra Hardwaresignal dafür. Wie z.B. I2C, CAN, 
Ethernet, etc.

>Wenn ich es richtig verstanden habe, dann werden die Daten einfach
>ausgewertet und wenn man nicht der Empfänger ist werden diese
>weitergeleitet.

Im Prinzip ja.

>Dazu meine erste Frage: Wie viele kann ich in Reihe hängen (kaskadieren)
>?

Siehe oben.

>Dann sollten welche parallel angeschlosse werden. Das dürfte ja
>eigentlich rein empfangstechnisch funktionieren, problematisch wird es
>aber wenn die Module antworten müssen (z.B. fehlerhaft empfangen), denn
>dann kommt es zu Kollisionen.

Nö. SPI hat keine Kollisionen. Denn es gibt nur einen Master und nur 
einen Takt, auf den hören alle synchron.

>Vielleicht hilft es etwas genauer zu erklären, was ich überhaupt will:

Wäre sinnvoll.

>Ich möchte vom PC Daten an Module senden, welche diese dann auswerten.

Ach was?

>Der erste Teil soll die Adresse sein und der zweite Teil die Daten.
>Stimmt die Adresse nicht überein, dann sollen diese einfach an das
>dahinter hängende Modul weitergereicht werden. Stimmt die Adresse sollen
>die Daten (eine Zahl) auf einer 7-Segment-Anzeige dargestellt werden.

Die 1001 LED-Steuerung. Wurde schon erfunden, nennt sich DMX512 und kann 
bis zu 512 Kanäle/Bus ansprechen. Real aber eher deutlich weniger als 
512 Geräte/Bus (meistens hat ein Gerät mehrere logische Kanäle/Adressen)

>Der Hintergrund ist, dass man eine "Stückliste" an ein Regal schickt und
>die Fächer selber zeigen wie viel vom jeweiligen Fach gebraucht wird.

Naja, ist trotzdem nur eine "dumme" Anzeige.

>Für die Module würde ich gerne den ATTiny 2313 verwenden.

Eben das spricht für einen einfachen Bus ala DMX512. Aber auch dort 
würde man vermutlich mehrere Anzeigen an einen Mikrocontroller hängen, 
damit der sich nicht langweilt. Und wenn die räumlichen Abstände nicht 
zu groß sind, ist das auch besser, man braucht weniger Busteilnehmer.

>Ich habe noch nie mit einem Mikrokontroller gearbeitet, deswegen wollte
>ich vorher mal fragen ob mein Vorhaben so realisierbar ist.

Im Prinzip ja, für einen Anfänger ab schon viel Holz.

von Falk B. (falk)


Lesenswert?

@Jörg W. (dl8dtl) (Moderator)

>Ich würde an deiner Stelle I²C benutzen. Dort kannst du jeden Teilnehmer
>einzeln adressieren, und nur der adressierte antwortet.

Ja, aber nicht wenn das Ganze über mehrere Dutzend Meter verteilt ist.

>SPI wird bei vielen Teilnehmern immer langsamer.

Nö.

von Cyblord -. (cyblord)


Lesenswert?

Christian R. schrieb:
> Ich habe noch nie mit einem Mikrokontroller gearbeitet, deswegen wollte
> ich vorher mal fragen ob mein Vorhaben so realisierbar ist.

Und wieso will ein blutiger Anfänger direkt mal seinen eigenen kleinen 
Bus erfinden und beschäftigt sich nicht erst mal mit bekannter und 
dokumentierter Materie?

Diese Idee ist, und ich halte mich hier extrem zurück, sub-intelligent.
Denn egal ob deine Idee gut oder schlecht ist, du kannst sie doch 
sowieso nicht umsetzen. Also was solls dann?

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Man muss aber sagen, dass dieser Anfänger nicht ganz dumm sein kann, 
denn er hat nachgefragt bevor er begonnen hat, drauf los zu basteln. 
Oft sehen wir hier ja das Umgedrehte: Der Anfänger überlegt sich eine 
Lösung zu seinem Problem, läuft auf ein Hindernis auf und fragt erst 
dann nach ob seine Lösung überhaupt sinn macht.

von Cyblord -. (cyblord)


Lesenswert?

M. K. schrieb:
> Man muss aber sagen, dass dieser Anfänger nicht ganz dumm sein kann,
> denn er hat nachgefragt bevor er begonnen hat, drauf los zu basteln.
> Oft sehen wir hier ja das Umgedrehte: Der Anfänger überlegt sich eine
> Lösung zu seinem Problem, läuft auf ein Hindernis auf und fragt erst
> dann nach ob seine Lösung überhaupt sinn macht.

Unsinn. So läuft das doch immer. Nichts können aber im Forum über das 
ultra komplexe Projekt quatschen.

Außerdem:
> Denn egal ob deine Idee gut oder schlecht ist, du kannst sie doch
> sowieso nicht umsetzen. Also was solls dann?

von S------- R. (simonr)


Lesenswert?

Falk B. schrieb:
> @Jörg W. (dl8dtl) (Moderator)
>
>>Ich würde an deiner Stelle I²C benutzen. Dort kannst du jeden Teilnehmer
>>einzeln adressieren, und nur der adressierte antwortet.
>
> Ja, aber nicht wenn das Ganze über mehrere Dutzend Meter verteilt ist.

Auch da gibt es Tricks. Beispielsweise aktive Pullups oder gleich 
Bus-Translator auf 12V Diff-Twisted Pair. Ist sicher nicht der ideale 
Einsatzzweck von I2C, aber hier tatsächlich ganz gut geeignet, denn:

Billig und einfach anzusprechen und Hardware ist ebenfalls spottbillig 
verfügbar.

Technisch am schönsten ist natürlich sowas wie Ethernet oder CAN, aber 
für ein paar 7-segmenter gleich ein solchen Protokoll ? Och nöö

Gruß, Simon

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falk B. schrieb:
> @Jörg W. (dl8dtl) (Moderator)
>
>>Ich würde an deiner Stelle I²C benutzen. Dort kannst du jeden Teilnehmer
>>einzeln adressieren, und nur der adressierte antwortet.
>
> Ja, aber nicht wenn das Ganze über mehrere Dutzend Meter verteilt ist.

I²C kann man praktisch beliebig langsam machen.

Aber ich würde dir Recht geben, DMX ist sinnvoller.

>>SPI wird bei vielen Teilnehmern immer langsamer.
>
> Nö.

Wenn man viele kaskadiert (so wie angedacht), dann muss man zum 
Erreichen des Nten Teilnehmers erst (N-1) · 8 Bit durchtakten.  Sowas 
macht man gelegentlich, wenn die Slaves einfache 74595 sind.

: Bearbeitet durch Moderator
von S. R. (svenska)


Lesenswert?

Ich stelle mir gerade so ein Regal vor, 8 Fächer nebeneinander, 8 Fächer 
übereinander. Mit SPI sind das pro Reihe (also 8 Anzeigen) ein 
Chipselect und ein Schieberegister pro Ziffer. Oder einen 
Mikrocontroller pro Reihe. Finde ich jetzt als Ansatz nicht soo 
bescheuert.

Allerdings verschiebt sich das Problem dann trotzdem darauf, die 
richtige Reihe im richtigen Regal anzusprechen - und da braucht man ein 
richtiges Bussystem, weil das räumlich getrennt ist. Hängt vom Lager ab, 
was da geeignet ist.

von Rolf M. (rmagnus)


Lesenswert?

M. K. schrieb:
> Man muss aber sagen, dass dieser Anfänger nicht ganz dumm sein kann,
> denn er hat nachgefragt bevor er begonnen hat, drauf los zu basteln.
> Oft sehen wir hier ja das Umgedrehte: Der Anfänger überlegt sich eine
> Lösung zu seinem Problem, läuft auf ein Hindernis auf und fragt erst
> dann nach ob seine Lösung überhaupt sinn macht.

Nein, das wäre zu einfach. Er fragt, wie er über sein Hindernis drüber 
kommt, überzeugt davon, dass das ja ein Klacks ist. Die Antwortenden 
wundern sich zunächst, weil die Frage schon keinen Sinn macht. Dann 
versuchen sie rauszufinden, was er eigentlich ursprünglich will und, ihn 
davon zu überzeugen, dass sein Ansatz nix taugt, was aber nicht gelingt.

von Name: (Gast)


Lesenswert?

Rolf M. schrieb:
> Nein, das wäre zu einfach. Er fragt, wie er über sein Hindernis drüber
> kommt, überzeugt davon, dass das ja ein Klacks ist. Die Antwortenden
> wundern sich zunächst, weil die Frage schon keinen Sinn macht. Dann
> versuchen sie rauszufinden, was er eigentlich ursprünglich will und, ihn
> davon zu überzeugen, dass sein Ansatz nix taugt, was aber nicht gelingt.

Jetzt mal halblang. Außer der ersten Frage kam doch nichts mehr.

Er wird seinen Ansatz schon noch überdenken. Spätestens dann, wenn er 
mit der Implementierung beginnt.

Es ist einfach notwendig, auch mal in eine falsche Richtung zu denken 
und zu gehen. Wer sich selber Denkverbote auferlegt, der kommt nie 
voran.
Dadurch lernt man dazu.

von OhLord (Gast)


Lesenswert?

Cyblord -. schrieb:
> Und wieso will ein blutiger Anfänger direkt mal seinen eigenen kleinen

Deine Einschätzung ist FALSCH. Er ist ein Anfänger aber NOCH nicht 
blutig. Phrasendrescher.

von Rolf M. (rmagnus)


Lesenswert?

Name: schrieb:
> Rolf M. schrieb:
>> Nein, das wäre zu einfach. Er fragt, wie er über sein Hindernis drüber
>> kommt, überzeugt davon, dass das ja ein Klacks ist. Die Antwortenden
>> wundern sich zunächst, weil die Frage schon keinen Sinn macht. Dann
>> versuchen sie rauszufinden, was er eigentlich ursprünglich will und, ihn
>> davon zu überzeugen, dass sein Ansatz nix taugt, was aber nicht gelingt.
>
> Jetzt mal halblang. Außer der ersten Frage kam doch nichts mehr.

Ich hatte das gar nicht mal auf den TO bezogen, sondern nur meine 
allgemeinen Erfahrungen aus dem Forum geschildert.

Name: schrieb:
> Es ist einfach notwendig, auch mal in eine falsche Richtung zu denken
> und zu gehen.

Es ist aber auch notwendig, irgendwann zu erkennen, dass es die falsche 
Richtung ist. Und es ist notwendig, die Richtung dann auch zu 
korrigieren. Sonst kommt man nämlich auch nicht voran.

> Wer sich selber Denkverbote auferlegt, der kommt nie voran.
> Dadurch lernt man dazu.

Wobei man vieles, aber nicht zwingend alles mal selber falsch gemacht 
haben muss, um zu lernen.

von Peter D. (peda)


Lesenswert?

Christian R. schrieb:
> Ich beabsichtige Bus-gesteuerte Module zu erstellen. Von diesen Modulen
> sollten >100 ansteuerbar sein.

Dafür gibt es bereits bewährte Lösungen, z.B. RS-485. Noch einfacher ist 
natürlich CAN, z.B. ATmega16M1.

Christian R. schrieb:
> Für die Module würde ich gerne den ATTiny 2313 verwenden.

SPI und AVRs stehen so ziemlich auf Kriegsfuß, insbesondere, wenn der 
Slave auch senden soll. Sichere Datenübertragung ist damit ein Horror.
Erst einige neuere AVRs haben Interrupt-Level und gepuffertes SPI.
Und der ATtiny2313 hat gar kein SPI sondern nur ne USI-Krücke.

von A. S. (Gast)


Lesenswert?

Wenn Du sowas wirklich selber machen willst und Zeit und Elan dafür 
hast, ...


Ich würde Dir Uart statt SPI empfehlen.

1) µC mit 1 Uart und genügend IO-Pins für 7-Seg-Anzeige + ggf. 
Adressschalter auswählen, 7-Seg + Adresschalter etc. zum laufen bringen 
(Hallo-Welt LED ist halt ein Segment)

2) Uart RX zum laufen bringen. Als Inverter einen HC-14 mit 1k 
Serienwiderstand am Eingang.

Wenn Du nun eine '5' sendest, sollten die LEDs eine '5' anzeigen.

3) Uart TX zum laufen bringen : Einfach alles was reinkommt auch 
rauspusten, im RX-Interrupt. Als Sender-Inverter reicht ebenfalls ein 
HC14 mit 1k Ausgangswiderstand. Das reicht auch, um am PC zurück zu 
lesen, notfalls vorläufig mit 5V-Versorgungspannung arbeiten.

4) Adressierung. Egal wie Du Dir die gedacht hast, realisiere die. Und 
zeige an Deinem Modul nur dann die Zahl an, wenn sie "an das Board" 
gesendet wurde.

5) Wenn ein Board läuft, dann mache Dir ein paar Boards mit je 2 
4-poligen Steckern A (Eingang) und B(Ausgang)
1
       A     B
2
Pin1   5V    5V
3
Pin2   Rx    Tx
4
Pin3   K     K
5
Pin4   GND   GND
K steht hier für Kurzschluss, einfach durchverbinden. Du kannst jetzt 
alle Boards hintereinander schalten und ausprobieren. Wenn Du am letzten 
Board an Stecker B Pin2 mit Pin3 verbindest, läuft das Signal auch 
zurück zum PC.

6) Längen optimieren
Wenn das soweit läuft, dann kannst Du (mit 2 Schaltungsänderungen, also 
vorher fragen!), beliebig lange Ketten solcher Module aufbauen. Mit etwa 
10m zwischen 2 Modulen und Baudraten bis 115200.

Du must dabei jedoch die Versorgungsspannung sichergestellen, d.h. 
Zwischeneinspeisungen, sehr dicke Kabel oder z.B. 12V und Schaltregler 
auf jedem Modul.

Da Du alles, was Du sendest, am Ende auch wieder empfängst, weisst Du, 
ob die Kette OK ist und ob alle die richtigen Daten bekommen haben.

Der Begriff ist Daisy Chain, Eine Kette von Gänseblümchen.

von Christian R. (holle)


Lesenswert?

Erst mal sorry für die späte Antwort.

Warum sind manche gleich so aggro?
Ich habe doch lediglich etwas gefragt. Es wäre schön, wenn das sachlich 
bleiben würde. Danke.

Zum Thema "Anfänger und komplexes Projekt" :
Ja, ich bin ein Anfänger, aber das war sicher jeder einmal.
Dass ich gleich so ein großes Projekt machen will ist meiner Schule 
(Elektrotechniker) geschuldet.
Ich muss eine Projektarbeit machen, und da wird der Prüfer von einem 
einfachen Blinklicht sicher nicht beeindruckt sein.

Zum Thema MISO/MOSI:
Da ich einen akuten Portmangel habe und ich MISO/MOSI eh frei lassen 
wollte, weil der yC darüber beschrieben wird (Upgrade-Möglichkeit 
erhalten) lag es nah erstmal zu versuchen den Bus darüber laufen zu 
lassen.
Laut Wiki kann man damit bis in den MHz-Bereich, was eine recht hohe 
Geschwindigkeit gewährleistet.
Mein Plan ist nun, dass ich "Verteiler" erstelle, welche für jede 
"Regal-Etage" (Zeile) verwendet wird.
Diese lesen den ersten Teil der Adresse und geben das Paket in den 
Horizontalen Zweig weiter, oder halt an den nächsten Verteiler.
Die Module lesen nun den zweiten Teil der Adresse und werten die Daten 
aus, oder geben das Paket weiter an das nächste Modul.

Nun, ich rechne das mal aus (bitte korrigiert mich wenn ich hier einen 
Fehler mache).
Ich übertreibe extra etwas, um den Grenzfall ermitteln zu können.
Mal angenommen, ich hätte ein Monster-Regal mit 60 "Zeilen" und 250 
"Spalten" (also 15k Fächer).
Im ungünstigsten Fall muss das letzte Modul angesprochen werden.
Das Datenpaket besteht nun z.B. aus:
- 4x Start-Bit
- 6x Bit für vertikale Adresse
- 8x Bit für horizontale Adresse
- 4x Bit für Prüfsumme
- 4x Stop-Bit
________
26 Bit (also 26 Takte je Datenpaket). Ich rechne nun mit 40 Takte, um 
Zeit für das Verarbeiten zu haben (ich übertreibe es ja gerade).
Im ungünstigsten Fall muss das Paket 60 * durch die Verteiler laufen, 
und danach nochmal 250 * durch die Module.
310 * 40 Takte = 12400 Takte.
Wenn ich noch eine Antwort vom Slave zum Master berücksichtige muss ich 
die Zeit * 2 nehmen (OK, das Paket wäre kürzer, aber egal...)
Somit sind 24800 Takte nötig, um ein Paket an die ungünstigste Stelle zu 
schicken.
Im günstigsten Fall wären es: 40 Takte * 2 (eine Weiterleitung vom 
Verteiler zum Modul) = 80 Takte

Somit habe ich einen Mittelwert von 6240 Takte je Paket.
Nun gehe ich wieder vom schlimmsten Fall aus, nämlich dass JEDES Fach 
ein Paket erhält.
Das wären dann 15000 Fächer * 6240 Takte = 93,6 Millionen Takte.
Bei einer Frequenz von 1 MHz wären somit 1,5 Minuten nötig, was in der 
Tat sehr lange wäre.

Im Normalfall kann man aber eher davon ausgehen dass vielleicht 100 
Fächer benötigt werden, dann sind das nur 624000 Takte, was bei 1 MHz 
nur 0,6 Sekunden sind (bei einem gleich langen Datenpaket).
Ich denke das man bei einer Taktfrequenz von 1 MHz eine ausreichende 
Geschwindigkeit erreicht.


Damit nun niemand denkt, dass ich "unbelehrbar" bin, was ich gerade 
geschrieben habe soll nur erklären, WARUM ich diesen Ansatz verfolgt 
habe (da ich dafür ja gleich Kritik geerntet habe).

Das mit dem UART muss ich mir mal ansehen. Vielen Dank dafür, achs.

Da habe ich mir anscheinend einen ordentlichen Klotz ans Bein gebunden.

von A. S. (Gast)


Lesenswert?

Zu deinen Berechnungen: Busse synchron oder Punkt zu Punkt haben 
komische Eigenschaften, die nicht sofort einleuchten.

In Kürze: egal, du bist immer in etwa 2 x 15k x 4 Byte fertig, also etwa 
1s für alle,

Wenn ein Telegramm weitergeleitet werden muss, kann schon das nächste 
empfangen werden.

Zur Übung überleg dir, du hättest nur 3 x 3 Module, aber mit 100m Kabel 
dazwischen.

von Christian R. (holle)


Lesenswert?

Da komme ich nicht so ganz mit...
Wenn ich das nächste Paket los schicke, während das vorherige noch 
unterwegs ist und dann ein Übertragungsfehler passiert (CheckSum stimmt 
nicht), was ist dann? Der Slave sagt "Paket fehlerhaft, bitte nochmal 
schicken" und der Master schickt dann das letzte Paket nochmal (aber das 
vorherige war Fehlerhaft).

Wo ist denn da nun mein Gedankenfehler? o_0

von A. S. (Gast)


Lesenswert?

Mal es auf für 3 x 3 und Takte die Telegramme durch.

Es gibt kein "synchron" und "weiterleiten" gleichzeitig.


Und "Antwort" bei SPI ist (auch ohne weiterleiten) noch ein Kapitel für 
sich.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christian R. schrieb:
> Laut Wiki kann man damit bis in den MHz-Bereich

Dann bist du aber schnell bei Leitungen, die "elektrisch lang" sind und 
folglich ganz anders behandelt werden wollen als ein kurzes Stück Draht. 
Solch eine Leitung will auf beiden Seiten mit ihrem Wellenwiderstand 
abgeschlossen werden, damit die Reflektionen nicht das Signal zu sehr 
stören.

Da kommst du dann mit einem bewährten Bussystem (Beispiele wurden ja 
einige genannt) deutlich besser.

von Peter D. (peda)


Lesenswert?

In der realen Welt werden aber Deine SPI-Signale nicht ungestört die 
100m Kabel passieren. SPI benutzt man daher nur innerhalb eines Gerätes.

Für die rauhe Außenwelt nimmt man jedoch Busse mit differentiellen 
Signalen und Interfaces mit Mehrfachabtastung eines Bits.
Sehr komfortabel ist dabei der CAN-Bus. Er macht schon in Hardware die 
Arbitrierung, Frameerkennung, CRC-Check und Retry.

von S. R. (svenska)


Lesenswert?

Christian R. schrieb:
> Warum sind manche gleich so aggro?

Willkommen hier im Forum.

> Ich muss eine Projektarbeit machen, und da wird der Prüfer von einem
> einfachen Blinklicht sicher nicht beeindruckt sein.

Das ist eine Frage des Verkaufsarguments. :-)

> Laut Wiki kann man damit bis in den MHz-Bereich, was eine recht hohe
> Geschwindigkeit gewährleistet.

Vergiss das mal ganz schnell, wenn du dir auch nur ein bisschen 
Kabellänge vorstellst. Je länger die Leitung, desto mehr Spannungsabfall 
über der Länge (Widerstandsbelag in Ω/m), bis das Signal nicht mehr 
ankommt, und desto schlechter die Signalqualität, bis das Signal nicht 
mehr erkannt wird.

Da brauchst du Bustreiber (Verstärker) und anderes Zeugs, was dir 
möglicherweise in die Programmierpins pfuscht. Das ist dann nicht mehr 
ganz trivial (aber eher einfach lösbar).

> Mein Plan ist nun, dass ich "Verteiler" erstelle, welche für jede
> "Regal-Etage" (Zeile) verwendet wird.

Gute Idee: Großes Problem in kleinere Probleme zerteilen.

Und wenn du schon dabei bist, kannst du dir die gesamte Adressierung von 
Verteiler zu Anzeigen schenken, weil jeder Verteiler nur eine kleine 
Anzahl von Anzeigen ansteuert. Mit einfachen Schieberegistern an jeder 
Anzeige ist das Problem ohne Programmierung gelöst.

> Ich übertreibe extra etwas, um den Grenzfall ermitteln zu können.
> Mal angenommen, ich hätte ein Monster-Regal mit 60 "Zeilen" und 250
> "Spalten" (also 15k Fächer).

Dann hättest du im einfachsten Fall 60 Adressen (eine pro Modul) und pro 
Modul 250 Anzeigen (wenn die zweistellig sind, 16 Bit pro Anzeige). Das 
heißt, jeder Verteiler taktet grundsätzlich 4000 Bits (500 Bytes) raus, 
wenn er eine Anzeige aktualisieren möchte. Kein Multiplex nötig.

Die Werte selbst musst du nichtmal im Verteiler speichern, denn 
theoretisch kannst du den SPI-Bus auch als Ring schalten und für jedes 
Update einmal im Kreis takten. Damit skaliert das auch auf unendlich 
viele Anzeigen pro Zeile (bzw. bis dir ein Update zu lange dauert) und 
ist flexibel genug für unterschiedliche Regalgeometrien (unten und oben 
ist Großgerät mit 4 Fächern, in der Mitte ist Kleinkram mit 20, 40 und 
60 Fächern pro Zeile).

Nachtrag: Wenn du je zwei Zeilen kombinierst, hast du auch die 
Kabelverschwendung reduziert. :-D

> Im ungünstigsten Fall muss das letzte Modul angesprochen werden.
> Das Datenpaket besteht nun z.B. aus:
> - 4x Start-Bit
> - 6x Bit für vertikale Adresse
> - 8x Bit für horizontale Adresse
> - 4x Bit für Prüfsumme
> - 4x Stop-Bit

Besser: Alles in Bytes (je 1 Byte für Command, Zeile, Spalte, Wert, 
Checksum). Das macht die Verarbeitung schneller und vor allem einfacher.

> Wenn ich noch eine Antwort vom Slave zum Master berücksichtige muss ich
> die Zeit * 2 nehmen (OK, das Paket wäre kürzer, aber egal...)

Bei SPI gibt es prinzipiell kein "Senden" und "Empfangen". Beides läuft 
gleichzeitig (naturgemäß muss der Empfänger aber erstmal wissen, was er 
senden soll, bevor er senden kann, aber das ist erstmal nebensächlich).

> Nun gehe ich wieder vom schlimmsten Fall aus,
> nämlich dass JEDES Fach ein Paket erhält.

Solche Fälle kann man optimieren (1 Byte Command, 1 Byte Zeile, N Byte 
Daten, 1 Byte Checksum). Außerdem kann man komprimieren.

> Das mit dem UART muss ich mir mal ansehen. Vielen Dank dafür, achs.

Zumindest für die Verteiler würde ich ein richtiges Bussystem 
anvisieren. Die einzelnen Anzeigen würde ich dagegen aus praktischen 
Gründen (250 Controller programmieren macht keinen Spaß) "dumm" machen 
wollen. Also Spannungsregler+Schieberegister+Bustreiber+Anzeige, mehr 
muss da nicht rauf.

> Da habe ich mir anscheinend einen ordentlichen Klotz ans Bein gebunden.

Viel Lötarbeit, etwas Programmierung, ein gutes Stück Gehirnschmalz. Wie 
du selbst festgestellt hast, ist eine Minute/Update nicht sinnvoll, also 
musst du da optimieren.

Solche Überschläge kenne ich als Bierdeckelrechnungen und die sind oft 
genug Anstoß für gute Ideen. :-)

: Bearbeitet durch User
von Christian R. (holle)


Lesenswert?

Nachdem ich nun nochmal einiges über die verschiedenen Bus-Systeme 
gelesen habe bin ich zu folgendem Schluss gekommen:

- CAN-Bus ist ungeeignet, da dieser nur für kurze Distanzen gedacht ist 
(< 2m). Zudem ist das dann keine Low-Cost-Lösung mehr.

- MISO/MOSI würde theoretisch gehen, da die Signale ja mit jedem Modul 
aufgearbeitet werden würden, aber da ist das gleiche Problem mit der 
kurzen Distanz. Die Taktrate müsste dermaßen runtergeschraubt werden, 
dass eine Übertragung an viele Teilnehmer einfach viel zu lange dauern 
würde.

- RS-485 scheint noch am besten geeignet zu sein (danke Peter).
Die Distanz kann je nach Taktrate bis zu 500 m betragen. Für mein 
Vorhaben reichen aber auch schon 10 Meter, wo man Datenraten von 10 
Mbit/s erreichen kann. Aber selbst bei einer Distanz von 500 m erreicht 
man noch Datenraten von 100 kbit/s. Das ist mehr als ausreichend. Zudem 
werden alle Teilnehmer parallel angesprochen, was die Geschwindigkeit 
zur Nebensache werden lässt.
Der Nachteil dabei ist, dass max. 32 Teilnehmer möglich sind. Das kann 
ich aber wieder umgehen indem ich "Verteiler" bastle, welche die Daten 
empfangen, den ersten Teil der Adresse auswertern und wenn es die eigene 
Adresse ist, dann werden die an 32 weitere Teilnehmer gesendet. Somit 
sind > 1000 Teilnehmer möglich, was völlig ausreichend ist.

Ist mein Projekt so nun realisierbar?

von Falk B. (falk)


Lesenswert?

Christian R. schrieb:

> Nachdem ich nun nochmal einiges über die verschiedenen Bus-Systeme
> gelesen habe bin ich zu folgendem Schluss gekommen:

Oder eher Fehlschluß?

> - CAN-Bus ist ungeeignet, da dieser nur für kurze Distanzen gedacht ist
> (< 2m). Zudem ist das dann keine Low-Cost-Lösung mehr.

Unfug! CAN geht je nach Datenrate bis mehrere hundert Meter!

https://de.wikipedia.org/wiki/Controller_Area_Network#Maximale_%C3%9Cbertragungsrate_und_Leitungsl%C3%A4nge

Das war ja wohl GAR NICHTS!

> - MISO/MOSI würde theoretisch gehen, da die Signale ja mit jedem Modul
> aufgearbeitet werden würden, aber da ist das gleiche Problem mit der
> kurzen Distanz. Die Taktrate müsste dermaßen runtergeschraubt werden,
> dass eine Übertragung an viele Teilnehmer einfach viel zu lange dauern
> würde.

Auch Käse. Selbst mit einfachen 5V CMOS Pegeln kommt man viele Meter, 
mitdifferentiellen Pegeln ala RS422 Dutzende Meter.

> - RS-485 scheint noch am besten geeignet zu sein (danke Peter).

RS485 ist ein elektrischer Standard, die logische Ebene ist eine ganz 
andere Frage. Man kann SPI mit MISO/MOSI etc. auch per RS485 machen.

> Der Nachteil dabei ist, dass max. 32 Teilnehmer möglich sind.

Schon wieder falsch. Es gibt Empfänger mit erhöhtem Eingangswiderstand, 
da kann man bis zu 128 oder gar 256 Empfänger an einen physischen Bus 
klemmen.

> Ist mein Projekt so nun realisierbar?

Du hast verdammt schlecht recherchiert und nix kapiert. Glückwunsch!

von A. S. (Gast)


Lesenswert?

Christian R. schrieb:
> Ist mein Projekt so nun realisierbar?

Ja.

Wobei Die Umsetzer, also der 2-Ebenen-Betrieb nicht trivial ist. 
Einfacher und robuster (Programmierung, Fehlersuche) ist die 
Punkt-Zu-Punkt-Verbindung.

Machst Du Halb-Duplex mit je 2 Leitungen oder Voll-Duplex mit je 4?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Christian R. schrieb:
> Ist mein Projekt so nun realisierbar?

Nein. Never. Ever.
Da geht voll in die Hose. Da bin ich mir ziemlich sicher.
Mach irgendwas anderes, nicht so (raeumlich) umfangreiches als 
"Projektarbeit".
Das soll ja auch irgendwann mal fertig werden. Wenn du noch nie mit 
einem µController gearbeitet hast, dann mach' erstmal was Simpleres, wo 
nur eine ueberschaubare Anzahl von Problemen auf dich zukommt.

Gruss
WK

von Stefan F. (Gast)


Lesenswert?

Wenn du keine Erfahrung mit Signalübertragung auf langen Leitungen hast, 
wirst du ernsthafte Probleme bekommen. Informiere Dich ggf. zu den 
Begriffen "Wellenwiderstand", "Leitungskapazität" und "Terminierung".

Ich würde vermeiden, 100 Geräte zu verketten, da bei einem einzigen 
Defekt alle Geräte dahinter auch betroffen sind. Wesentlich sinnvoller 
scheint mir eine Sternförmige Infrastruktur, eventuell mit mehreren 
Ebenen.

I²C klingt einfach, vor allem weil es dazu fix und fertige Repeater und 
Multiplexer gibt. Aber I²C ist nur für kurze Leitungen gedacht. Bei mehr 
als 2 Metern muss man auch hier wieder die Regeln für lange Leitungen 
berücksichtigen. Wenn Du Dich zu dem Thema einliest wirst du merken, 
dass die Ausgangstreiber der I²C Busteilnehmer gar nicht gut zu 
korrekter Terminierung passen. I² kann man zwar beliebig langsam takten, 
aber die Signale müssen dennoch eine gewisse Flankensteilheit haben, die 
du mit langen Leitungen nicht einhalten kannst. Mit hohem Zusatzaufwand 
kann man das alles in den Griff bekommen, aber ich halte das für 
Quatsch, denn es gibt ja längst RS485 und CAN.

Diese beiden Bus-Systeme sind Kandidaten, die Du Dir mal anschauen 
solltest (nachdem Du die Theorie der Signalübertragung auf langen 
Leitungen zumindest ungefähr verstanden hast).

Das oben genannte DMX basiert übrigens auf RS485. RS485 
Schnittstellenmodule bekommst du bei Aliexpress für etwa einen Euro pro 
Stück. Daran kannst du jeden beliebigen Mikrocontroller anschließen.

von Stefan F. (Gast)


Lesenswert?

Falk B. schrieb:
> Du hast verdammt schlecht recherchiert und nix kapiert. Glückwunsch!

Das war zwar nicht nett, aber Recht hat er.

von Stefan F. (Gast)


Lesenswert?

Korrektur:

> Wesentlich sinnvoller scheint mir eine Sternförmige Infrastruktur,
> eventuell mit mehreren Ebenen.

Sternförmige Infrastruktur oder Bus, eventuell mit mehrere Ebenen

von Rainer V. (a_zip)


Lesenswert?

M. K. schrieb:
> Der Anfänger überlegt sich eine
> Lösung zu seinem Problem, läuft auf ein Hindernis auf und fragt erst
> dann nach ob seine Lösung überhaupt sinn macht.

In der Regel wird er wohl eher vom Forum darauf aufmerksam gemacht, dass 
seine Lösung kaum Sinn macht :-)

Peter D. schrieb:
> Dafür gibt es bereits bewährte Lösungen, z.B. RS-485. Noch einfacher ist
> natürlich CAN, z.B. ATmega16M1.

CAN kenne ich jetzt nicht so, aber da scheint mir ein gehöriger 
Software-Overhead nötig. Deshalb würde ich mit RS-485 beginnen. 
Literatur findet sich ja genug...
Wir hatten vor langer Zeit ein Projekt, wo ca. 40 Rechnereinschübe(keine 
PC's natürlich) verteilt auf 3 Schaltschränke über RS-485 kommunizieren 
mußten. Das war nicht nur nervenaufreibend sondern auch extrem schwer zu 
testen!
Deshalb empfehle ich dem TO, erst mal einen "kleinen" Bus 
auszuprobieren. Wenn das mit meinetwegen 10 Slaves gut läuft, dann kann 
man ja überlegen, was für die Projektarbeit noch drangestrickt werden 
muss...wenn es denn muss...
Gruß Rainer und viel Erfolg!

von Christian R. (holle)


Lesenswert?

Vielen Dank für die Antworten.
Ein "anderes Projekt" aussuchen kann ich nicht mehr, da ich den 
Projektauftrag bereits ausfüllen und abgeben musste.

Mein Dozent meint jedoch dass es ausreichend ist wenn ich ein paar 
Module anspreche, ohne Verteiler/Router.
Die RS485 Treiber habe ich bereits letzte Woche bei Aliexpress bestellt.

Nun habe ich aber noch ein anderes Problem:
Mein Dozent meint, dass die interne Clock zu ungenau ist und ich ein 
Quarz verwenden sollte. Da ich nun aber schon alle Ports verplant habe 
würde ich gerne noch die MISO/MOSI/USCK belegen. Diese brauche ich ja, 
um den yC zu programmieren, aber wenn ich das richtig verstanden habe 
kann ich die wohl einfach als IOs benutzen, denn wenn ich Reset auf GND 
lege (was mein Programmer ja selber macht) wird der Programmiermodus 
"erzwungen".
Stimmt das soweit, oder sperre ich mich aus wenn ich diese Ports als IOs 
verwende?

Und bitte erspart mir solche Kommentare wie "du weisst ja gar nichts". 
Wenn ich alles wüsste würde ich das Projekt einfach fertig stellen und 
ich wäre gar nicht hier.

Off Topic:
Sachliche Kommentare wie "geht nicht, weil..." sind erwünscht, aber 
Kommentare wie "Oder eher Fehlschluß?" oder "Du hast verdammt schlecht 
recherchiert und nix kapiert. Glückwunsch!" nerven einfach nur.
Es ist schön, dass manche hier anscheind als Ingenieur geboren wurden, 
aber es gibt auch Menschen die sowas erst lernen müssen.

von S. R. (svenska)


Lesenswert?

Christian R. schrieb:
> Mein Dozent meint, dass die interne Clock zu ungenau ist und
> ich ein Quarz verwenden sollte.

Für RS485 ist das der Fall. Die Ungenauigkeit spielt eher keine Rolle 
(kann man rauskalibirieren), aber der interne Takt ist nicht 
langzeitstabil und vergleichsweise stark temperaturabhängig.

Christian R. schrieb:
> Da ich nun aber schon alle Ports verplant habe
> würde ich gerne noch die MISO/MOSI/USCK belegen.

Das kannst du machen, solange du sicherstellst, dass (a) die restliche 
Schaltung den Programmer nicht verwirrt und (b) die Signale vom 
Programmer die restliche Schaltung nicht verwirren.

Das heißt vor allem, dass du die an MISO-MOSI-USCK angeschlossenen Chips 
deaktivierst (also /CE auf High oder so), wenn der Programmer arbeitet 
und dass die Spannungen kompatibel sind. Ein 5V-Programmer macht einen 
3,3V-Baustein kaputt. Und einen 5V-Baustein auch, wenn der Baustein kein 
Vcc hat, aber 5V auf den Datenleitungen sieht.

Gilt auch umgekehrt für den Programmer. Der sollte das besser auch 
überleben.

> Diese brauche ich ja, um den yC zu programmieren,

Bitte schreibe µC oder uC. Alles andere ist falsch.

Christian R. schrieb:
> Und bitte erspart mir solche Kommentare wie "du weisst ja gar nichts".

Gewöhn dich dran. Es ist nicht hilfreich, aber hier nunmal üblich - 
dieses Forum ist kein Kuschelparadies. Davon abgesehen ist es ja auch 
wahr.

von Falk B. (falk)


Lesenswert?

S. R. schrieb:
> Gewöhn dich dran. Es ist nicht hilfreich, aber hier nunmal üblich -
> dieses Forum ist kein Kuschelparadies. Davon abgesehen ist es ja auch
> wahr.

Um Gottes Willen! Du willst dieses arme Geschöpf doch nicht etwa mit der 
häßlichen Realität konfrontieren? Und vielleicht sogar mit seinen 
eigenen Defiziten? Was bist du nur für ein grausamer Mensch!

https://de.wikipedia.org/wiki/Kritikkompetenz

https://de.wikipedia.org/wiki/Generation_Snowflake

von A. S. (Gast)


Lesenswert?

Christian R. schrieb:
> Mein Dozent meint jedoch dass es ausreichend ist wenn ich ein paar
> Module anspreche, ohne Verteiler/Router.
> Die RS485 Treiber habe ich bereits letzte Woche bei Aliexpress bestellt.
>
> Nun habe ich aber noch ein anderes Problem:
> Mein Dozent meint, dass die interne Clock zu ungenau ist und ich ein
> Quarz verwenden sollte. Da ich nun aber schon alle Ports verplant habe
> würde ich gerne noch die MISO/MOSI/USCK belegen. Diese brauche ich ja,
> um den yC zu programmieren, aber wenn ich das richtig verstanden habe
> kann ich die wohl einfach als IOs benutzen, denn wenn ich Reset auf GND
> lege (was mein Programmer ja selber macht) wird der Programmiermodus
> "erzwungen".
> Stimmt das soweit, oder sperre ich mich aus wenn ich diese Ports als IOs
> verwende?


Wenn Du ernsthaft 2 RS485 Treiber auf das Board pappen willst, also 
genügend Platz hast, dann solltest Du bei den IO-Ports nicht sparen.

Nimm einen µC der genügend IO/Rechenleistung/Speicher-Reserve hat und 
bring das auf einem doppelt so großen Bord zum Laufen.

Deine Lernkurve ist recht steil, wenn Du erstmal ein Board vor Dir hast.

In einem späteren Schritt kannst Du (z.b. mit Charliplexing und 
verschiedenen Dual-Use-Tricks) meist die Pinzahl erheblich senken. Wenn 
Du das alles sofort machst, ist dieser nächste Schritt nicht notwendig 
aber der erste wird nie fertig.

von Rolf M. (rmagnus)


Lesenswert?

Christian R. schrieb:
> Da ich nun aber schon alle Ports verplant habe
> würde ich gerne noch die MISO/MOSI/USCK belegen. Diese brauche ich ja,
> um den yC zu programmieren, aber wenn ich das richtig verstanden habe
> kann ich die wohl einfach als IOs benutzen, denn wenn ich Reset auf GND
> lege (was mein Programmer ja selber macht) wird der Programmiermodus
> "erzwungen".

Ja, aber du musst bedenken, dass deine Schaltung dann immer parallel 
dazu dran hängt, oder du musst sie zum Programmieren abtrennen.

S. R. schrieb:
>> Diese brauche ich ja, um den yC zu programmieren,
>
> Bitte schreibe µC oder uC. Alles andere ist falsch.

yC ist auch nicht "falscher" als uC.

Christian R. schrieb:
> Und bitte erspart mir solche Kommentare wie "du weisst ja gar nichts".
> Wenn ich alles wüsste würde ich das Projekt einfach fertig stellen und
> ich wäre gar nicht hier.

Eigentlich gehört zu so einer Arbeit aber auch, dass man selber 
recherchiert und sich nicht alles von einem Forum vorkauen lässt.

Christian R. schrieb:
> Off Topic:
> Sachliche Kommentare wie "geht nicht, weil..." sind erwünscht, aber
> Kommentare wie "Oder eher Fehlschluß?" oder "Du hast verdammt schlecht
> recherchiert und nix kapiert. Glückwunsch!" nerven einfach nur.
> Es ist schön, dass manche hier anscheind als Ingenieur geboren wurden,
> aber es gibt auch Menschen die sowas erst lernen müssen.

Du hast geschrieben, du hättest recherchiert und dabei rausgefunden, das 
CAN dafür nicht geht, weil er angeblich nur <2m weit reicht. Das ist 
ziemlicher Blödsinn. Wenn du solche schlecht recherchierten falschen 
Behauptungen hier postest, musst du halt auch mit den Antworten klar 
kommen.

von Peter D. (peda)


Lesenswert?

Rainer V. schrieb:
> CAN kenne ich jetzt nicht so, aber da scheint mir ein gehöriger
> Software-Overhead nötig. Deshalb würde ich mit RS-485 beginnen.

Das genaue Gegenteil ist richtig. Bei CAN macht alles die Hardware, Du 
brauchst Dich um nichts zu kümmern. Du stellst einfach Nachrichten in 
den Sendepuffer bzw. liest sie aus dem Empfangspuffer. Die Hardware 
kümmert sich um den ganzen Rest.
RS-485 benutzt dagegen nur die popelige UART, die sich um gar nichts 
kümmert, außer Bits raus bzw. reinschieben. Das Paritätsbit der UART 
kannst Du in der Pfeife rauchen, das ist zur Übertragungssicherung 
völlig unbrauchbar.
Je nach Qualität der Datensicherung und Arbitrierung sind daher RS-485 
Libs mehrere kB groß (>10kB sind nicht ungewöhnlich).

Rainer V. schrieb:
> Wir hatten vor langer Zeit ein Projekt, wo ca. 40 Rechnereinschübe(keine
> PC's natürlich) verteilt auf 3 Schaltschränke über RS-485 kommunizieren
> mußten. Das war nicht nur nervenaufreibend sondern auch extrem schwer zu
> testen!

Genau meine Rede, zuverlässiges RS-485 ist extrem aufwendig in der 
Softwareschicht. Meiner Meinung nach, für Anfänger ungeeignet. 
Insbesondere, wenn die Zeit knapp ist.

: Bearbeitet durch User
von Ohje (Gast)


Lesenswert?

Peter D. schrieb:
> Je nach Qualität der Datensicherung und Arbitrierung sind daher RS-485
> Libs mehrere kB groß (>100kB sind nicht ungewöhnlich).

So ein Krampf.
Mehr als eine UART, ein GPIO und vielleicht ein CRC ist nicht nötig. 
Wenn überhaupt, viele µC unterstützen RS485 in Hardware.
Das sind ein paar hundert Zeilen Code, wenn überhaupt.
BTDT.

Peter D. schrieb:
> Genau meine Rede, zuverlässiges RS-485 ist extrem aufwendig in der
> Softwareschicht.

Ohje...

Bevor das Gekläffe der CAN-Fanboys losgeht:
Gegen CAN habe ich gar nichts, und mein Beitrag bezieht sich nicht 
darauf. Ich stelle auch nicht in Abrede, dass CAN eine Lösung für das 
Problem sein kann.

von Cyblord -. (cyblord)


Lesenswert?

Ohje schrieb:
> Mehr als eine UART, ein GPIO und vielleicht ein CRC ist nicht nötig.
> Wenn überhaupt, viele µC unterstützen RS485 in Hardware.
> Das sind ein paar hundert Zeilen Code, wenn überhaupt.

Das reicht aber halt nicht damit sich mehrere Teilnehmer zuverlässig 
unterhalten können.
Es gibt ja noch andere RS485 basierte Protokolle als CAN, z.B. Profibus.
Ist aber nicht unbedingt einfacher.
Nur es hat halt einen Grund warum man da oben drauf derart klobige 
Protokolle setzt und wer mit nichts anfängt ist schnell am dazubastlen 
von immer mehr Mechanismen so dass es schnell weniger Aufwand gewesen 
wäre auf etwas fertiges zu setzen.

von Peter D. (peda)


Lesenswert?

Es gibt viele ausgereifte und zuverlässige RS-232 Libs, in denen oft >10 
Mannjahre Entwicklung stecken.
Nur ist es für einen Programmieranfänger nicht gerade einfach, komplexe 
Fremdlibs in ein Projekt einzubinden, zu verstehen und zum Laufen zu 
bringen.
CAN hat dagegen den Charme, daß man es bare metal verwenden kann und es 
dann schon zuverlässig funktioniert.
CAN-MCs sind auch nicht teuer, z.B. PIC18F25K83: 1,73€ bei Farnell.

von Michael X. (Firma: vyuxc) (der-michl)


Lesenswert?

Die ursprüngliche Idee des TE hört sich schwer nach Modbus an. Ein 
Mega-Schieberegister ;-)

von S. R. (svenska)


Lesenswert?

Rolf M. schrieb:
>>> Diese brauche ich ja, um den yC zu programmieren,
>> Bitte schreibe µC oder uC. Alles andere ist falsch.
> yC ist auch nicht "falscher" als uC.

Im Gegensatz zu "y" ist "u" ein durchaus üblicher Ersatz für "µ", falls 
letzteres nicht vorhanden oder gewünscht ist.

von Christian R. (holle)


Lesenswert?

S. R. schrieb:
> Das kannst du machen, solange du sicherstellst, dass (a) die restliche
> Schaltung den Programmer nicht verwirrt und (b) die Signale vom
> Programmer die restliche Schaltung nicht verwirren.

Ich werde den µC sockeln und zum programmieren herausnehmen.


Rolf M. schrieb:
> Du hast geschrieben, du hättest recherchiert und dabei rausgefunden, das
> CAN dafür nicht geht, weil er angeblich nur <2m weit reicht. Das ist
> ziemlicher Blödsinn. Wenn du solche schlecht recherchierten falschen
> Behauptungen hier postest, musst du halt auch mit den Antworten klar
> kommen.

Ich finde den Link mit den 2 Metern nicht mehr, aber hier ist sogar von 
0,4 Meter die Rede (Stichleitung):
https://www.kmpdrivetrain.com/general/basics-can-bus/

Da ich anfangs davon ausgegangen bin, dass ich ein Kabel bis zum Regal 
lege und von da aus die Fächer per Stichleitung verbunden werden wären 
die 2 Meter nicht ausreichend gewesen.
OK, man hätte das Kabel auch "Slalom" verlegen können und somit die 
Stichleitungen kürzer halten können, aber als ich das gelesen hatte war 
CAN für mich schon aus dem Rennen, auch weil CAN keine Low-Cost-Lösung 
mehr ist.
Und selbst wenn ich mich verlesen hätte (2m statt 2km), dann kann man 
auch sachlich darauf hinweisen, anstatt gleich beleidigend zu werden.


A. S. schrieb:
> Wenn Du ernsthaft 2 RS485 Treiber auf das Board pappen willst, also
> genügend Platz hast, dann solltest Du bei den IO-Ports nicht sparen.

Ich möchte nur einen Max485 je Modul verbauen. Lediglich die Router 
hätten 2 Stück bekommen, aber die fallen ja nun komplett weg.


A. S. schrieb:
> Nimm einen µC der genügend IO/Rechenleistung/Speicher-Reserve hat und
> bring das auf einem doppelt so großen Bord zum Laufen.
>
> Deine Lernkurve ist recht steil, wenn Du erstmal ein Board vor Dir hast.
>
> In einem späteren Schritt kannst Du (z.b. mit Charliplexing und
> verschiedenen Dual-Use-Tricks) meist die Pinzahl erheblich senken. Wenn
> Du das alles sofort machst, ist dieser nächste Schritt nicht notwendig
> aber der erste wird nie fertig.

Dein Argument ist nachvollziehbar, aber zum einen habe ich bereits 25 
ATtiny2313 hier liegen und zum anderen soll es ja auch nicht "zu 
einfach" werden. Mein Dozent sagt zum Thema "Aufwand" nur: Es soll einem 
Techniker würdig sein. OK, das mit dem BUS habe ich unterschätzt, aber 
die Doppelbelegung (DIP-Schalter zum Adresse abfragen und 2x 
7-Segment-Anzeige habe ich bereits entworfen (muss ich halt noch 
programmieren) und komme mit den Ports hin. Das Problem war nur, dass 
nun noch ein Quarz dazu kommt, aber wenn ich MISO/MOSI/USCK doppelt 
belegen kann komme ich wieder mit meinen Ports aus.


Peter D. schrieb:
> Bei CAN macht alles die Hardware, Du
> brauchst Dich um nichts zu kümmern. Du stellst einfach Nachrichten in
> den Sendepuffer bzw. liest sie aus dem Empfangspuffer. Die Hardware
> kümmert sich um den ganzen Rest.
> RS-485 benutzt dagegen nur die popelige UART, die sich um gar nichts
> kümmert, außer Bits raus bzw. reinschieben. Das Paritätsbit der UART
> kannst Du in der Pfeife rauchen, das ist zur Übertragungssicherung
> völlig unbrauchbar.
> Je nach Qualität der Datensicherung und Arbitrierung sind daher RS-485
> Libs mehrere kB groß (>10kB sind nicht ungewöhnlich).

Das spricht in der Tat für den CAN-Bus.
Genau so etwas meinte ich mit "sachliche" Kommentare. Danke.
Mein Problem ist nun jedoch dass ich den Projektauftrag schon abgegeben 
habe (das musste ich wegen der Frist). Ich muss das also per RS485 
schaffen oder ich kann mit Puntabzügen rechnen.


Cyblord -. schrieb:
> Ohje schrieb:
>> Mehr als eine UART, ein GPIO und vielleicht ein CRC ist nicht nötig.
>> Wenn überhaupt, viele µC unterstützen RS485 in Hardware.
>> Das sind ein paar hundert Zeilen Code, wenn überhaupt.
>
> Das reicht aber halt nicht damit sich mehrere Teilnehmer zuverlässig
> unterhalten können.

Zählt ein Acc als Kommunikation?
Mein Plan ist, dass das Paket vom PC an die Module gesendet wird. Jeder 
empfängt die Daten, aber NUR der Teilnehmer, der die Adresse hat 
antwortet. Kommt keine Antwort ist es halt ein "Time out".

Das sollte doch nicht so komplex sein, oder?
Habe gerade mal nachgesehen was die CAN-Treiber kosten...
Verdammt, die bekommt man bei Aliexpress für < 1 Euro. Die kosten zwar 
knapp 7x so viel wie die RS485-Treiber, aber das wäre sicher trotzdem 
noch als Low-Cost durchgegangen.
Sollte ich es mit dem RS485 nicht realisieren können werde ich auf CAN 
zurück kommen (auch wenn es mich Punkte kostet).


@falk
Fühlst du dich besser, wenn du einen ernst gemeinten Thread durch 
sinnlose Kommentare durch spam versaust?
Welchen Teil von "Es nervt" hast du nicht verstanden?
Sei bitte so gut und unterlasse weitere Kommentare. Du bist besser und 
schlauer als ich, ich bin doof, stinke und sehe scheiße aus.
Nun, wo das geklärt ist könnten wir vielleicht sachlich fortfahren. 
Danke.

von Rolf M. (rmagnus)


Lesenswert?

Christian R. schrieb:
> Ich finde den Link mit den 2 Metern nicht mehr, aber hier ist sogar von
> 0,4 Meter die Rede (Stichleitung):

Aha! Es geht also um Stichleitungen, nicht um die Buslänge. Das ist 
natürlich was anderes.

> Da ich anfangs davon ausgegangen bin, dass ich ein Kabel bis zum Regal
> lege und von da aus die Fächer per Stichleitung verbunden werden wären
> die 2 Meter nicht ausreichend gewesen.
> OK, man hätte das Kabel auch "Slalom" verlegen können und somit die
> Stichleitungen kürzer halten können, aber als ich das gelesen hatte war
> CAN für mich schon aus dem Rennen,

Lange Stichleitungen sind nicht nur bei CAN ein Problem.

von Falk B. (falk)


Lesenswert?

Christian R. schrieb:

> Ich werde den µC sockeln und zum programmieren herausnehmen.

Noch so ein Käse. Der Rest der Welt macht das schon seit 20 Jahren 
nicht mehr und freut sich über die Fähigkeit von ISP (In System 
Programming).

> Ich finde den Link mit den 2 Metern nicht mehr, aber hier ist sogar von
> 0,4 Meter die Rede (Stichleitung):
> https://www.kmpdrivetrain.com/general/basics-can-bus/

Mein Gott, du bist mir ja ein Experte. Selbst in dem Bild sieht ein 
Blinder den Unterschied zwischen der STICHleitung und der normalen 
Leitungslänge!

> Da ich anfangs davon ausgegangen bin, dass ich ein Kabel bis zum Regal
> lege und von da aus die Fächer per Stichleitung verbunden werden wären
> die 2 Meter nicht ausreichend gewesen.

Flasches Konzeüt. Aber das scheint deine Kernkompetenz zu sein.

> OK, man hätte das Kabel auch "Slalom" verlegen können und somit die
> Stichleitungen kürzer halten können,

AHA!

von 900ss (900ss)


Lesenswert?

Peter D. schrieb:
> SPI und AVRs stehen so ziemlich auf Kriegsfuß, insbesondere, wenn der
> Slave auch senden soll. Sichere Datenübertragung ist damit ein Horror.

Was sind denn die konkreten Probleme mit AVR und SPI?

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

900ss D. schrieb:
> Was sind denn die konkreten Probleme mit AVR und SPI?

Der Master muß nach jedem Byte eine Gedenkpause einlegen, damit der 
Slave garantiert das nächste Byte in das Senderegister schreiben kann. 
Und wenn der Slave noch andere Sachen machen soll, außer SPI, kann diese 
Pause ziemlich lang werden.

von 900ss (900ss)


Lesenswert?

Peter D. schrieb:
> Und wenn der Slave noch andere Sachen machen soll, außer SPI, kann diese
> Pause ziemlich lang werden

Danke für die Hinweise. Deshalb das gepuffert SPI bei den neueren AVRs. 
Der ATMEGA128 hat das sicher noch nicht. Muss ich mal nachschauen im 
Datenblatt. Der wird gerade geplant in einem Projekt, wo er SPI Slave 
sein soll. Ich darf evtl. die SW machen. Aber leider gibt es in diesem 
Fall keine Alternative zum 128-er.

von Peter D. (peda)


Lesenswert?

900ss D. schrieb:
> Der ATMEGA128 hat das sicher noch nicht. Muss ich mal nachschauen im
> Datenblatt. Der wird gerade geplant in einem Projekt, wo er SPI Slave
> sein soll. Ich darf evtl. die SW machen.

Na dann viel Spaß damit. Ich würde in jedem Fall eine CRC vorsehen, um 
korrupte Pakete zu erkennen. Bei zuviel korrupten Paketen könnte dann 
der SPI-Master die Wartezeiten dynamisch verlängern.

Für neue Projekte sollte man den ATmega128 aber nicht mehr einsetzen, 
sondern den pinkompatiblen ATmega2561.

von Stefan F. (Gast)


Lesenswert?

900ss D. schrieb:
> Was sind denn die konkreten Probleme mit AVR und SPI?

Das Timing ist schwierig, weil der AVR kein DMA unterstützt. Solange man 
kein eigenes besonders entspanntes Übertragungsprotokoll verwendet, hat 
der AVR nur sehr kurze Momente Zeit, die Daten ins Sende-Register zu 
schreiben.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefanus F. schrieb:
>> Was sind denn die konkreten Probleme mit AVR und SPI?
>
> Das Timing ist schwierig, weil der AVR kein DMA unterstützt.

Selbst mit DMA: bei SPI Slave in Software (statt in Hardware) braucht 
man nach dem Eintrudeln des ersten Bytes vom Master eine Reaktionszeit, 
bevor man eine "customisierte" Antwort an den Slave schicken kann. 
Ansonsten wäre das erste Antwortbyte (das ist nicht das, was während 
des ersten Master-Bytes durchgeschoben wird, sondern schon das nächste) 
nur irgendwas fest vorgegebenes, das bereits vorher feststeht.

SPI ist ein Schieberegister, das man halt gut in Hardware implementieren 
kann (da steht die Antwort mit dem nächsten Zyklus des Hardwaretakts 
bereit), aber weniger gut in Software. Es gibt halt einen Grund, warum 
Philips bei I²C dem Slave die Möglichkeit eingeräumt hat, um eine 
„Denkpause“ zu bitten.

von 900ss (900ss)


Lesenswert?

Peter D. schrieb:
> sondern den pinkompatiblen ATmega2561.

Es wird der ATMegaS128 verwendet weil das Zeug später ca. 400km über dem 
Erdboden eingesetzt wird. Und da gibt es glaube ich nur den 128-er als 
S-Variante. Hab mich ehrlich gesagt noch nicht weiter informiert. Das 
sollten eigentlich die Kollegen machen ;)

Aber das Problem beim SPI ist mir schon klar jetzt.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefanus F. schrieb:
> 900ss D. schrieb:
>> Was sind denn die konkreten Probleme mit AVR und SPI?
>
> Das Timing ist schwierig, weil der AVR kein DMA unterstützt. Solange man
> kein eigenes besonders entspanntes Übertragungsprotokoll verwendet, hat
> der AVR nur sehr kurze Momente Zeit, die Daten ins Sende-Register zu
> schreiben.

 Der AVR hat so viel Zeit wie es dem Master beliebt.
 Und DMA mit Antwort von Slave ist sogar noch schwieriger als einfaches
 senden. DMA bringt nur bei dummen Peripheriegeräten und grossen
 Datenmengen einen Zeitgewinn, ansonsten gibt es keine grossen
 Zeitunterschiede.

 Selbst die ältesten AVRs können SPI mit 2MHz, da sind 4us für
 einen Byte (RDY/BUSY) kein Thema.

von Rainer V. (a_zip)


Lesenswert?

Peter D. schrieb:
> Genau meine Rede, zuverlässiges RS-485 ist extrem aufwendig in der
> Softwareschicht. Meiner Meinung nach, für Anfänger ungeeignet.
> Insbesondere, wenn die Zeit knapp ist.

 Und es ist richtig, dass die CAN-Knoten harwaremäßig absolut 
zuverlässig arbeiten. Aber bei einem System mit 100 Teilnehmern wird man 
sicher mehr zu tun haben, als ein Byte in einen Puffer zu 
schreiben...also Software, auch wenn die unproblematische Hardware 
natürlich ein unschlagbares Plus ist! Und weiter möchte ich zu bedenken 
geben, dass die Hardware nur unproblematisch ist, wenn man gekaufte 
Module einsetzt! Das ist hier wohl nicht der Fall und hier gilt, sowohl 
für CAN oder RS-xx, dass die Hardware erst mal gut gemacht werden muß! 
Hier sehe ich, abgesehen von Anzahl der Teilnehmer des Bus, zwei 
Baustellen, die nicht ohne sind!

Christian R. schrieb:
> CAN-Bus ist ungeeignet, da dieser nur für kurze Distanzen gedacht ist
> (< 2m). Zudem ist das dann keine Low-Cost-Lösung mehr.

Nun, heute wird in unserer Firma auch nur noch CAN benutzt und es muß 
noch einmal gesagt werden, dass es keine Einschränkungen von 
lächerlichen 2 Metern gibt! Bei jedem anderen "lokalen" Bus sicher, es 
sei denn du packst noch mal kräftig Hardware an.

Christian R. schrieb:
> Mein Dozent meint jedoch dass es ausreichend ist wenn ich ein paar
> Module anspreche, ohne Verteiler/Router.
> Die RS485 Treiber habe ich bereits letzte Woche bei Aliexpress bestellt.

Das habe ich doch schon vorgeschlagen! Wobei die Frage bliebe, wieviele 
"ein paar" Module denn sein sollen.

Christian R. schrieb:
> Mein Dozent sagt zum Thema "Aufwand" nur: Es soll einem
> Techniker würdig sein.

Na dann...wieviel Zeit hast du denn wirklich und das mit dem "low-cost" 
kannst du sicher vergessen!

Ich warte mal ab und bin gespannt!
Gruß Rainer

von Cyblord -. (cyblord)


Lesenswert?

Christian R. schrieb:
> Zählt ein Acc als Kommunikation?
> Mein Plan ist, dass das Paket vom PC an die Module gesendet wird. Jeder
> empfängt die Daten, aber NUR der Teilnehmer, der die Adresse hat
> antwortet. Kommt keine Antwort ist es halt ein "Time out".

Die Frage ist was tut ein Teilnehmer wenn der Empfänger kein ACK sendet?
Wiederholen? Wann und wie oft?

Hast du ne Checksumme an den Daten?
Wie sehen die Nachrichten aus? Gibt es feste Pakete mit Kommando und 
Daten? Kann der Empfänger das in jedem Fall richtig aufdröseln?

In der Realität hast du 1001 solche Details zu lösen. Du baust dir damit 
ein eigenes Protokoll. Das geht natürlich. Kann aber dauern und kann weh 
tun bis man alle Fälle und Ausnahmen abgedeckt hat und das ganze Robust 
läuft.

Darum kann es Sinn machen auf etwas fertiges zu setzen.

: Bearbeitet durch User
von Rainer V. (a_zip)


Lesenswert?

Cyblord -. schrieb:
> Die Frage ist was tut ein Teilnehmer wenn der Empfänger kein ACK sendet?
> Wiederholen? Wann und wie oft?

Ja, das ist eins der 1000 Probleme und das ist der Grund, warum ich oben 
CAN als "Software-Intensiv" benannt habe. Das Handling aller Teilnehmer 
ist mehr als komplex und wird in der Regel durch 2-3-x Software-Ebenen 
bearbeitet. Ich spreche jetzt wieder von standartisierten, käuflichen 
Modulen. Und davon ist der
TO meilenweit entfernt! Und nichts für ungut, man kann jetzt noch 100 
ähnliche Probleme ansprechen, aber das Konzept ist ja noch nicht da!!!

Rainer V. schrieb:
> Es soll einem
>> Techniker würdig sein.

Na denn mal los!
Gruß Rainer

von Peter D. (peda)


Lesenswert?

Rainer V. schrieb:
> Ja, das ist eins der 1000 Probleme und das ist der Grund, warum ich oben
> CAN als "Software-Intensiv" benannt habe.

Du verwechselst da was, das ACK ist bei RS-485 zwingend notwendig, nicht 
aber bei CAN. CAN ist auch bare metal sehr zuverlässig und sehr schlank.

Eine ACK-Nachricht ist bei CAN auch kein Ding und es bremst den Master 
nicht aus. Bei RS-485 muß der Master aber darauf warten, d.h. den Slave 
zum Senden adressieren und ein Timeout aufsetzen.

von Martin L. (maveric00)


Lesenswert?

Hallo,

Peter D. schrieb:
> Rainer V. schrieb:
>> Ja, das ist eins der 1000 Probleme und das ist der Grund, warum ich oben
>> CAN als "Software-Intensiv" benannt habe.
>
> Du verwechselst da was, das ACK ist bei RS-485 zwingend notwendig, nicht
> aber bei CAN. CAN ist auch bare metal sehr zuverlässig und sehr schlank.
>
> Eine ACK-Nachricht ist bei CAN auch kein Ding und es bremst den Master
> nicht aus. Bei RS-485 muß der Master aber darauf warten, d.h. den Slave
> zum Senden adressieren und ein Timeout aufsetzen.

Verwechselst Du hier ein ACK-Packet mit dem ACK-Slot beim CAN? Beim CAN 
muss jeder Teilnehmer, der eine korrektes Paket erkennt, nach dem 
CRC-Delimiter den Bus auf Dominant setzen (im ACK-Slot). Dadurch kann 
der Sender einen Bus-Off erkennen (wenn der ACK-Slot rezessiv bleibt).

Zusätzlich muss jeder Empfänger, der einen Fehler im Paket findet einen 
Error-Frame senden, damit bekannt wird, dass nicht jeder Empfänger die 
Nachricht korrekt erhalten hat (ein dominantes ACK reicht hier nicht 
aus, da ja schon ein korrekter Empfang zu einem dominanten ACK führt, 
während alle anderen Empfänger Müll empfangen haben könnten). Diese 
Fehlerreaktion ist allerdings auf eine bestimmte Anzahl von Paketen 
beschränkt, damit ein defekter Empfänger nicht den Bus blockiert.

Ist nun kein weiterer Teilnehmer am Bus folgt die Reaktion wie beim 
Bus-Off: Der Transmit Error counter wird hochgezählt, und es wird bis zu 
256 (32) mal versucht, die Nachricht zu senden (128 mal im error active 
mode, also mit einem zusätzlich gesendeten Error Frame, 128 mal im error 
passive mode, also mit längerer Pause  (passive error frame)). Da es 
Controller gibt, die bei einem Transmit-Error den Fehlerzähler gleich um 
8 erhöhen, gehen diese schon nach 32 Versuchen in den Bus-Off.

Danach geht der Sender auf Bus Off. Je nach CAN-Controller wechselt er 
nach einer gewissen Zeit der Bus-Ruhe (MCP2515 z.B. 128*11 Bits rezessiv 
auf dem Bus) wieder in den normalen Modus und die Prozedur beginnt von 
vorne. Bei anderen Controllern muss das Programm den Controller wieder 
aktivieren.

Software-intensiv ist das allerdings nicht - im Regelfall läuft alles 
vollautomatisch ab und das Programm muss nur auf katastrophale Fehler 
(Bus-Off oder komplett verrauschter Bus) reagieren.

Schöne Grüße,
Martin

von Rainer V. (a_zip)


Lesenswert?

Hallo und danke für die ausführliche Beschreibung! Und wie gesagt, ich 
bin da nicht mehr dran. Also warten wir mal ab, was der TO jetzt 
macht...
Gruß Rainer

von Christian R. (holle)


Lesenswert?

Vielen Dank fpr die rege Teilnahme.
Ich werde erstmal die Hardware aufbauen und erste Erfahrungen mit dem 
uC (sorry, per Smartphone gesendet) sammeln. Dazu werde ich versuchen 
die DIP-Schalter-Adresse auszulesen, und diese auf der 7-Segment Anzeige 
darzustellen.
Wenn das klappt wage ich mich mal an den RS485 Bus dran, weil ich dafür 
alles daheim habe.
Sollte ich überhaupt nicht weiter kommen  besorge ich mir Can-Treiber 
und schau mal ob das besser klappt.
Es sind halt meine ersten Gehversuche mit einem uC, also kann das etwas 
länger dauern.
Wenn alles klappt brauche ich noch eine PC-Software.
Wenn ich diese dann auch fertig habe stelle ich das gerne hier rein, 
sofern das erlaubt ist (notfalls NACH der Prüfung).

Ich halte euch auf dem Laufenden.

Ach ja, die Zeit für die Übertragung ist eher unkritisch. Wenn es 2 
Sekunden dauert bis die Anzeige da ist kann ich auch damit leben. Viele 
Daten müssen ja nicht übertragen werden.

von Stefan F. (Gast)


Lesenswert?

Christian R. schrieb:
> Es sind halt meine ersten Gehversuche mit einem uC, also kann das etwas
> länger dauern.

Mit einem Bus-System? Nicht gut, da wirst du mehrere Baustellen 
gleichzeitig haben. Fange besser mit einzelnen Mikrocontrollern an, und 
mache Dich mit Debugging Methoden und einem Logic Analysator vertraut.

Trial and Error wird am Bus nur noch Frust bereiten.

> Wenn alles klappt brauche ich noch eine PC-Software.

Brauchst du die nicht schon vorher, damit es überhaupt klappen kann?

von Christian R. (holle)


Lesenswert?

Ich habe mich etwas ungünstig ausgedrückt.
Zum Testen reicht es erst mal aus, wenn ich eien fixen String übertrage.
Wenn das klappt brauche ich ein Programm um gezielte Daten zu üertragen.

von Stefan F. (Gast)


Lesenswert?

Dann folge meiner Empfehlung. Diese Methode funktioniert sowohl mit 
Strings als auch mit Binärdaten.

Auf das Verändern der Zeilenumbrüche (in der ISR bzw. im Puffer) 
solltest du dann allerdings besser verzichten.

von Christian R. (holle)


Lesenswert?

OK, String war nun auch etwas übertrieben.
Eigentlich möchte ich nur eine 2-Stellige Zahl übertragen (7 Bit = 
0-127). Die Werte oberhalb von 99 kann ich dann für "Steuerbefehle" 
nutzen:
Beispiel: Das Datenpaket enhält den Wert 1001001, dann soll eine 73 auf 
den 7-Segment-Anzeigen dargestellt werden. Wenn das Datenpaket 1111111 
enthält, dann soll z.B. das Display gelöscht werden, 1111110 soll die 
eingestellte Adresse dezimal in der 7-Segment-Anzeige anzeigen, usw.

Bei der Addressierung habe ich das gleiche vor. Die Adresse 111111 
(höchster Wert soll als Broadcast dienen und alle Module ansprechen, 
z.B. um bei allen Modulen die 7-Segment-Anzeigen zu löschen.

Aber nun mal was anderes...
Wenn ich mit "DDRD = 0x64" PD2, PD5 und PD6 auf Ausgang setzte, dann 
werden die anderen Pins doch automatisch auf Eingang gesetzt, oder?
Was passiert dann mit Rx/Tx (PD0 und PD1) ?
Setzte ich die somit gleichzeitig als Eingang?
Ich brauche die ja noch zum Datenaustausch als Rx/Tx.
Oder funktioniert das so, dass ich Rx als Eingang und TX als Ausgang 
setze?

von Stefan F. (Gast)


Lesenswert?

Christian R. schrieb:
> Wenn ich mit "DDRD = 0x64" PD2, PD5 und PD6 auf Ausgang setzte, dann
> werden die anderen Pins doch automatisch auf Eingang gesetzt, oder?

Ja.

Wenn du die anderen Pin unverändert lassen willst, schreibst du:
DDRD |= 0x64;

> Was passiert dann mit Rx/Tx (PD0 und PD1) ?

Die Sonderfunktion hat vor normalem I/O immer Vorrang. Wenn serieller 
Transmitter und Receiver aktiviert sind, spielt die Einstellung des DDR 
Registers keine Rolle mehr.

> Oder funktioniert das so, dass ich Rx als Eingang und TX als Ausgang
> setze?

Kannst du machen, ist jedoch nicht nötig.

von Christian R. (holle)


Lesenswert?

Vielen Dank :-)

Nun habe ich direkt die nächste Frage:
Wie stelle ich die Clock ein?
Ich überblicke die Einstellmöglichkeiten gerade nicht.
Wenn ich ein Quartz verwenden (z.B. 8 MHz), dann definiere ich im 
Programm : "#define F_CPU 8000000", richtig?
Was hat das mit den Teilern auf sich?
Welches Quartz sollte ich verwenden, damit ich später bei der 
Datenübertragung einen gängigen (z.B. 9600 Baud, 19200 Baud, 115200 
Baud) Takt hinbekomme?

von Rolf M. (rmagnus)


Lesenswert?

Christian R. schrieb:
> Nun habe ich direkt die nächste Frage:
> Wie stelle ich die Clock ein?
> Ich überblicke die Einstellmöglichkeiten gerade nicht.
> Wenn ich ein Quartz verwenden (z.B. 8 MHz), dann definiere ich im
> Programm : "#define F_CPU 8000000", richtig?

Damit sagst du dem Programm, dass es davon ausgehen soll, dass der 
Prozessor mit 8 MHz getaktet ist - es sorgt nicht dafür, dass der Takt 
auch tatsächlich 8 MHz ist. Ich würde auch empfehlen, das nicht im 
Programm, sondern über das Makefile per Compiler-Kommandozeile zu 
definieren.
Um einen AVR dazu zu bringen, den Quarz zu verwenden, musst du die Fuses 
entsprechend einstellen.

> Was hat das mit den Teilern auf sich?
> Welches Quartz sollte ich verwenden, damit ich später bei der
> Datenübertragung einen gängigen (z.B. 9600 Baud, 19200 Baud, 115200
> Baud) Takt hinbekomme?

Es gibt Baudratenquarze, die genau dafür ausgelegt sind.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Rolf M. schrieb:
> Um einen AVR dazu zu bringen, den Quarz zu verwenden, musst
> du die Fuses entsprechend einstellen.

Bei der Gelegenheit empfehle ich Dir, dich mit der CLKDIV8 Fuse zu 
beschäftigen.

Viele AVR haben außerdem das in diesem Zusammenhang relevante CLKPRE 
Register. Dein ATtiny2313 hat keins, aber du kannst Dir das ja mal im 
Datenblatt des ATmega328P anschauen. Mit dem wirst du früher oder später 
sicher auch zu tun haben.

Die Definition F_CPU wird von den delay() Funktionen verwendet, um die 
richtige Anzahl von befehlen auszuführen, um auf die gewünschte 
Verzögerungszeit zu kommen. Und sie wird von der Datei setbaud.h 
verwendet, um die Werte für die Baudraten-Register der USART 
Schnittstelle korrekt zu berechnen.

Sie beeinflusst die tatsächliche Taktfrequenz jedoch nicht. Es ist deine 
Aufgabe, diese Definition mit dem richtigen Zahlenwert zu befüllen, 
damit die delay() Funktionen und die USART Schnittstelle mit dem 
richtigen Timing arbeiten.

> Ich würde auch empfehlen, das nicht im Programm, sondern
> über das Makefile per Compiler-Kommandozeile zu definieren.

Das sehe ich auch so - falls Du ein Makefile hast. Was ich wiederum für 
empfehlenswert halte, damit das Projekt nicht von den Einstellungen der 
IDE abhängt. Denn IDEs werden erfahrungsgemäß öfters mal ausgetauscht.

von Christian R. (holle)


Lesenswert?

Wie funktioniert das mit dem Makefile?
Ich benutze Atmel Studio 7. Als ich das Projekt angelegt habe, konnte 
ich auswählen, dass ich einen Simulatior nutze möchte, was ich auch so 
ausgewählt habe. Wenn mich nicht alles täuscht konnte ich da auch die 
Fusebits einstellen.
Kann man die nachträglich noch ändern, oder müsste ich dazu ein neues 
Projekt erstellen?

Wenn ich die Fusebits im Atmel Studio einstelle, ist das dann ein 
Makefile?

Sorry wegen der "dummen" Fragen, aber momentan ist das noch recht 
verwirrend für mich.

Und vielen Dank für den Hinweis mit den Baudratenquartzen.

Schneller ist ja nicht immer unbedingt besser (störanfälliger). Habe ich 
das richtig verstanden, dass ich z.B. ein Quartz mit 18,432 MHz nehme 
und die CPU dann mit der Taktfrequenz arbeitet und ich den Teilen durch 
16 teilen kann und somit auf 1,152 MHz für die Übertragung komme?
Das wäre ja schon mal gut, da ich schneller rechnen kann als die Daten 
empfangen werden.

Aber wie geht es nun weiter? 115000 Baud ist ja ein gängiger Wert, aber 
wie komme ich von 1,152 MHz auf 115.000 Baud? Da ich lediglich binär 
sende sollten die 1,152 MHz ja auch 1,152 Bits/Sekunde darstellen, womit 
ein Symbol 10 Bit lang sein dürfte um zu einem Baud zu werden, oder?
Ich hoffe ich habe das soweit richtig verstande, das mit den Baud, 
Bits/Sekunde, Taktrate, usw. bringt mich etwas durcheinander ;-)

Fange ich mal rückwärts an.
Wenn ich Daten mit 9600 Baud übertragen möchte und für jedes Symbol (was 
die Zahl beider 7-Segment-Anzeigen entspricht)
x Bit brauche, dann hängt es nun von der Länge des Datensatzes ab, wie 
hoch die Frequenz sein muss, richtig?

Da bin ich auch schon wieder bei der nächsten Frage:
Wenn ich vom PC per Terminal-Programm eine "43" sende, dann sollte ich 
ja auf eine gängige Norm setzen. Gängig wäre z.B. 8N1 (8 Datenbits, kein 
Paritätsbit, 1 Stopbit).
Ist da kein Startbit nötig? Warum ist es "gängig" auf das Paritätsbit zu 
verzichten? Auf meiner Arbeit muss ich bei einiges Tests eine Verbindung 
per TeraTerm aufauen und da ist die Einstellung IMMER 8N1 (lediglich die 
Baud-Rate muss angepasst werden). Kommt es so selten zu fehlerhaften 
Datenpaketen, oder warum wird meistens auf das Paritätsbit verzichtet?
Macht es in meinem Fall Sinn das Paritätsbit zu nutzen (wegen der 
Distanz von mehreren Metern), oder wäre das für so kurze Datenpakete 
eher überflüssig?

OK, ich gehe mal davon aus, dass ich ein Paritätsbit brauche, somit ist 
ein Paket bei 8E1 10 Bits lang. Ist das korrekt?

Nun brauche ich 6 Bit für die Adresse und 7 Bit für die zu übermittelnde 
Zahl. Das könnte ich dann sauber in 2 separate Pakete verpacken, spricht 
das erste Paket enthält die Adresse. Das entsprechende Modul lauscht nun 
auf das 2. Paket und wertet die Daten aus. Da ich ja 8 Bit übertragen 
kann und nur 7 und 6 Bit brauche könnte ich ja auch ein Bit dazu nutzen 
um das Paket als Adresse oder Datenpaket zu kennzeichnen.
Bitte korrigiert mich, wenn ich hier falsch liege, das ist alles nur 
eine Idee ohne jegliche Erfahrung.

Weiter im Text...
Wenn ich nun 2x 10 Bits senden muss um "ein Symbol" zu übertragen 
brauche ich also 20 Bits pro Symbol.
Somit sind für 9600 Baud eine Frequenz von 192 kHz nötig, richtig?
Wie ist das mit den Pausen zwischen den Datenpaketen? Braucht man da 
eine Pause? Zumindest der µC braucht eine Pause um die Daten aus dem 
ersten Paket auszuwerten und dann auf das 2. Paket zu lauschen.
Reicht es da aus, wenn ich mehrere Stopbits sende, aber nur ein Stopbit 
empfange (und die rechtliche Zeit zum verarbeiten benutze), oder wie 
verschaffe ich dem µC eine Pause?

Reicht es aus, wenn ich die Daten in 16-Bit-Stücke aufarbeite, und dann 
einfach per TeraTerm sende?
Ich stelle mir das in etwa so vor:
Adresse: 011010
Daten: 0011101
--> Daraus würde ich 1001101000011101 machen, was dann ja so beim 
Empfänger ankommen müsste:
1. Paket = 10011010  (das erste Bit sagt "Adresse" und die letzten 6 Bit 
enthalten die Adresse)
2. Paket = 00011101  (das erste Bit sagt "Daten" und die folgenden 7 Bit 
enthalten die Daten)
Die Module lauschen alle und empfangen alle die Adresse 11010. Wenn die 
Adresse nicht übereinstimmt wird das folgende Paket ignoriert. Stimmt 
die Adresse überein wird das 2. Paket ausgewertet und die Daten (11101) 
als Zahl (29) auf den Anzeigen dargestellt.
Wie funktioniert das mit dem Acc? Wartet TeraTerm mach jedem Paket auf 
ein Acc? Dann wäre das Problem mit der Pause erledigt. Wenn nicht, wie 
funktioniert das dann?

Sorry für die 1000 Fragen, aber ich versuche das zu verstehen bevor ich 
das programmiere ;-)

von Stefan F. (Gast)


Lesenswert?

Christian R. schrieb:
> Wie funktioniert das mit dem Makefile?

Guckst du hier:
http://stefanfrings.de/avr_hello_world/index.html
http://stefanfrings.de/avr_tools/index.html#atmelstudio

> Simulator nutze ...
> Kann man die nachträglich noch ändern?

Ja. Aber ich benutze das Atmel Studio nicht, deswegen kann ich mich 
nicht daran erinnern, wo man es ändert.

Du brauchst das auch gar nicht zu ändern, solange der µC Typ der selbe 
bleibt. Die Einstellung betrifft nur den Debugger: ob du im Simulator 
Debuggen willst, oder die echte Hardware (mit einem Atmel ICE).

> Habe ich das richtig verstanden, dass ich z.B. ein Quartz
> mit 18,432 MHz nehme und die CPU dann mit der Taktfrequenz
> arbeitet und ich den Teilen durch 16 teilen kann und somit
> auf 1,152 MHz für die Übertragung komme?

Ja. Wobei nicht alle AVRs für mehr als 16MHz ausgelegt sind.

> womit ein Symbol 10 Bit lang sein dürfte um zu einem Baud
> zu werden, oder?
> ...w ie geht es nun weiter? 115000 Baud ist ja ein gängiger Wert

Aaah, wir sind inzwischen gar nicht mehr bei SPI. Die Beschreibung der 
UART Schnittstelle entnimmst du am Besten dem Datenblatt des 
Mikrocontrollers. Ich finde, dass Atmel diese Part sehr ordentlich 
dokumentiert hat. Für Baudraten-Einstellung findest du im Datenblatt 
sogar praktische Tabelle, die gängige Einstellungen für gängige Quarze 
darstellen.

> OK, ich gehe mal davon aus, dass ich ein Paritätsbit brauche
> ...Ist das korrekt?

Keine Ahnung, was du brauchst. Die UART Schnittstelle kann jedenfalls 
nicht beliebig viele Bits übertragen. Ich meine es waren nur 6, 7 oder 8 
Bits (optional plus parity).

> Wie ist das mit den Pausen zwischen den Datenpaketen?
> Braucht man da eine Pause?

Die UART Schnittstelle kann pausenlos übertragen. Deine Software 
erfordert jedoch vielleicht Pausen.

> Reicht es da aus, wenn ich mehrere Stopbits sende, aber nur
> ein Stopbit empfange (und die rechtliche Zeit zum verarbeiten benutze)

Ja, der UART Empfänger benötigt nur ein Stopbit, um korrekt zu 
funktionieren. Du kannst aber beliebig viele Stopbits senden. In der tat 
ist der Ruhepegel von UART einfach ein HIGH mit beliebiger Länge. Die 
Übertragung muss nicht einmal Taktsynchron fortgesetzt werden, jeder 
beliebige Zeitpunkt ist Ok.

> Reicht es aus, wenn ich die Daten in 16-Bit-Stücke
> aufarbeite, und dann einfach per TeraTerm sende?

Ich kenne Teraterm nicht. Aber sobald Terminalprogramme ins Spiel 
kommen, möchte man meistens eine menschenlesbare Übertragung in Textform 
haben. Das finde ich auch vernünftig, denn solche Übertragungen kann man 
später im Fehlerfall viel leichter analysieren, als Binärdaten. Dazu 
sind die Funktionen atoi() und itoa() hilfreich.

> Wie funktioniert das mit dem Acc?
> Wartet TeraTerm mach jedem Paket auf ein Acc?

Du meist sicher ACK (Acknowledge). Das UART Protokoll kennt kein solches 
Signal. Ob und wie du ein solches Signal übermittelst und auswertest 
bleibt Dir als Programmierer überlassen.

Schau Dir mal die Steuerzeichen an, die der ASCII Zeichensatz definiert, 
die Zeichen mit dem Zahlenwert kleiner als 32 (dezimal). Vielleicht 
helfen Dir diese. Aber denke daran, das ASCII zum Übertragen von Text 
vorgesehen ist, nicht für Rohdaten in Binärform.

von Christian R. (holle)


Lesenswert?

Wow, vielen Dank für die ausführliche Hilfe.
Ich melde mich wieder wenn ich vor dem nächsten Problem stehe oder eines 
der "alten" lösen konnte ;-)

von Christian R. (holle)


Lesenswert?

Kurzer Zwischenstatus.
Die "Nebensachen wie 7-Segment-Ansteuerung, langen Tastendruck erkennen, 
Adresse auslesen) habe ich fertig und es funktioniert auch.

Beim UART habe ich aber noch Probleme.
Eine Übertragung findet statt, aber es kommt halt zu fehlern, Mit 2400 
Baud geht es einigermaßen, aber je schneller ich die Verbindung mache 
desto mehr Fehler sind da (ok, ist auch logisch).
Da ich alleine durch "annähnern" meiner Hand an das Steckboard mehr oder 
Weniger Fehler erzeugen kann habe ich nun ein ganz kurzes Stück CAT 5 
Kabel benutzt. Das Probem ist weniger, aber immer noch da.

Hat jemand eine Idee wie ich das in den Griff bekommen kann?

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Christian R. schrieb:

> Kurzer Zwischenstatus.
> Die "Nebensachen wie 7-Segment-Ansteuerung, langen Tastendruck erkennen,
> Adresse auslesen) habe ich fertig und es funktioniert auch.

Gut.

> Eine Übertragung findet statt, aber es kommt halt zu fehlern, Mit 2400
> Baud geht es einigermaßen, aber je schneller ich die Verbindung mache
> desto mehr Fehler sind da (ok, ist auch logisch).

Nö, bei gescheiter Programmierung sind auch 9600 oder DEUTLICH höhere 
Baudraten fehlerfrei machbar. Mit an Sicherheit grenzender 
Wahrscheinlichkeit ist deine Software arg falsch konzipiert, weil mit 
tonnenweise Delays vollgestopft und blockierend. Wie man es richtig 
macht, steht im Artikel Multitasking.

> Da ich alleine durch "annähnern" meiner Hand an das Steckboard mehr oder
> Weniger Fehler erzeugen kann

Dann stimmt was mit der Hardware nicht. Wackelkontakte oder offene 
Eingänge.

> Hat jemand eine Idee wie ich das in den Griff bekommen kann?

Wie wäre es mit einem Schaltplan und einem Stück Quelltext, ggf. sogar 
ein gescheites Bild vom realen Aufbau? Siehe Netiquette.

von Christian R. (holle)


Lesenswert?

Sorry wegen der späten Antwort. Irgendwie muss die "Neue-Nachricht-Mail" 
untergegangen sein, so dass ich den letzten Kommentar erst jetzt gelesen 
habe.

Zum Thema Schaltplan und Quellcode muss ich erst meinen Dozenten fragen, 
ob ich das bereits vor der Prüfung veröffentlichen darf. Es handelt sich 
um eine Projektarbeit mit einer Eidesstattlicher Erklärung.
Vor allem dieser Satz der Eidesstattlichen Erklärung macht mich 
unsicher, ob ich etwas veröffentlichen darf:

Die Arbeit wurde bisher weder im Inland noch im Ausland in gleicher o
der ähnlicher Form einer
anderen  Prüfungsbehör
de  vorgelegt  und  auch  noch  nicht  physisch  oder  elektronisch
veröffentlicht.

Da ich die Weiterbildung per "Ferstudium" mache sehe ich meine Dozenten 
nicht so häufig. Am Sa. den 26. habe ich meinen nächsten "Schultag", da 
werde ich fragen.


Zum eigentlichen Thema.
Ich habe das ganze nun erstmal im Simulator laufen, da kann ich äußere 
Störeinflusse schon mal ignorieren (vorerst).
Nun habe ich zwischen den Datenpaketen kleine Pausen gelassen und nun 
klappt es. Im Simulator ist ein Oszilloskop, auf dem ich sehen konnte 
dass das folgende Startbit ziemlich kurz auf das letzte Stopbit folgte, 
wodurch es zu Frame-Error kam.
Ich bin nun so weit, dass ich vom "virtuellen" Terminal ein Zeichen an 
den µC senden kann und dieser das gleiche Zeichen zurück senden (das 
werde ich später für das PC-Programm brauchen, damit ich eine 
fehlerfreie Übertragung sicherstellen kann. Das empfangene Zeichen wird 
per Interrupt in eine Variable gelegt und darauf wird in der 
Main-Schleife zugegriffen.
Das klappt eigentlich super, mit 2 Ausnahmen:

1. Das erste Zeichen ist immer falsch. Nachdem das erste Zeichen falsch 
übertragen wurde ist der Rest fehlerfrei (im Simulator).
Im virtuellen Oszilloskop ist erkennbar dass  beim ersten Zeichen die 
Daten zwischen den Max485 auf der A-Leitung ca. 8 Volt höher liegen als 
beim 2. Zeichen. Ich tippe darauf, dass der Fehler zustande kommt, weil 
der Bus nicht terminiert ist. Obwohl das bei 3 Teilnehmer (1x MAX485 vom 
Modul, 1x MAX 485 zum senden vom virtuellen Terminal und 1x MAX485 zum 
empfangen vom virtuellen Terminal) ja auch nicht zwingen nötig wäre.
Wenn ich den Bus jedoch terminiere (390 Ohm - 120 Ohm - 390 Ohm) bekomme 
ich keine Rechteckimpulse mehr, sondern nur noch Peaks.
2. Das zweite Problem ist, dass ich die Zeichen nicht so schnell 
hintereinander senden kann, da das sonst oftmals mit dem "Echo" nicht 
mehr klappt.
Z.B. wische ich mit dem Finger schnell über die Tastatur von 1 bis 0 und 
sehe dann im Terminal:
00112233455667789900 --> Bei der 4 und der 8 kam es nicht zum Echo.
Im Oszilloskop kann man erkennen dass die Pakete direkt hintereinander 
kommen und somit keine Verarbeitungszeit bleibt. Dieses Problem kann ich 
aber später PC-Seitig lösen, indem ich auf die Antwort warte bevor das 
nächste Paket raus geht.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Christian R. schrieb:
> Das klappt eigentlich super, mit 2 Ausnahmen:

Ehrlich: Das ist ueberhaupt nicht super. Das ist eigentlich der worst 
case. Es waere viel harmloser, wenn's ueberhaupt nicht klappen wuerde. 
Da waere die Fehlersuche viel simpler. So hast du viel mehr Action 
rauszufinden, was da jetzt wieder in deinem Simulator oder in deiner 
Software oder sonstwo schief geht.

Christian R. schrieb:
> Z.B. wische ich mit dem Finger schnell über die Tastatur von 1 bis 0 und
> sehe dann im Terminal:

Vielleicht so 'ne Sache ein bisschen "wissenschaftlicher" angehen. Also 
mit "normierteren" Testsequenzen.

Ich formulier's mal noch so positiv, wie's grad' noch geht:
Du bewegst ich noch innerhalb der von mir in meinem letzten Post 
gesteckten Erwartungen.

Sorry for no better news.

Gruss
WK

von Christian R. (holle)


Lesenswert?

Dergute W. schrieb:
> Moin,
>
> Christian R. schrieb:
>> Das klappt eigentlich super, mit 2 Ausnahmen:
>
> Ehrlich: Das ist ueberhaupt nicht super. Das ist eigentlich der worst
> case. Es waere viel harmloser, wenn's ueberhaupt nicht klappen wuerde.
> Da waere die Fehlersuche viel simpler. So hast du viel mehr Action
> rauszufinden, was da jetzt wieder in deinem Simulator oder in deiner
> Software oder sonstwo schief geht.

Naja, ich bin eigentlich sehr froh, dass es soweit funktioniert.
Ich teste das ganze mit 115200 Baud, denn wenn es hiermit problemlos 
läuft, dann mit kleineren Baudraten erst recht.
Das Problem, dass das erste Zeichen falsch ist, weil Leitung A 
anscheinend mit einer Gleichspannung überlagert ist nicht schön, aber 
damit könnte ich "umgehen" indem ich vor dem Senden einen Broadcast 
verschicke und erst danach die einzelnen Module anspreche. Schöner wäre 
es natürlich wenn ich den Grund für die Spannungsanhebung finde.


Dergute W. schrieb:
> Christian R. schrieb:
>> Z.B. wische ich mit dem Finger schnell über die Tastatur von 1 bis 0 und
>> sehe dann im Terminal:
>
> Vielleicht so 'ne Sache ein bisschen "wissenschaftlicher" angehen. Also
> mit "normierteren" Testsequenzen.

Wenn ich Zeichen einzeln sende kommen die alle fehlerfrei an. Auch das 
Echo vom µC kommt fehlerfrei im virtuellen Terminal an.
Lediglich das "erste" Zeichen ist fehlerhaft, danach kommen alle 
weiteren Zeichen fehlerfrei an. Wenn ich jedoch "zu schnell 
hintereinander" sende (das passiert beim "über die Tastatur wischen" 
kommt kein Echo mehr zurück. Die Daten werden jedoch fehlerfrei 
empfangen, aber bevor der µC diese bearbeiten kann kommen neue Daten per 
Interrupt und somit gehen vorherige Daten teilweise verloren. Warum das 
nur ab und zu passiert muss ich noch herausfinden.
Wenn ich das Programm für den PC schreibe wird dieses Problem sich von 
selbst erledigen, denn der PC sendet und wartet dann auf die Antwort. 
Erst dann wird das nächste Paket gesendet. Somit hat der µC auf jeden 
Fall genügend Zeit um die Daten zu verarbeiten und der PC kann sicher 
sein, dass die Daten vom Modul richtig empfangen wurden.

Wenn ich die Leitung terminiere wie es eigentlich gehört geht es nicht 
mehr (Peaks, statt Rechtecksignale). Nun muss ich erstmal herausfinden 
warum das so ist. Wenn ich die Datenleitung gescheit terminieren kann 
(inkl. Pull-Up und Pull-Down) bekomme ich das vielleicht auch hin, dass 
die Spannung von der A-Leitung am Anfang nicht zu hoch ist. Dann könnte 
auch das "erste" Zeichen fehlerfrei werden.

Ich werde euch weiter auf dem Laufenden halten.

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Hm, was simulierst du denn da alles? Sind da auch echte Leitungen (mit 
Belaegen, etc. also transmission lines) in der Simulation? Und auch 
Transceiver chips?
Und du hast ein Gleichspannungsversatz auf der Leitung bei einer 
Simulation, der das erste Byte verhunzt?
Hm - na, ich drueck' mal sicherheitshalber die Daumen, hoffentlich 
hilfts was.

Gruss
WK

von Joachim B. (jar)


Lesenswert?

Christian R. schrieb:
> Ich beabsichtige Bus-gesteuerte Module zu erstellen. Von diesen Modulen
> sollten >100 ansteuerbar sein.
>
> Das "Kaskadieren" (in Reihe) sollte laut dieser Beschreibung
> funktionieren:


mach es doch wie WS2812B LEDs

Din (Rx) und Dout(Tx) mit nicht zu hohem Takt

Vorteil:
Refresh vom Signal nach jeden Din durch Dout

Nachteil:
keinerlei Rückmeldung,
Signal wird erst nach einer Pause von allen übernommen,
wer nichts bekommt übernimmt auch nichts (Kette unterbrochen),
für >100 und je nach Nachrichtenlänge kann es langsam, sehr langsam 
werden.

von Christian R. (holle)


Lesenswert?

Hallo Joachim.
So hatte ich das ja erst vor, deswegen heisst der Thread ja auch 
MISO/MOSI.
Das ist für mein Projekt jedoch unpassend, da zu viele Module 
angesprochen werden müssen. Das dauert viel zu lange wenn die Daten 
immer weitergeleitet werden müssen und zudem ist das auch nicht für 
lange Leitungen ausgelegt.


Ich bin soeben wieder einen Schritt weiter gekommen.
Die Peaks beim Terminieren sind entstanden weil ich aus versehen A über 
390 Ohm gegen Ground und B über 390 Ohm auf VCC gezogen habe. Nun habe 
ich es korrigiert (anders herum) und dann waren da keine Peaks mehr, 
aber dennoch kam da nur noch Mist an.
Wenn ich nun aber nur 220 Ohm zwischen A und B schalte und zudem B über 
390 Ohm auf Ground (A bleibt ohne Pull-Up), dann passt auch das erste 
Zeichen. Die Gleichspannungsüberlagerung ist nun weg.
Warum es mit dem Pull-Up Probleme gibt verstehe ich nicht, dann egal wo 
ich etwas über eine RS485-Bus lese, dann ist der entweder nur mit 120 
oder 220 Ohm zwischen A und B terminiert (an beiden Enden), oder 
zusätlich mit 390 Ohm zwischen A und VCC, sowie B und GND (Einseitig 
...meist am Master).
Nirgendwo habe ich mal sowas gesehen wie ich es hier gerade verwende 
(Pull-Down, aber kein Pull-Up).


@Dergute
Ich habe hier leihweise ein Notebook mit Proteus 8 Pro. Das simuliert 
alles mögliche. Da habe ich den ATtiny (samt hex-datei) und auch die 
Max487 (die Max 485 gibt es darin nicht, aber die sind ähnlich).
Das Programm ist genial. Hier gibt es alles virtuell (Oszilloskop, 
Terminal, 7-Segment-Anzeige, usw.).

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Christian R. schrieb:
> Hallo Joachim.
> So hatte ich das ja erst vor, deswegen heisst der Thread ja auch
> MISO/MOSI.
> Das ist für mein Projekt jedoch unpassend, da zu viele Module
> angesprochen werden müssen. Das dauert viel zu lange wenn die Daten
> immer weitergeleitet werden müssen und zudem ist das auch nicht für
> lange Leitungen ausgelegt.

dann doch eher CAN-Bus gibt es ja für jeden Geschmack, von schnell bis 
langsam.

von Christian R. (holle)


Lesenswert?

Wie geil :-D

Ich habe das C-Programm nun wieder auf meinen ATtiny gespielt und "live" 
getestet.
Das Echo kommt fehlerfrei an, und auch beim "Wisch" über die Tastatur 
kommt jedes Zeichen korrekt an. Der Simulator ist anscheinend einfach zu 
langsam und hat deshalb ab und zu ein Zeichen verschluckt.

Da ich hier eine USB-RS485 Bridge von "in-circuit" verwende kann ich 
dank Dip-Schalter schnell die Terminierung ändern. Und siehe da, sowohl 
mit "lediglich Pull-Down", wie auch mit "Pull-Up und Pull-Down" bekomme 
ich trotz 115200 Baud keinen einzigen Fehler.

Aktuell verwende ich nur ein Modul mit einem 20cm kurzen Kabel. Wenn 
alles fertig ist werde ich 10 weitere Module bauen und dann auch noch 
ein 20 Meter langes Kabel verwenden.
Ich werde weiter berichten.


Edit:
@Joachim
Ne, da ändere ich nun nichts mehr ;-)
RS485 ist schon optimal. Ziemlich unanfällig gegen Störungen (dank 
Signal gegen invertiertes Signal), schnell und für lange Distanzen 
ausgelegt.

Dieses verdammte Notebook verschluckt manchmal ein paar Tasten. Nun weiß 
ich auch warum ich das geliehen bekommen habe ;-)

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Christian R. schrieb:
> @Joachim
> Ne, da ändere ich nun nichts mehr ;-)
> RS485 ist schon optimal.

widerspreche ich auch nicht, Datenrate soll wohl längenabhängig sein? 
jedenfalls bei RS232, Can könnte wohl schneller (oder weiter? weiss ich 
aber nicht)

Der Einfachheit halber würde ich auch bei RS485 bleiben wenns geenügt.

von Christian R. (holle)


Lesenswert?

Nein, die Datenraten belasse ich fest auf 115200 Baud. Die maximale 
Reichweite von 1200 Meter wird niemals erreicht, da ich immer nur die 
Distanz bis zum Router berücksichtigen muss, denn jeder Router wertet 
das Signal aus und sendet es erneut.
Bei 3 Router-Ebenen mit je max. 31 Routern und einer Modul-Ebene mit 
max. 31 Module kann ich somit 31^4  = 923521 Module ansteuern.

Das setzt sich so zusammen:
mit RS485 können max. 32 Teilnehmer angesprochen werden.
Für die Adresse benötige ich also 5 Bit (0-31). Die höchtste Adresse 
(31) dient als Broadcast, somit bleiben noch 31 Teilnehmer (0-30), 
welche mit den 5 Bit angesprochen werden können.
Bei den Routern gilt das gleiche.

Da für jedes Modul 2 Pakete nötog sind (das erste für die Adresse, das 
zweite für die Daten) und jedes Modul das gleiche Paket zurück schickt 
(damit ich am PC den fehlerfreien Empfang prüfen kann) sind 4 Pakete je 
Modul nötig.
(PC-Modul  ,  Modul-PC  ,  PC-Modul  , Modul-PC)
Wen nun ein Router verwendet wird sieht es so aus:
PC-Router-Modul  ,  Modul-Router-PC  ,  PC-Router-Modul  , 
Modul-Router-PC
Das sind schon 8 Pakete. Mit jeder Router-Ebene verdoppeln sich die 
Paketanzahl.
Mit 2 Router-Ebenen sind es 16 Pakete, mit 3 Router-Ebenen sind es schon 
32 Pakete, um ein einziges Modul ansprechen zu können.
Wenn man nun eine Monster-Liste von 1000 Einträgen übertragen will 
braucht man 32000 Pakete.
Jedes Paket besteht aus 10 Bit (Startbit, 8x Datenbit, Stopbit),
somit sind das 320000 Bits. Bei 115200 Bit wären also ca. 3 Sekunden 
nötig, um alle Module anzusprechen.
3 Sekunden wären bei so vielen Modulen noch vertretbar, aber wenn ich 
langsamer übertragen würde kommen leicht 2-Stellige Sekunden 
Übertragungszeit zustande, was dann nicht mehr akzeptabel ist.

Ich könnte das ganze auch noch etwas beschleunigen, indem die Router die 
Antwort vom Modul nicht sofort weiterleiten, sondern erst auf "Abruf". 
Dann kann der PC erst Daten an alle 32 Router der höchsten Ebene senden, 
dann vorne wieder anfangen und die Antworten "Abrufen".
So könnte die benötigte Zeit, bei guter Verteilung der Fächer, deutlich 
reduziert werden.
Der PC müsste dann für 1000 Module 2000x Daten an den Router der 
höchsten Ebene senden, dann 2000x die Daten anfordern und 2000x Daten 
empfangen.
Das wären 6000 Pakete, anstatt 32000 Pakete. Die Zeit könnte also auf 
ein Fünftel reduziert werden, sodern die Module schön verteilt sind.
Diesen Aufwand werde ich mir aber ersparen, da eine Liste mit 1000 Stück 
doch recht selten wäre und dann die 3 Sekunden vertretbar wären.

von HyperMario (Gast)


Lesenswert?

Christian R. schrieb:
> Ich habe noch nie mit einem Mikrokontroller gearbeitet, deswegen wollte
> ich vorher mal fragen ob mein Vorhaben so realisierbar ist.

Ja kein Problem, wenn du Sie alle hintereinander hängst brauchst du 
nicht mal eine Adresse

Hat aber starke Seiteneffekte. Erstmal musst alles durch alle 
durchschieben, ein Ausfall, reboot, Strom weg und nichts geht mehr.

Dann brauchst du ne relativ hohe Taktfrequenz. Deine 100 x deine 
Echtzeit ( minimale Reaktionszeit).

I2C ist auch nicht geeignet, bzw. für sternförmige Topologien nicht 
gemacht. Auch die Buslast ist eingeschränkt, von den kapazitiven 
Problemen mal ganz abgesehen.

LIN wäre gut geeignet, billig und hohe Reichweite.

Sinnvoll wäre auch CAN. 2 Drähte parallel (also egal welches Gerät an 
oder aus ist) dazu 0 Volt. 100 Teilnehmer + ,  Adressierung, 
Datensicherung, lange Kabel, all inklusive. Test und Inbetriebnahme Hard 
und Softwares gibt es auch in allen Preis- und Geschmacksrichtungen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

HyperMario schrieb:
> Ja kein Problem, wenn du Sie alle hintereinander hängst brauchst du
> nicht mal eine Adresse

Hast du dir wenigstens den Rest des bereits zwei Monate laufenden 
Threads durchgelesen? Das ist alles mehr oder weniger durchgekaut, und 
er befindet sich inzwischen in der Realisierungsphase …

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.