www.mikrocontroller.net

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


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manfred Eggersdorf_com (Firma: Ingenieurbüro Eggersdorf) (m_eggersdorf)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tauwetter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gregor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft dir das weiter: 
http://arduiniana.org/libraries/NewSoftSerial/

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manfred Eggersdorf_com (Firma: Ingenieurbüro Eggersdorf) (m_eggersdorf)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian H. (heeen)
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.