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
Ne weitere lösung wäre natpürlich eine Software UART...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.