Forum: Mikrocontroller und Digitale Elektronik Mehrere Software UARTS auf einem uC


von Peter (Gast)


Lesenswert?

Hallo zusammen.
Ich realisiere ein Projekt mit dem uc PIC 18lF4680. Da habe ich mehrere 
Schnittstellen:
1: UART zum GSM-Modul
2: UART zum GPS-Modul
3: UART auf COM-Schnittstelle (zum PC)
4: CAN zu 2 Antrieben.

Nun verwende ich die Hardware-UART für das GSM-Modul.
Doch dann bleiben mir noch 2 UARTs und wenn ich die Library des 
Compilers (C18) verwenden will, habe ich nur eine restliche zur 
Verfügung.

Ich müsste irgendwie die Definitionen wärend dem Programmablauf ändern.

// ******* UART Definitionen GPS-Schnittstelle *******
#define SWTXD    PORTE
#define SWTXDpin  1
#define TRIS_SWTXD  TRISE

#define RX Pin SWRXD  PORTE
#define SWRXDpin  0
#define TRIS_SWRXD  TRISE

Hat einer von euch dieses Problem schonmal gehabt und gelöst?

Das GSM-Module hat Autobouding: "where rate is the port speed and can be 
0, 300,1200,2400,4800,9600,19200,38400,57600,115200 bps."

GPS: 4800 bps.
PC:  4800 bts.

Falls es Zeitprobleme gibt könnte ich immer noch Hartware und Sofware 
UART umfädeln...

Fosc = 16 MHz

Ich hoffe ich habe alle relevanten Daten aufgeschrieben.
Gruss Peter

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

bei 4800 Baud maximal brauchst du eine Timerroutine mit 4800 x 16 für 
die Software-UARTs, das ergibt dann max 200 Osc-Zyklen für die 
Timer-ISR. Das sollte für 3 oder 4 einfache Software-UARTs reichen, aber 
knapp, es muss also optimal programmiert werden. Meiner Meinung nach ist 
C ungeeignet dafür, die ISR ist in Assembler zu programmieren.

Gruss Reinhard

von Manfred E. (Firma: Ingenieurbüro Eggersdorf) (m_eggersdorf)


Lesenswert?

Hi,
ansonsten könnte man noch die Frage stellen, ob Du die UARTs wirklich 
alle zeitgleich brauchst....?

Falls nicht zwingend könnte die Lösung lauten, daß Du zwei 
Schnittstellen zusammen auf einen vorhandenen UART legst.

Den Datenstrom schaltest Du dann via Gatter (durch ein GPIO gesteuert) 
auf die eine, bzw. auf die andere Hardware-Schnittstelle.

Mußt natürlich mit jedem Umschalten den doppelt genutzten UART neu 
initialisieren - dafür hast Du danach die Rechenleistung wieder frei.

Gruß Manfred

von Tauwetter (Gast)


Lesenswert?

>bei 4800 Baud maximal brauchst du eine Timerroutine mit 4800 x 16 für
>die Software-UARTs,

In der Regel reicht es aus, mit vierfacher Abtasttung/Bit zu arbeiten, 
wobei das Rx-Bit in der Mitte bewertet wird. Das Senden ist völlig 
unkritisch, da nicht auf ein ext. Signal synchronisiert werden muß. Hier 
reicht somit Timerfrequenz = Baudrate.

von Gregor (Gast)


Lesenswert?

Hallo Peter,

muß es unbedingt der PIC sein?

Mit dem LPC3250 von NXP hättest Du genug HW UARTS (7) und ist auch recht 
preiswert.

Gruß,
Gregor

von Florian (Gast)


Lesenswert?

Vielleicht hilft dir das weiter: 
http://arduiniana.org/libraries/NewSoftSerial/

von Peter (Gast)


Lesenswert?

Danke für die Antworten!
Ja der PIC steht fest. Ich habe den Print schon geäzt und bestückt. 
Desshalb wäre mir eine Softwarelösung das Angenehmste. Aber so wie es 
aussieht wird das kritisch. Ich kann nur C, kein Assebler programmieren.

