Ich habe diesen ID-Sensor für eine Scalextric-Slotcar-Strecke gebaut , basierend auf einem PIC12F629. Der ID-Sensor sendet die ID eines erkannten Autos als RS232-Signal auf einem Pin (TTL-Pegel).
Meine Frage ist, wie kann ich Daten von etwa vier dieser Mikrocontroller in den USART eines anderen Mikrocontrollers (PIC18F2550) empfangen?
Ich bin auf diese Möglichkeiten gekommen:
Jeder ID-Sensor-Chip wird mit einer Kennung codiert, die als Teil der Daten gesendet wird, damit sie auf der Empfängerseite getrennt werden können.
Update: Weitere Informationen zur Sensorhardware hinzugefügt.
Wenn Sie Ihr Protokoll so einrichten, dass die Autos nur auf Anfragen des Controllers antworten, können Sie (zumindest auf der logischen Ebene) einfach alle miteinander verbinden.
Der Trick ist, ob Sie echtes RS-232 (mit 1 = -6 bis -12 V und 0 = 6 bis 12 V) oder nur eine Standardlogikleitung (1 = VCC, 0 = GND) haben. Darauf sollte entweder das Datenblatt oder ein Geltungsbereich antworten.
Wenn es Standardlogik ist, könnte es wirklich einfach sein. Wenn Ihre Sensoren ihre Ausgangstreiber steuern können, programmieren Sie sie so, dass sie den Ausgang nicht ansteuern, es sei denn, eine Nachricht wird ausgegeben. Wenn Sie den Ausgangstreiber die ganze Zeit eingeschaltet lassen müssen, lassen Sie ihn einen oder zwei Transistoren ansteuern, um eine "Open-Collector" -Konfiguration zu erstellen, verbinden Sie alle Kollektoren der Sensoren miteinander und ziehen Sie die angeschlossene Leitung an VCC hoch und schließen Sie sie an den RX-Pin Ihres Hauptcontrollers. Dies funktioniert, weil das RS-232-Protokoll im Zustand logisch 1 im Leerlauf ist. Wenn RS-232-Signalpegel verwendet werden, müssen Sie die Transistorkonfiguration ein wenig ändern, aber es bleibt im Kern immer noch Open-Collector.
Die Hauptsteuerung fragt einfach jeden Sensor nacheinander nach seinen Daten. Jeder Sensor antwortet auf Anfrage. Auf diese Weise haben Sie nicht mehr als einen, der gleichzeitig die RX-Linie fährt, was das Hauptziel ist.
Nun, wenn Sie Ihre Sensoren nicht dazu bringen können, nur dann zu sprechen, wenn Sie angesprochen werden ... dann wurde Ihr Problem sehr schwierig. So sehr, dass die einfache Antwort darin besteht, jedem Sensor einen eigenen seriellen Anschluss zu geben, möglicherweise unter Verwendung von 8-Pin-Controllern als Sensormanager, die dann an einen kooperativen seriellen Bus angeschlossen werden können. Andere Techniken, wie z. B. die Kollisionserkennung mit erneuter Nachrichtenübertragung (wie es 10base-T-Ethernet tat), sind viel komplexer.
Wenn Ihr Sensor eine "bereite" Leitung aufnehmen und alle Ereignisse, die eintreffen, wenn sie nicht aktiviert sind, verschieben und sie übertragen kann, wenn dies der Fall ist, ist es am besten, eine separate Besetztleitung an jeden Sensor zu senden und ein "UND"-Gatter zu verwenden Kombinieren Sie die Signale aller Sensoren. Ich würde vorschlagen, dass Sie, wenn Sie vier Sensoren haben, die "bereiten" Drähte in Round-Robin-Manier mit etwas "toter" Zeit zwischen ihnen radeln sollten (wenn niemand "bereit" ist); Wenn ein Byte während der "toten" Zeit eintrifft, nehmen Sie an, dass es vom letzten aktiven Sensor gesendet wurde. Stellen Sie die "Bereitschafts"-Zeit lang genug ein, damit ein Sensor reagieren kann, und die Totzeit lang genug, damit ein Sensor Zeit hat, die Übertragung eines Ereignisses zu beenden, das auftritt, kurz bevor seine "Bereitschafts"-Leitung deaktiviert wurde.
Bearbeiten
Basierend auf weiteren Beschreibungen, da anscheinend jeder Sensor eine eindeutige bekannte ID-Nummer hat, denke ich, dass der beste Ansatz darin bestehen könnte, eine einzelne serielle Leitung zu haben, die über einen parallelen Widerstand und eine Diode mit einem PWM-Ausgang verbunden ist, so dass sie gezogen wird alle 2 ms für 1.900 us angehoben, aber für 200 us heruntergezogen (wenn man einen PWM-Schalter zwischen Active-Low und Floating haben könnte, wäre das noch besser). Sobald ein Auto gesehen wird, sollte ein Sensor die folgende Zustandsmaschine starten und verfolgen, wie viele zehn Mikrosekunden seit Beginn der Ausführung vergangen sind.
Unter Verwendung eines UART sollte dieser Ansatz es einem ermöglichen, Autos, die auf einem beliebigen Sensor ankommen, in beliebiger Reihenfolge zu verarbeiten und ihre Timings innerhalb von 10 us aufzulösen, mit der Maßgabe, dass Autos sequentiell mit einer Rate von einem alle 2 ms verarbeitet werden, und Sensoren werden dies tun "blind" zwischen dem Zeitpunkt, an dem sie ein Auto sehen, und der Haupt-CPU, um es zu verarbeiten. Wenn es nicht eine wirklich große Anzahl von Sensoren gibt, sollte das kein Problem darstellen. Beachten Sie, dass die Haupt-CPU kein genaues Timing für irgendetwas anderes als ihren PWM-Ausgang haben muss. Alles weitere ist dem seriellen Datenstrom zu entnehmen (auch die „langen Pausen“ durch die PWM-„Low“-Pulse).
Sie können ein MODBUS-Protokoll im RTU-Modus mit RS485-Schnittstelle implementieren, das auf PIC gut funktioniert (bei Ihrem PIC nicht so sicher).
Sie können eine Multidrop-Leitung haben, um Ihre verschiedenen Mikrocontroller-Geräte auszuruhen und eine gute Kommunikation zwischen ihnen auf dem seriellen UART zu haben.
Sie können Ihren PIC18F2550 als Master machen, der die Transaktion von allen anderen 4 Controllern initiiert.
Verwenden Sie Zeitmultiplex. Der Master sendet auf einer separaten Leitung einen Sync-Impuls, mit dem die Slaves einen Timer zurücksetzen. Wenn ein Slave Daten zu senden hat, wartet er, bis der Timer gleich (Slave-Nummer * Zeitfensterbreite) tickt, bevor er sendet. Der Zeitschlitz sollte lang genug sein, um das Paket zu senden und Taktungenauigkeiten zwischen Sensoren zu berücksichtigen.
Elektrisch gesehen möchten Sie vielleicht die gemeinsame TX-Leitung hochziehen und zwischen 0 und Tristate umschalten, um zu senden, anstatt Strom zu liefern, um eine 1 zu bestätigen.
Ich habe diese Seite mit einer Lösung namens BlackNet gefunden. Es basiert auf einem ziemlich einfachen Protokoll, bei dem die Idee darin besteht, dass jeder Knoten im Netzwerk einen eigenen Zeitschlitz hat. Dh es ist eine Art Round-Robin-Logik. Das letzte Bild auf der Seite zeigt ein Schema mit der geringsten Menge an Komponenten, die zum Funktionieren benötigt werden.
Ich habe diese Idee verwendet und einfach die beiden Sensoren, die ich gebaut habe, direkt an den RX-Pin des PIC18F2550 angeschlossen. Ich habe jedoch nicht das Round-Robin-Protokoll implementiert, sondern die Daten nur bitweise auf die Leitung gerammt (und gehofft, dass jeweils nur einer sendet). Bisher hat es eigentlich ganz gut funktioniert...
Für zukünftige Leser: Wenn es wichtig ist, dass Ihre Daten immer durchkommen, ist die von mir verwendete Lösung wahrscheinlich keine gute Idee. Wenn Sie jedoch selten Daten senden und mit der Möglichkeit leben können, dass es zu Kollisionen kommt, und Sie eine möglichst einfache Lösung wünschen, ist diese meiner Meinung nach gut genug.
Olin Lathrop
Mike Desimone
Anttu
Anttu