Forum: Mikrocontroller und Digitale Elektronik Kommunikation zwischen Hardware Modulen.


von AVRli (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgende Sache irgendwie zu lösen. Ich habe eine Main Unit 
(ATmega 644), welche die Auswertung sämtlicher Signale und Zustände 
übernimmt. Nun habe ich auf einem Modul eine kleinere CPU (ATmega16 oder 
32) welche mit dem internen RC Oszillator betrieben wird. Dieser Salve 
überwacht 8 analoge Spannungen, wenn eine aus dem zulässigen Bereich 
kommt, wollte ich mit einer Leitung der Master CPU einen Interrupt 
zuführen und die soll dann die Möglichkeit haben, alle Spannungen aus 
dem Slave abzufragen.

Es kommen unter Umständen noch 2 der gleichen Slaves dazu, die machen 
auch wieder das gleiche... jeweils 8 analoge Spannungen kontrollieren 
und bei Grenzüber- bzw. -unterschreitung dies mitteilen.

Gut soweit zur Theorie... mir bekannte Busse sind UART, SPI, TWI... habe 
mit allen bereits gearbeitet, SPI und TWI leider nur TxD -> fire and 
forget... :-(

UART fällt aus, wegen interner Takterzeugung beim SLAVE.

Bleibt TWI oder SPI... oder was ganz was anderes?

Welcher dieser Beiden ist geeignet zuverlässig Daten zu übertragen so 
das Übertragungsfehler definitiv ausgeschlossen werden können? Die 
Baugruppen sind gut 40cm voneinander getrennt.


Grüße AVRli...

von Hmm (Gast)


Lesenswert?

TWI und SPI sind beide geeignet um Daten zu übertragen.

Da Du den Terminus "zuverlässig" und die Beschreibung "das 
Übertragungsfehler definitiv ausgeschlossen werden können" benutzt,
muss man Dir leider sagen das diese Kriterien nicht absolut sind sondern 
graduell. Anders ausgedrückt: Es gibt keine absolut zuverlässige 
Übertragung oder die Möglichkeit Übertragungsfehler definitiv 
auszuschliessen.
Das sind Parameter die mit statistischen Methoden beschrieben werden.
Es gibt eine Reihe von Möglichkeiten die Wahrscheinlichkeit der 
korrekten Übertragung zu erhöhen. Das Internet sagt mehr dazu.

Um dennoch mal so einen Anhaltspunkt zu geben, kann man pragmatisch 
sagen das die beiden Verfahren innerhalb ihrer Grenzen "recht 
zuverlässig" sind.
Es muss schon recht viel passieren, damit da was schiefgeht.

Die wesentlichen Einflussfaktoren sind die Entfernung und die 
elektromagnetische Umgebung. Dazu müsstest Du Informationen liefern.

von AVRli (Gast)


Lesenswert?

Hmm schrieb:
> Die wesentlichen Einflussfaktoren sind die Entfernung und die
> elektromagnetische Umgebung. Dazu müsstest Du Informationen liefern.

Ja wie geschrieben, die Module sind ca. 40cm von der Main Unit entfernt.
In der Umgebung ist etwas HF in der Luft. Es handelt sich um eine 
Steuerung von einem Fonie Sprach Relais. Am gleichen Standort sind aber 
noch andere Netzbetreiber mit etwas mehr Leistung aktiv. Also muss das 
ganze gegen HF Störungen unanfällig sein.

Die einzelnen Pakete kann man ja noch mit CRC versehen. Nur darf sich 
die Verbindung nicht aufhängen... :-(

Grüße AVRli...

von Purzel H. (hacky)


Lesenswert?

Ich wuerd das UART bevorzugen und wenn die Module als Subleiterplatten 
montiert sind, auch gleich den Controllerclock weitergeben, sodass alle 
synchron laufen. Denn TWI & SPI haben keinen Buffer, beide sind toll als 
Master aber beschissen als Slave. Denn der Slave muss hinreichend 
schnell Antworten, sonst ist das Byte schon ueberschrieben.

von Adib (Gast)


Lesenswert?

Wenn du keinen Quarz am uC hast scheidet USART aus.
Ich würde auch keinen "gemeinsamen" Clock quer über die Leiterplatte 
routen.

SPI scheidet aus, weil der Atmel beim SPI Slave keinen Puffer eingebaut 
hat. d.h. Nach der letzten Takt-Flanke des Bytes hast du einen halben 
Takt Zeit die Daten aus dem eingehenden Puffer zu lesen. Danach wird es 
vom neuen reinkommenden Daten überschrieben!
Beim XMega könntest du die Daten vielleicht noch per DMA o.ä. schnell 
wegspeichern.

Bleibt TWI. Das sit eigentlich keine schlechte Wahl. Mache ich auch. Der 
Slave bestimmt das Tempo durch freigeben der Clock-Leitung. Benutzt du 
die Hardwareeinheit, musst du so ziehmlich viele Fälle abfangen. Der 
Lohn ist eine schnelle und sichere Übertragung.
schnell: 400kBit,
sicher: der Master weiss zumindest, dass die Daten angekommen sind
Nachteil: der Master muss auf die Freigaben des Slaves warten und kann 
nicht einfach so drauf los senden (wie bei USART, SPI)

Also Master auf alle Fälle im ISR implementieren.

Viel Erfolg.

Adib.
--

von xfr (Gast)


Lesenswert?

Elf von Dreizehn schrieb:
> Denn TWI & SPI haben keinen Buffer, beide sind toll als
> Master aber beschissen als Slave. Denn der Slave muss hinreichend
> schnell Antworten, sonst ist das Byte schon ueberschrieben.

Das stimmt so nicht. Bei TWI hat der Slave die Möglichkeit, die 
Taktleitung Low zu halten, um die Übertragung zu bremsen.

Ich würde TWI nehmen, da es mit zwei Leitungen auskommt und schon mehr 
Protokoll eingebaut hat. Vor allem wenn immer die gleichen Daten als 
Antwort kommen und der Master außer der Device-Addresse nicht 
selektieren muss, ist das recht einfach.

von Spess53 (Gast)


Lesenswert?

Hi

>Wenn du keinen Quarz am uC hast scheidet USART aus.

Stimmt nicht. AVRs können auch synchrone UART.

MfG Spess

von Peter D. (peda)


Lesenswert?

Das ungepufferte SPI des AVR scheidet aus, damit läßt sich nicht 
zuverlässig ein Slave implementieren. Du kriegst graue Haare, ehe sowas 
läuft.
Auch läßt es sich schwer als Bus implementieren, da jeder ein separates 
Slave-Select braucht.

Das I2C ist geeignet, allerding unterstützt das HW-I2C keine 
Fehlererkennung und kann sich verklemmen.
Man muß also zusätzliche Timeouts aufsetzen, wenn SCL oder SDA auf Low 
klemmen bleiben oder der Master nicht erkennt, daß der Bus frei ist. Die 
Software wird also etwas haarig.

Ich würde die UART empfehlen (als RS-485 verbunden), das ist am 
einfachsten und sichersten.
Wieviel Millionen Stück willst Du denn pro Jahr verkaufen, daß der dafür 
notwendige Quarz Dir zu teuer ist?
Du kannst auch eine 3. Leitung nehme, wo der Master z.B. einen 
Sekundentakt verteilt und damit die Slave sich nachjustieren.
Oder der Mater sendet vor jedem Paket ein Break mit definierter Länge 
zum Nachjustieren. Es geht also auch ohne Quarz.


Peter

von Werner (Gast)


Lesenswert?

AVRli schrieb:
> In der Umgebung ist etwas HF in der Luft.

Schon wieder so ein Gummibegriff.
Am einfachsten ist, wenn du Übertragungsfehler auf der physikalischen 
Ebene der Übertragung tolerierst und durch entsprechende Absicherung im 
Datenübertragungsprotokoll (CRC) dafür sorgst, das sie ausreichend 
sicher erkannt werden. Durch geeignete Kodierung kann man auch 
erreichen, dass auf der Empfängerseite sogar Fehler teilweise 
korrigieren werden können (Stichwort Hammingabstand, FEC).

von Peter D. (peda)


Lesenswert?

Spess53 schrieb:
> Stimmt nicht. AVRs können auch synchrone UART.

Dann aber ATmega16 oder 32 -> ATmega164 oder 324.


Peter

von Ralph (Gast)


Lesenswert?

Adib schrieb:
> SPI scheidet aus, weil der Atmel beim SPI Slave keinen Puffer eingebaut
> hat. d.h. Nach der letzten Takt-Flanke des Bytes hast du einen halben
> Takt Zeit die Daten aus dem eingehenden Puffer zu lesen. Danach wird es
> vom neuen reinkommenden Daten überschrieben!

Naja einen halben SPI Takt hat man da Zeit.
Wie lange das dauert hat man da durchaus selbst unter Kontrolle.
2 Möglichkeiten.
1. Man betreibt die SPI als 5 wire Spi.
   Clock
   Mosi
   Miso
   Chipselct
   Busy
2. Der Master fügt eine Pause von x µsec/msec zwischen den einzelnen 
Bytes ein um dem Slave die Zeit zu geben.

Und eine CRC würde ich grundsätzlich bei einer Kommunikation verwenden. 
Dadurch kann man ja gerade erst erkennen ob die empfangenen Daten 
Korrekt sind, oder eben nicht. ==> Wiederholung der Übertragung im 
Fehlerfall
Treten CRC Fehler dann häufiger auf, ist es an der Zeit nach der Ursache 
zu suchen. zb EMV,Leitungsanpassung,Dämpfung ....

von AVRli (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Wieviel Millionen Stück willst Du denn pro Jahr verkaufen, daß der dafür
> notwendige Quarz Dir zu teuer ist?

Ja genau das ist es ja... es ist ein Einzelstück, es muss funktionieren, 
es darf auch was kosten, es muss nicht gespart werden... ;-)

Peter Dannegger schrieb:
> Ich würde die UART empfehlen (als RS-485 verbunden), das ist am
> einfachsten und sichersten.

Ok, dann brauche ich als "Master" CPU eine größere, die dann mit 2 
UART's HW seitig ausgestattet ist. Der eine dann für die BUS 
Kommunikation. Die zweite brauche ich für eine PC Anbindung.

Oberste Priorität bei dem Projekt ist die sichere Funktion.

Danke für Eure Diskussion, ich habe mit solch einer Bus Anbindung 
einfach wenig Erfahrung, von daher erspare ich mir durch Eure Tipps 
unter Umständen ewiges gefrimel.

Grüße AVRli...

von Peter D. (peda)


Lesenswert?

AVRli schrieb:
> Ok, dann brauche ich als "Master" CPU eine größere, die dann mit 2
> UART's HW seitig ausgestattet ist.

Geht auch gleich groß, heißt dann 644P.
Der 644 war schonmal abgekündigt, aber komischer Weise gibts den wieder.


Peter

von AVRli (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Geht auch gleich groß, heißt dann 644P.

:-O Schau an, der hat 2 UART's ??? Ich muss mir da mal das datenblatt 
besorgen. Ich muss gestehen das ich hinter dem P nun nicht gerade solch 
einen Funktionszuwachs erwartet hätte.

Grüße AVRli...

von weinbauer (Gast)


Lesenswert?

kommt halt drauf an was die µC noch so zu machen haben, ob da ggf. nicht 
mit Software-UART schon was gerissen werden kann.

Hab die Software-RX meist auf nem normalen INT-Eingang, dann entfällt 
die Lauscherei auf dem Pin.

von AVRli (Gast)


Lesenswert?

Ja nun HW wäre mir in dem Fall lieber. Nun stehe ich vor einem weiteren 
Problem, ich brauche nun noch 10x ADC... :-(

So langsam wird es eng...

Danke aber für die Überlegungen und die Diskussion, nach allen 
Recherchen zu RS-485 ist das für mich die beste Lösung.

Grüße AVRli...

von Peter D. (peda)


Lesenswert?

AVRli schrieb:
> ich brauche nun noch 10x ADC... :-(

74HC4051

Peter

von Frank K. (fchk)


Lesenswert?

AVRli schrieb:
> Ja nun HW wäre mir in dem Fall lieber. Nun stehe ich vor einem weiteren
> Problem, ich brauche nun noch 10x ADC... :-(

TLC1541/42/43

fchk

von AVRli (Gast)


Lesenswert?

Vielen Dank!!! Verbeugung ;-)

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.