Mehrere Software UARTS auf einem uC

Gast #1549297
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
Gast #1549438
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
(Firma: Ingenieurbüro Eggersdorf) #1549586
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
Gast #1549683
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.
Gast #1549889
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
(Firma: Ingenieurbüro Eggersdorf) #1549932
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
Gast #1549969
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
Gast #1551332
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
Angehängte Dateien:
Gast #1559476
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren