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.
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
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
> ... 2.8V Pegel ...
Du verwendest nicht zufällig ein Telit GE865 Modul?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.