RS 232 Code für Mic rocontroller (GCC C ompiler)

Moin,

ich muss an einen Microcontroller f=FCnf Ger=E4te mit RS232 Schnittstelle anschlie=DFen. Dabei l=E4uft die Kommunikation nur mit maximal 9600 Baud, wahrscheinlich noch langsamer. Es wird nur ab und zu ein Starte-Messung Befehl gegeben und nach langwieriger Messung das Ergabnis ausgelesen. Daher kann die Steuerung der Schnittstelle auch in Software gegossen sein, was auch mangels gen=FCgender Hardware Ports zwingend ist, wenn ich nicht mehrere Controller einsetzen will. Der Compiler ist ein GCC von Microchip f=FCr die 16-bittigen PIC24, der mit

32 Mhz l=E4uft.=20

Ich k=F6nnte mir vorstellen, dass das Problem nicht neu ist. Mit der m=F6glichen Flankensensitivit=E4t des PIC24 sollte doch mit interruptgest=FCtzter Implementierung die geringe Baudrate mit hinreichender Genauigkeit zu machen sein. N=FCtzt man RTS und CTS, k=F6nnte es vielleicht sogar mit Pollen gehen. Oder sehe ich das zu blau=E4ugig? Hat da jemand Erfahrung? G=E4be es da einen fertigen Algorithmus f=FCr die Implementierung?

Reply to
Paul Rosen
Loading thread data ...

Paul Rosen schrieb:

Wird der Befehl von einem der 5 Geräte ausgelöst? Kann es sein, daß zwei Geräte gleichzeitig den Befehl senden?

...

... Nein, ist es nicht. Ich habe mal ein Beispiel gesehen, nannte sich soft-uart, WIMRE. Aber mit fünf ports würde ich eher in Richtung 5 zu 1 (De-)Multiplexer überlegen, wenn RTS/CTS verwendet werden können.

Dann "einfach" rundherum ein Gerät per MUX auf den UART schalten, dessen R(C?)TS freischalten, kurz warten und, wenn nichts kommt, das nächste Gerät wählen. So habe ich mal zwei serielle Ports an einen UART geschaltet.

Gruß, Falk

Reply to
Falk Willberg

Das geht durchaus. Ich habe sowas als 1-Kanal Empfänger schon mal mit nem PIC 16C54 in Assembler realisiert. Wünschenswert wäre allerdings ein INT-Eingang je Empfänger. Ansonsten brauchst du einen Timer-INT mit erheblich kürzeren Zeitintervallen als die Bitlänge. 1/8 der Bitlänge müsste ausreichen. Das wären dann bei 9k6 ca. 12us.

Der Programmablauf sieht so aus:

Im Timer zunächst auf das Startbit warten, dann 1,5 Bitlängen warten dann Bit 0-7 einlesen und anschließend jeweils 1 Bitlänge warten Testen, ob Stopbit korrekt fertig

Das ganze für die fünf Ports quasi parallel. Die Wartezeiten über Zähler realisieren, die in der Timer-INT-Routine jeweils decrementiert werden. Für 1,5 Bitlängen den Zähler auf 12 setzen, für 1 Bitlänge auf 8. Natürlich keine Warteschleifen im Timer verwenden.

12,5us könnte allerdings für 5 Kanäle knapp werden, auch bei 32MHz Taktfrequenz.

Gruß

Stefan DF9BI

Reply to
Stefan Brörring

Kommt darauf an, was der Controller sonst noch zu tun hat. Wenn du nur Halbduplex-Betrieb brauchst und die Geräte außerdem nur antworten, wenn du eine Anfrage sendest und du nicht alle 5 Geräte parallel empfangen musst, dann ist das überhaupt kein Problem. Ich kenne die 24'er PICs nicht, aber wenn die wie die kleineren PICs bei 32 MHz mit 8 MHz Befehlstakt arbeiten, dann hast du über 800 Takte pro 9600 RS232 Bit und kannst das leicht in Software implementieren.

Du könntest vielleicht sogar einen Interrupt für das Einlesen verwenden. Ich glaube nicht, daß man die 8-fache Frequenz braucht, so sollte es auch gehen: Mit der dreifachen Frequenz, 28800 Hz einrichten, pollen und wenn bei zwei aufeinanderfolgenden Interrupts das Startbit erkannt wird, einfach alle weiteren jeweils 3 Interrupts die Bits reinschieben. Das würde ich wohl auch noch mit einem PIC der 12'er Serie hinbekommen :-)

Wenn alle 5 Stellen gleichzeitig antworten können oder der Controller noch viel anderes zu tun hat, dann könnte es knapp werden, müsste man aber mal ausprobieren. Für sowas wäre dann ein kleiner CPLD vielleicht eine Idee, der die 9600 Baud annimmt und mit 115200 Baud an den Controller weiterleitet (oder gleich mit einem parallelen Interface, wenn du noch soviel Leitung frei hast), z.B. mit Codierung des Ports auf vier extra Leitungen, für das das jeweilige Byte reinkommt (und dasselbe umgekehrt zum senden). Da könntest du dann problemlos auch 10 Geräte mit 9600 Baud anschließen, oder noch mehr, wenn du parallel arbeitest.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Der Startbefehl kommt vom Mikrocontroller, wenn er Alles f=FCr die Messung Notwendige geregelt hat. Dann erwartet er die Messung. Er hat aber auch noch andere Dinge zu tun. Daher auch die Idee, den Zeitpunkt des Eingehens der Messung zu steuern.=20

Es sind zwar nur maximal zwei Ger=E4te, die messend unterwegs sind, aber die Paarung kann beliebig sein. Da der Controller auch das Startsignal gegeben hat, wei=DF er auch, welche beiden das sind.=20

dessen

geschaltet.

Von dem Ger=E4t werden maximal f=FCnf St=FCck gebaut, also ist Anzahl der Pins eigentlich kein Thema. Ich nehme inzwischen grunds=E4tzlich nur

80-pinnige, da die nur noch drei bis vier Euro kosten. Das macht das Handeln der >tausend PDF Seiten pro Controller =FCberschaubar. Darum schalte ich normalerweise auch keine Multiplexer mehr vor, nur um Prozessorpins zu sparen. Das war tats=E4chlich mit den kleinen PICs noch ein Thema, jetzt aber nicht mehr. Es besteht also kein Zwang wegen der 5-fachen Ausfertigung nur mit R/TXD zu arbeiten. Auch will ich an dieser Stelle nicht den L=F6sungen der Anderen vorgreifen. =20

Rundherum die Ger=E4te freigeben war auch mein Gedanke. Aber die Idee des externen Multiplexens ist in diesem Falle einfach das Genialste. So kann man die Genauigkeit und den Komfort des integrierten UART f=FCr alle Ger=E4te nutzen und es ist im Vergleich zu allen anderen M=F6glichkeiten mit Abstand die einfachste und sicherste. Vielen Dank f=FCr den Tipp :o)

Reply to
Paul Rosen

z.B. ein Graphikdisplay als Bedienoberfl=E4che und eine, wenngleich auch ganz kleine und anspruchslose Maschinerie ansteuern.

ja

musst,

Es k=F6nnen bis zu zwei gleichzeitig sendende Ger=E4te sein und diese beiden sind bekannt, da der Controller den Startbefehl gegeben hat.

arbeiten, Wenn man ihm 20mA g=F6nnt, dann 16 MIPS. Bei Netzbetrieb also gegegeben.

in

Was die zur Verf=FCgung stehende Zeit angeht, gehe ich mit Dir konform.=20

Ich k=F6nnte mir aber vorstellen, dass das Problem eher die Genauigkeit von maximal 2% sowie der Jitter ist, wobei ich bei Letzterem noch nicht die Spezifikation kenne, sofern =FCberhaupt definiert. Das w=FCrde ich nicht untersch=E4tzen. Da kommt es doch schon auf manche Feinheit an, die IMHO im Vorfeld schlecht abzusch=E4tzen sind. Daher auch meine Anfrage hier.

Reply to
Paul Rosen

Noe. Ich kenne deine PICS (ausspuck) nicht, aber habe soetwas schon mit MCS51, AVR gemacht. >möglichen Flankensensitivität des PIC24 sollte doch mit >interruptgestützter Implementierung die geringe Baudrate mit >hinreichender Genauigkeit zu machen sein. Nützt man RTS und CTS, >könnte es vielleicht sogar mit Pollen gehen. Oder sehe ich das zu >blauäugig? Hat da jemand Erfahrung?

Es gibt das Problem das du dann waehrend die Schnittstelle laeuft nichts anderes machen kannst. Und insbesondere duerfen keine langen Interrupts deine Routine zerhacken. Ausserdem belegt das Timing einen Timer oder du musst es auf Laufzeit trimmen. Und es macht dein Programm langsam.

