Multi-Uart Schnittstelle mit serieller Ansteuerung.

Gast #707854
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
#707864
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
Gast #709932
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???
#709960
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
Gast #714004
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren