hi leute, habe da mal eine frage: ich will 4 geräte über uart ansteuern. die geräte schicken nur auf anfrage daten an den µC zurück. daher bietet sich eine multi-software uart an, die nacheinander die geräte anspricht und daten anfordert. die baudrate beträgt 19200 baud, ist also unkritisch. muss ich jetzt den timer jedesmal für jede neue anfrage neu initialisiern, um daten anzufordern?hat einer eine software uart geschrieben und kann sie mir als vorlage geben?habe diverse beiträge gelesen, aber irgendwie klappen die nicht so richtig... thx
Und was spricht gegen ein Hardware UART ? Es gibt genuegend Controller, die haben 4 UART, zb der Mega2560 bei den AVR. Fuer nur eins wuerd ich mir die Arbeit nicht machen.
@ hello world (Gast) >ich will 4 geräte über uart ansteuern. die geräte schicken nur auf >anfrage daten an den µC zurück. daher bietet sich eine multi-software >uart an, die nacheinander die geräte anspricht und daten anfordert. die Nöö, einfach 4mal MAX232 (die man sowieso braucht) und die Sigale auf einen Hardware-UART multiplexen. Billiger und einfacher gehts nicht. MFg Falk
RS485 und die Teilnehmer alle an einen Bus hängen.
@ Marko Hörner (vitis01)
>RS485 und die Teilnehmer alle an einen Bus hängen.
Dann müssten aber die Zielgeräte
a) auf RS485 umgebaut werden
b) mit einer Buslogik versehen werden
Da ist muxen wesentlich einfacher.
MFg
Falk
Leider hast Du nicht geschrieben, mit welcher Architektur resp. Controller Du arbeiten willst. Wenn Du z.B. einen PIC24 nimmst, kannst Du konfigurieren, auf welche Pins Du den UART legen willst, und zwar auch zur Laufzeit. Also hast Du einen integrierten Multiplexer. Das Ganze heisst "I/O pin mapping".
eigentlich wollte ich den atmega32 benutzen. das mit dem multiplexer hatte ich mir auch schon gedacht. einen max232 brauche ich nicht, da die angesteuerten geräte selbst mit einem µC arbeiten... benutze das stk500 zum testen. pic müßte ich mir erstmal anschauen... kann ich irgendeinen mux nehmen???
@ hello world (Gast) >hatte ich mir auch schon gedacht. einen max232 brauche ich nicht, da die >angesteuerten geräte selbst mit einem µC arbeiten... benutze das stk500 Ja und? Wenn aber die Leitung zwischen den Geräten grösser ist kannst du dir mit normelen CMOS Pegeln bisweilen schnell Müll an den Hals holen. >zum testen. pic müßte ich mir erstmal anschauen... kann ich irgendeinen >mux nehmen??? http://www.nxp.com/#/homepage/cb=[t=p,p=/50808/53504]|pp=[v=p,t=pfp,i=53504,fi=,ps=0]|[2] MfG Falk
Hi, ich habe selber auch mehrere Geräte mit Serieller verbindung an ein Mega32 angeschlossen, mit den Unterschied das die abholung kritisch ist, weil die Geräte selber senden, und nicht auf anfrage warten. Ich hatte auch selber ganz lange nach Beiträge mit SUART gesucht und wirklich nichts dazu gefunden. Die Hardware Uart war schon belegt mit der Kommunikation zwischen PC und µC
1 | $crystal = 14745600 ' used crystal frequency |
2 | Config Timer1 = Timer , Prescale = 8 |
3 | On Timer1 Timer1_isr |
4 | Enable Timer1 |
5 | |
6 | |
7 | Open "COMD.5:9600,8,n,1" For Input As #1 'Tr_RxD (lesen) Pin PortD.5 |
8 | Open "COMD.3:9600,7,e,1" For Input As #2 'SC_RxD (lesen) Pin PortD.3 |
9 | Open "COMD.2:9600,8,n,1" For Input As #3 'Tr2_RxD (lesen) Pin PortD.2 |
10 | |
11 | |
12 | Timer1_isr: 'Timeraufruf Timer1 |
13 | Timer1 = 65499 'reload Timer1 for a Period of 20ns |
14 | Tsbyte = Inkey(#2) 'einzelnes Zeichen von Gerät2 gelesen |
15 | If Tsbyte <> 0 and Gelesen2 = 0 Then |
16 | If Tsbyte = 13 Then |
17 | Incr It_sc |
18 | Bt_sc(it_sc) = 0 |
19 | Decr It_sc |
20 | Gelesen2 = 1 |
21 | Elseif Tsbyte > 31 Then 'Nach Gültige Ascii Zeichen prüfen (Keine Befehlszeichen) |
22 | If 19 > It_sc Then 'Max 19 Zeichen einlesen |
23 | Incr It_sc |
24 | Bt_sc(it_sc) = Tsbyte |
25 | Else
|
26 | St_sc = "" |
27 | It_sc = 0 |
28 | End If |
29 | Else
|
30 | St_sc = "" |
31 | It_sc = 0 |
32 | End If |
33 | End If |
34 | |
35 | '***************************** |
36 | ' Hier hat Gerät1 vorrang gegenüber Gerät3 |
37 | '***************************** |
38 | |
39 | Tsbyte = Inkey(#1) 'einzelnes Zeichen von lesegerät1 gelesen |
40 | If Tsbyte = 0 And Readtrans = 0 Then |
41 | Tsbyte = Inkey(#3) 'einzelnes Zeichen von lesegerät3 gelesen |
42 | Elseif Tsbyte <> 0 Then |
43 | If Readtrans = 0 Then |
44 | St_tr = "" |
45 | It_tr = 0 |
46 | End If |
47 | Readtrans = 2 |
48 | End If |
49 | If Tsbyte <> 0 Then |
50 | If Tsbyte = 13 Then |
51 | If It_tr = 11 And Tr_voll = 0 Then |
52 | Tr_voll = 1 |
53 | B_tr(12) = Bt_tr(11) |
54 | Bt_tr(11) = 0 |
55 | Trannum = 0 |
56 | If Readtrans = 0 Then Trannum = 1 |
57 | S_tr = St_tr |
58 | End If |
59 | St_tr = "" |
60 | It_tr = 0 |
61 | Elseif 71 > Tsbyte And Tsbyte > 47 Then ' Und es zwischen Ascii 0 und Ascii F/f liegt |
62 | If 11 > It_tr Then |
63 | Incr It_tr |
64 | Bt_tr(it_tr) = Tsbyte |
65 | Else
|
66 | St_tr = "" |
67 | It_tr = 0 |
68 | End If |
69 | End If |
70 | End If |
71 | Return
|
Das ist jetzt nur ein ausschnitt aus den Code den ich geschrieben habe um von 3 verschiedene Geräte gleichzeitig die Information zu lesen, die laufen zwar alle auf 9600, aber wenn man das einmal ändert bleibt das auch dann z.b. auf 19200. Man weis ja jetzt nicht ob du noch Pins frei hast, wie du die Geräte anschliesst und sowas. Wenn es bei dir nicht so Zeit Kritisch ist, musst du nicht den Timer nehmen, Die Geräte kannst du ja so einstellen das sie auf 2 Leitung achten Dann nimmst du einfach 2 Pins von Mega32 und benutzt diese als Multiplexer PinA 0 0 1 1 PinB 0 1 0 1 Gerät 1 2 3 4 Zusatz: PINC = 1 => Jetzt Senden! dann senden die einfach auf den Uart, so brauchst du nur die 3 Empfangs SUART einrichten. So hast du mit 6-7 Pins alle Geräte angeschlossen, Sonst könntest du ja auch versuchen alle auf 1 Pin anzuschliessen und mit 3-4 Pins zu steuern, wobei nur 1 Pin der Emfangsport ist.
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.