Mit anderen Worten man kann das schon irgendwie hinbiegen wenn es nicht anders geht. Zum Beispiel wenn man an einem bestehenden Design noch was dranfummeln will.

Bei einer Neuentwicklung wuerde ich mir das aber auf KEINENFALL antun. Spaetestens wenn du das 1Jahr problemlos laufen hast und dann noch was anderes beigefummelt werden soll gibt es Probleme.

Ich wuerde ja den PIC in die Tonne kloppen und einen M16C nehmen. Oder notfalls einen externen UART dranklemmen.

Und noch was, wenn deine RS232 wirklich niemals gleichzeitig laufen, dann koenntest du sie ja alle mit einem Umschalter an die vorhandene RS232 haengen. Vielleicht sogar massiv parallel. :-) Wenn du jetzt sagst das geht nicht, dann frag dich mal was passiert wenn bei dir zwei SoftwareUARTs laufen sollen. .-)

Olaf

Reply to
Olaf Kaluza

Die andere Variante ist samplen. Ca. so:

formatting link
Alle RXD-Pins auf einen Port. Timerinterrupt liest Port und schreibt in FIFO im RAM. Hauptschleife liest FIFO und quetscht mit 5 Zustandsmaschinen die Datenbytes aus dem Bitstrom raus.

Bei 1200 - 2400 Baud ist alles realistischer.

Bei 2x 8 Bit Ports kann man externe Quad- oder Octal-UARTs verbauen. Allerdings hat man dann wieder Beschaffungsprobleme.

MfG JRD

Reply to
Rafael Deliano

Moin!

Existieren die 5 Geräte mit RS232 denn schon oder baust Du die auch? In ähnlicher Anwendung hatte ich einfach RS422 benutzt. Neben dem Vorteil der symmetrischen Übertragung kann hier nämlich jeder TX hochohmig geschaltet werden, und damit konnten alle Module ("Geräte") an einen einzigen Bus. Der Master ("Microcontroller") ruft einfach in die Runde, wer was tun soll (Modul 1 Messung starten, Modul 4 Messwerte schicken, Modul 2 resetten). Vorteil von RS422 gegenüber RS485 ist, daß sich die Module nicht gegenseitig hören sondern nur den Master, das vereinfacht die Software.

Voraussetzung ist natürlich, daß Du die Geräte selber baust und programmierst, sonst haben sie weder RS422 noch schalten sie ihren TX hochohmig noch fühlt sich nur eines als "Modul 2" angesprochen.

Vorgeschaltete RS422RS232 Wandler, die nur Befehle für das jeweilige Modul durchlassen und nur für die Dauer der Antwort TX aktivieren, gingen natürlich auch - wär in dem Fall aber vermutlich zu aufwendig.

Gruß, Michael.

Reply to
Michael Eggert

Das geht auch mit normalen RS232 wenn er die Leitungen nach dem Pegelwandler verknuepft. Setzt aber vorraus das die Protokolle auf den Leitungen sozialkompatible sind. Mit anderen Worten man muss also mindestens ein einfaches Busprotokoll haben mit dem man ein Geraet ueber eine Adresse anspricht.

BTW: Nutz einer hier M16C? Ich hab letzerdings einen lustigen Bug im M16C im Zusammenhang mit der seriellen Schnittstelle gefunden....

Olaf

Reply to
Olaf Kaluza

Wenn die Interrupt-Latenzzeit niedrig genug ist, du den Timerinterrupt für das Port-Handling mit höchster Priorität laufen lassen kannst und dieser Interrupt auch andere Interruptroutinen unterbrechen darf, die du ggf. für die Displayansteuerung o.ä. verwendest, dann würde ich da keine Problem sehen. Müsste man aber im Detail untersuchen, wie genau es sein muß, ist in den besseren Datenblättern meist angegeben.

Da du aber nur 5 Geräte davon baust, wäre wahrscheinlich das wirtschaftlichste (und langweiligste), die 20 Euro mehr zu investieren und einen zweiten Chip gleichen Typs draufzusetzen, der die gesamte serielle Kommunikation übernimmt, inklusiv Software-FIFO. Das kann dann auch problemlos mit 8-fach schnellem Interrupt laufen und Fullduplex bieten. Anbindung dann parallel mit einem einfachen asynchronen Protokoll.