Habe dann an eine bidirektionalen Multiplexer gedacht. Mit dem MAX399 
wären bei Dual (TX / RX) 4 Kanale möglich:
http://datasheets.maxim-ic.com/en/ds/MAX398-MAX399.pdf
wäre das eine Lösung?

Muss ich dann wirklich die USART immer neu initialisieren? Ich könnte 
die Baudraten alle auf 4800 bps festlegen und Format auch einheitlich.

Aber zur Anfangsfrage zurück - mit der Library Software UART vom C18 
Compiler geht das nicht? Wegen der Präprozessordefinitionen?

Grüsse Peter

von Manfred E. (Firma: Ingenieurbüro Eggersdorf) (m_eggersdorf)


Lesenswert?

Hallo,
ja gute Frage....(bez. Max 398/399)

Also ich meine, wir sind doch einer Meinung, daß das Multiplexen wenn 
denn auf dem Logikpegel des uC stattfindet, sprich zwischen uC und 
Bustreiber (232, Can, etc.)...oder?

Da sollte doch ein "08/15-Gatter" ausreichen - zumindest bei uns hat in 
einem Projekt der CD4052** gute Dienste getan.

Bei gleicher Baudrate kann natürlich die Initialisierung vereinfacht 
werden - für saubere Verhältnisse (z.B. Puffer leer, Interrupt aus) 
sollte dennoch zumindest meiner persönlichen Einstellung nach während 
des Umschaltens gesorgt sein.

Gruß Manfred

von Peter (Gast)


Lesenswert?

Ja genau. Zwischen uC und den anderen Bausteinen. Ich habe 3.0V Pegel 
(zu GSM/GPS: 2.8V und restlicher Elektronik: 3.3V pegelkompatibel)

Leider habe ich dieses Bauteil (MAX399) weder bei Farnell, noch 
Distrelec gefunden. Hat mir jemand einen Tipp vo ich den sonst noch 
bekommen könnte?

An Lager hätte ich "HEF4051B 8-channel analog multiplexer/demultiplexer" 
Dann müsste ich 2 Bausteine einsetzen. Nicht gerade optimal. Viel 
Hardwareaufwand... Und bin mir nicht ganz sicher ob der mit SingelSupply 
3V einwandfrei funktioniert.

Gruss Peter

von Florian H. (heeen)


Lesenswert?

> ... 2.8V Pegel ...
Du verwendest nicht zufällig ein Telit GE865 Modul?

von Peter (Gast)


Lesenswert?

Der Hersteller stimmt, der Typ nicht, aber fast: GM862-GPS

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.
Ich habe mir die Lösung mit Multiplexen mal skizziert.
Über einen Hardware Interrpt erkenne ich dass etwas empfangen werden 
soll.
Sofort werden alle 4 Kanäle auf das Startbit getestet, dann beim aktiven 
Kanal normal eingelesen. Alles ist dann 4800 bps.--> Periode = 208us.
Das müsste bei Fosc= 16MHz genügen oder?

Grüsse Peter

von Peter (Gast)


Lesenswert?

Niemand da der das weiss???
Ich bin mir nicht sicher ob ich noch sauber empfangen kann, wenn das 
erste Bit nicht gleich lang ist, wie die anderen...
Gruss Peter

von MagIO (Gast)


Lesenswert?

Bei dieser seriellen Datenübertragung stellt man ja im voraus die 
Baud-Rate ein. Das macht man deshalb, damit man das Timing kennt. Der 
Empfänger wartet, bis er die Flanke des Start-Bits erkennt. Danach wird 
das Timing so gewählt, daß immer so ca. im Mittelpunkt eines Bits die 
Datenleitung abgefragt wird.

Zwischen den Datenbits nachher ist das Timing ja durch die Baud-Rate 
festgelet und man kann einen Timer-Interrupt bemühen.

In deinem Fall sollte sich ermitteln lassen, wie lange der PIC braucht 
vom Eingang des Startbits über Umschalten der Latches bis zum Aufsetzen 
des Timer Interrupts. Das heißt der erste Timer Interrupt sollte so 
gewählt werden, daß der PIC ca. in der Mitte des 2. Bits landet.
Dann sollte das schon klappen.

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.