Forum: Mikrocontroller und Digitale Elektronik Multi-Uart Schnittstelle mit serieller Ansteuerung.


von hello world (Gast)


Lesenswert?

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

von sechszweisechs (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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

von Marko H. (vitis01)


Lesenswert?

RS485 und die Teilnehmer alle an einen Bus hängen.

von Falk B. (falk)


Lesenswert?

@ 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

von Severino R. (severino)


Lesenswert?

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

von hello world (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von hello world (Gast)


Lesenswert?

thx erstmal :) an alle !!!

von Ent (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.