Hallo Zusammen,
bin kein Expertin von Schaltungstechnik, so habe ich ein Problem bei der
Schaltungsentwurf.
Ich möchte zwei oder drei verschiedene Module wie z.B. RFID-Reader oder
Sensor-Empfänger an einem Mikrocontroller anschliessen und die von
Module eingelesenen Datenrahmen verarbeiten. Als Mikrocontroller wähle
ich ATMega128, der 2 serielle Schnittstelle besitzt. Aber eine davon
möchte ich für die Kommunikation mit anderem Mikrocontroller benutzen.
D.h. die Signalen (gleicher Pegel von 5 Volt) von zwei Module
(RFID-Leser und Sensor-Empfänger) müssen durch eine serielle
Schnittstelle eingelesen werden.
Hier stellt sich die Frage, wie ich die Schaltung entwerfen sollte,
damit die Kollision der Signale nicht auftritt, wenn die beiden Signale
von beiden Module gleichzeitig nach Mikrocontroller gesendet sind.
Ich habe nun überhaupt keine Ahnung. Kann jemand hier als Erfahrene mir
weiter helfen? Vielen Dank im Voraus!
Liebe Grüße
Vintagewomen
>Hier stellt sich die Frage, wie ich die Schaltung entwerfen sollte,>damit die Kollision der Signale nicht auftritt, wenn die beiden Signale>von beiden Module gleichzeitig nach Mikrocontroller gesendet sind.
Dann hast du leider Pech gehabt ;) Das geht nicht.
Du musst durch ein geeignetes Softwareprotokoll dafür sorgen, daß es
nicht zu Kollisionen kommt. Die angeschlossenen Busteilnehmer dürfen
erst nach Aufforderung durch den Busmaster (Deinen Controller) Daten
übertragen.
Hallo Zusammen,
danke für die Antworten. Hier eine weitere Frage für Rufus t. Firefly,
meinst Du es, dass ich zwei Schalter, die durch Mikrocontroller
gesteuert sind, in den zwei Busteilnehmer einbauen? Welche Schalter kann
ich benutzen?
Liebe Grüße
Vintagewomen
Das Protokoll der RS232- Schnittstelle kennt die Leitungen RTS... usw,
die die Sende-Empfangsbereitschaft der andren Geräte melden. Diese
leitungen sind gerade für den Zweck vorgesehen, den Datenaustausch
freizugeben, zu sperren und zu steuern.
Auch sind atmega nicht so teuer, dass man nicht für jede 232 einen
eigenen mega8 nehmen könnte, der als Datenhandler/Puffer arbeitet.
In deinem Fall wäre I2C als Schnittstelle passender.
Die Serialschnittstelle (RS232 mit TTL-Pegel) ist eigentlich nur für
Point-to-Point Verbindungen geeignet/gedacht.
I2C hingegen ist für bis zu 127 Geräte ausgelegt. Dann hast du einen
Master (dein Mega 128) und die anderen Geräte sind Slaves. Gibt übrigens
auch gleich fertige ICs als Sensoren mit I2C-Schnittstelle (zB LM75 als
Temperatursensor)
Mit deim RFID Leser musst du halt schaun ob der I2C hat bzw ein µC
hinbasteln welcher die Schnittstelle dann umsetzt.
Gruß
Bevor man 'mach alles anders' oder 'geht nicht' schreibt, sollte man
nachfragen, welche Möglichkeiten überhaupt vorhanden sind.
Vintagewomen möchte verschiedene RFID Leser und Sensoren an einen Mus
klemmen, was aber nicht sagt, ob sie einen Einfluss auf diese
Komponenten hat und ob diese busfähig sind. Auch die Idee mit den
Busumschaltern ist nur dann mögllich, wenn man den Komponenten mitteilen
kann, ob man gerade bei ihnen ist. Sonst sendet der RFID Leser seine
empfangenen Kennung fröhlich ins Nirvana oder der Controller schaltet
mitten im Datagramm auf den Bus und versteht nur Bahnhof.
Sollten die Komponenten also busfähig sein, so schreib mal, welche
Optionen da bestehen. Sollten sie es nicht sein, so hilft nur ein
kleiner Controller pro Teilnehmer, der diesen dann an einen gemeinsamen
Bus koppelt.
Welche Bus man da nimmt, hängt von der Länge ab. Schließt man die
Komponenten über lange Kabel an eine Platine an, auf der die kleinen
Controller die Daten an den Großen Senden, so kann man gerne I2C nehmen.
Verbaut man die kleinen Controller vor Ort an den Komponenten und führt
dann lange Kabel zu dem einen großen Controller, dann nimmt man RS485
und nicht I2C.
Aber nu schreibt mal mehr zu Deinen Readern und Sensoren, Vintagewomen,
dann kann man Dir auch helfen.
Gruß, Ulrich
Der Mega64 hat gleich zwei Probleme, erstens hat er nur 2 USARTs und
zweitens ist er abgekündigt. Der XMega64A1 hat dafür 8 USARTs ist aber
noch preliminary.
Das Stichwort ATXMEGA oder XMEGA gibt weder bei Reichelt noch bei
digikey einen Treffer. ATMEL wollte sich zuerst auf dei 128er und 256er
der XMega Serie konzentrieren, bevor sie die kleineren davon in Angriff
nehmen.
Gruß, Ulrich
Ja, aber weil man zu wenig weiß, kann man nur raten. Die Kaba Leser
sprechen auch ein nettes Ein-Draht Protokoll. Das kann man sogar mit nur
einem halben Software-UART lesen. Aber was nützt das Raten, wenn nicht
mehr Infos kommen. Vielleicht unterstützt der RFID ja auch Adressierung
oder neben RS232 auch RS485... Man weiß ja nicht :)
@ Läubi .. (laeubi) Benutzerseite
>Ne weitere lösung wäre natpürlich eine Software UART...
Die brauchbarste Lösung wäre Brain 2.0. Bei schlechter Verfügbarkeit
tuts auch Nachdenken 1.5.
Wer für die paar popeligen Sensoren drei oder mehr UARTs braucht, ist
schlimmer als jeder BASCOM-Programmierer ;-)
MFG
Falk
Hallo,
danke für alle Antworten. Die Sensor-Empfänger ist nicht ausschaltbar,
aber der RFID-Leser ist durch Befehl ausschaltbar. Software USART ist
eine Variante. Aber für 3 oder 4 Moduls ist nicht mehr geeignet. Ich
habe auch schon viel im Internet nachgeschaut und möchte fragen, ob es
ein Multiplexer in der Markt gibt, der die "Reihefolge" der ankommenden
Siganlen aussortieren kann und damit kann der Controller in dieser
Reihefolge die Signale ein nach dem anderen einlesen.
Liebe Grüße
Vintagewomen
Hi!
@Falk: Nana, bitte, dann rück mal raus, was B2.0 oder ND1.5 bei Dir
ausgegeben haben :)
@Vintagewomen:
Du kannst einen Multiplexer nehmen, und legst zusätzlich die
Datenleitung auf einen Interrupt-Eingang. Wenn Du schnell genug
umschaltest könnte das funktionieren, dass Du genug vom Start-Bit des
Telegramms mit bekommst um es noch durch den USART zu schicken.
Andere Lösung wäre, dass die RFID-Leser nicht geschrieben werden müssen
und entweder sie eine eigene Adresse mitsenden, oder die Information, an
welchem Leser die Karte erkannt wurde egal ist. Dann klemmt man alle
Leser auf eine Empfangsleitung (Wired-Or mit Pullup bei 5V Pegeln).
Ein serieller Multiplexer ist nur dann eine Lösung, wenn man verlorene
oder verstümmelte Telegramme einkalkuliert.
Wir wissen immer noch zu wenig:
Welche Leser, welche Sensoren, welche Leitungslänge, welche Wichtigkeit?
Fragen über Fragen...
Gruß, Ulrich
@Ulrich P.
wie soll das denn gehen, wenn 2 geräte gleichzeitig daten senden? Der
Multiplexer müsste so intelligent sein das er 1byte entgehen nimmt und
dann an den µC weiter leitet - am besten mit einer ID des einganges vo
wo er das byte empfangen hat.
Auch ein CMOS Schalter ist ja ein Multiplexer. Oder ?
Also einfach einen 4051 oder 4053 nehmen RX und TX 2x rein und 1x raus.
Adressierung über A/B und gut ist.
@Ulrich P. (uprinz)
>@Falk: Nana, bitte, dann rück mal raus, was B2.0 oder ND1.5 bei Dir>ausgegeben haben :)
Hier wird schon genug orakelt. Ne gescheite Antwort kann man erst geben,
wenn man gescheite Informationen hat. Haben wir noch nicht (wirklich).
>Du kannst einen Multiplexer nehmen, und legst zusätzlich die>Datenleitung auf einen Interrupt-Eingang. Wenn Du schnell genug>umschaltest könnte das funktionieren, dass Du genug vom Start-Bit des>Telegramms mit bekommst um es noch durch den USART zu schicken.
AUA! Solche Stunts würe ich nicht mal einem Profi empfehlen!
>Wir wissen immer noch zu wenig:
Aha . . .
MFG
Falk
So, bevor ich mich ins Wochenede verabschiede:
@Peter: Ich hatte ja gesagt, dass man verlorene Telegramme
einkalkulieren muss.
@Falk: Ist ein Stunt, klar, aber ich habe hier Leser, die mit 1200Baud
herumjuckeln und das sollte gehen, wenn der uC nix anderes zu tun hat.
@Vintagewomen: Wir wissen immer noch nicht genug und meine Glaskugel ist
zum Putzen beim Optiker...
Egal, was man da bastelt. Mit MUX und bla ist alles murks. Wenn man
wirklich keine Chance hat, die Protokolle der einzelnen Busteilnehmer
auf einen gemeinsamen Nenner zu bringen, dann sollte man sich seinen
gemeinsamen Nenner selber schaffen. Basta. Und das würde hier bedeuten,
dass man einfache billige kleine Controller nimmt, die das Protokoll
konvertieren und sich mit einem Master unterhalten, oder gleich auf ein
Protokoll konvertieren, dass ein PC versteht.
Gerade da das ganze hier nach einer Übungs- und Lernaufgabe klingt,
würde ich den Einsatz einzelner kleiner Controller empfehlen. So kann
man das ganze Projekt sowohl in der Hardware als auch in der Software in
einzelne Lernschritte aufteilen, die sich vom Logischen bis in die
Hardware durchziehen.
Logisch, ich würde auch einfach zwei SC16IS762 neben den AVR kleben und
hätte damit 4 USARTs an einem SPI oder einem I2C. Aber das ist schon
übelste SMD Technik und die Fragestellerin machte nicht den Eindruck,
als wäre das ihr täglich Brot.
Bis denne, Ulrich
Hallo,
bin nach einigen Tagen wieder hier und habe ich eine Lösung am
Wochenende gefunden, deswegen ich einmal hier die Lösung posten. Mein
problem ist, wie die Datenkollision an seriellen Schnittstellen zu
vermeiden. Meine Methode ist, dass man ein 74151N (Multiplexer) und ein
74138N (Demultiplexer) benutzen kann. Durch diesen Mux kann der
Mikrocontroller durch die Adressenbusse (Addr0 bis Addr2) ein von 8
Eingänge freiwillig auswählen. Solche Eingänge sind auch mit der
Interrutpins des Mikrocontrollers angeschlossen, so dass die unerwartet
ankommende Daten bemerkt werden können.
Ich hoffe, wenn jemand noch Idee hat, der einmal posten kann. Vielen
Dank!
Liebe Grüße
Vintagewomen
VINTAGE-Woman schrieb:
> Software USART ist> eine Variante. Aber für 3 oder 4 Moduls ist nicht mehr geeignet.
Sagt wer?
Wir wissen ja immer noch nicht, welche Baudrate und Datenrate.
SW-UART Senden geht für beliebig viele, man kann ja nacheinander senden.
SW-UART Empfang per Timerinterrupt für einen Port, also 8* sollte bis
9600Baud kein Problem sein:
4-fach Abtastung = 26µs Interruptrate = 520 Zyklen @20MHz
Peter
@Peter,
Hallo Peter,
ja, ich weiss nicht so viel über SW-USART und Mikrocontorller und bin
nur ein Anfänger. Vielen Dank für Deinen Beitrag. Die Baudrate ist 9600.
Ich möchte nun einen Mux benutzen und habe folgendes Problem. Kann man
Port F (PF0..PF3) von ATmega128 als normale IO (hier für Adressenbus)
verwenden?
Liebe Grüße
Vintagewomen
Hallo,
VINTAGE-Woman schrieb:
> bin nach einigen Tagen wieder hier und habe ich eine Lösung am> Wochenende gefunden, deswegen ich einmal hier die Lösung posten. Mein> problem ist, wie die Datenkollision an seriellen Schnittstellen zu> vermeiden. Meine Methode ist, dass man ein 74151N (Multiplexer) und ein> 74138N (Demultiplexer) benutzen kann. Durch diesen Mux kann der> Mikrocontroller durch die Adressenbusse (Addr0 bis Addr2) ein von 8> Eingänge freiwillig auswählen. Solche Eingänge sind auch mit der> Interrutpins des Mikrocontrollers angeschlossen, so dass die unerwartet> ankommende Daten bemerkt werden können.
Ah ja. Und wacht der Mikrocontroller dann vor Schreck, wenn von einem
Deiner Module gerade Daten empfangen werden und ein anderer zu Senden
beginnt und damit den Interrupt auslöst? Daten vom ersten wegwerfen, um
den zweiten zu empfangen oder Daten vom zweiten wegwerfen?
Und täglich grüßt das Murmeltier...
Zitat aus Posting 1:
>Hier stellt sich die Frage, wie ich die Schaltung entwerfen sollte,>damit die Kollision der Signale nicht auftritt, wenn die beiden Signale>von beiden Module gleichzeitig nach Mikrocontroller gesendet sind.
Gruß aus Berlin
Michael