Das mit den verschachtelten Interrupts stabil mit dem Rest des Programms hinzugekommen, könnte durchaus mehr Programmierkosten verursachen, als die Hardwarekosten für die extra Chips.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Wichtig ist in diesem Zusammenhang auch, erstmal alles empfangene irgendwo abzulegen und dann in Interrupt-Routinen niedrigerer Prioritaet abzuarbeiten. Dabei muss man wissen, wieviel zu den Hauptverkehrszeiten maximal reinkommen kann. Nicht dass einem dabei das RAM ausgeht.

Richtig. Am Ende ist es eine reine Business Entscheidung wie das meiste andere auch. Bei 100k/Jahr keine Frage, aber bei nur einigen hundert sieht es anders aus.

--
Gruesse, Joerg

http://www.analogconsultants.com/
 Click to see the full signature
Reply to
Joerg

Wenn das ohnehin nur geringe Stückzahlen werden, ist Deine Arbeitszeit das eigentlich teure.

Schau Dir mal das an:

formatting link

Heißt also: SPI des Prozessors nehmen, fünf von den Teilen anklemmen, für jeden ein /CS und ein /IRQ, und die Sache ist gegessen. Pegelwandler auf

+-12V sind auch gleich drin.

Mit freundlichen Grüßen

Frank-Christian Krügel

Reply to
Frank-Christian Kruegel

Vor dem Blick auf die Preisspalte aber erstmal hinsetzen. Ob die 8-Word FIFOs immer reichen, ist auch so eine Frage, koennte jedoch gehen.

--
Gruesse, Joerg

http://www.analogconsultants.com/
 Click to see the full signature
Reply to
Joerg

Joerg schrieb: ...

Wenn Soft-Uarts ausreichend sein könnten, wird kein FIFO gebraucht.

Falk

Reply to
Falk Willberg

Dann braucht man diese Chips aber auch nicht.

--
Gruesse, Joerg

http://www.analogconsultants.com/
 Click to see the full signature
Reply to
Joerg

Stimmt. Statt der von mir vorgeschlagenen (Du)Muxe reichen auch RS232-Konverter mit CE und Tri-State-Port Richtung uC.

Falk

Reply to
Falk Willberg

Man muss dabei jedoch den Worst Case beruecksichtigen, wenn alle fuenf angeschlossenen RS232 gleichzeitig zu quasseln anfangen. Paul schrieb "Es wird nur ab und zu ein Starte-Messung Befehl gegeben und nach langwieriger Messung das Ergabnis ausgelesen."

Nun koennte es alle paar Vollmonde passieren, das mehrere oder gar alle Stellen das Ergebnis praesentieren moechten. Wenn dann kein Handshake a la "Merke Dir das mal, bis die Messtellen 1, 2, und 3 vermeldet haben" moeglich ist, vielleicht mangels FiFo auf den Messtellen, dann wird's knifflig.

--
Gruesse, Joerg

http://www.analogconsultants.com/
 Click to see the full signature
Reply to
Joerg

Gibt es für solche Chips eigentlich einen Markt? Den preiswertesten fertigen Chip habe ich hier gefunden:

formatting link
?name=568-1120-5-ND

Ist aber ziemlicher Quatsch, wenn man nicht gerade Platzprobleme hat oder die hohen Baudraten braucht, da man dafür problemlos 15 kleinere Microcontroller bekommt, die jeweils mehrere UARTs in Software oder vielleicht auch zwei oder drei in Hardware haben.

CPLDs gibt es mittlerweile schon für $1, eben per

formatting link
gefunden:

formatting link
?name=122-1385-ND

Für 5 UARTs mit unterschiedlichen Takten, FIFO je UART usw. wird der aber wohl zu klein sein, aber ich schätze für

Reply to
Frank Buss

Sehe ich auch so. Auf die Schnelle habe ich keine Angabe zur FIFO Groesse gefunden, aber fuer >$20 kann man sich den Super-ARM mit Ledersitzen und Klimaanlage goennen, der das alles mit links erledigt. Es sei denn, es gibt dazu nichts brauchbares in den Libraries und man muesste alles handstricken, dann haengt es von der Stueckzahl ab.

Ja, 36 Macro Cells sind fuer die ordentliche Verwutzelung einer RS232 etwas duenn. Bisher waren die meisten CPLD auch in der Versorgung Schluckspechte.

Oder ein richtig fetter Haupt-Controller, der diese fuenf High-Priority ISR mit wegstecken kann.

--
Gruesse, Joerg

http://www.analogconsultants.com/
 Click to see the full signature
Reply to
Joerg

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.