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
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
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
>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.
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
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
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
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
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
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.