www.mikrocontroller.net

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


Autor: hello world (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: sechszweisechs (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marko Hörner (vitis01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RS485 und die Teilnehmer alle an einen Bus hängen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: hello world (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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/535...]

MfG
Falk

Autor: hello world (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thx erstmal :) an alle !!!

Autor: Ent (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
$crystal = 14745600                                         ' used crystal frequency
Config Timer1 = Timer , Prescale = 8
On Timer1 Timer1_isr
Enable Timer1


Open "COMD.5:9600,8,n,1" For Input As #1                    'Tr_RxD (lesen)  Pin PortD.5
Open "COMD.3:9600,7,e,1" For Input As #2                    'SC_RxD (lesen)  Pin PortD.3
Open "COMD.2:9600,8,n,1" For Input As #3                    'Tr2_RxD (lesen)  Pin PortD.2


Timer1_isr:                                                 'Timeraufruf Timer1
   Timer1 = 65499                                           'reload Timer1 for a Period of 20ns
      Tsbyte = Inkey(#2)                                    'einzelnes Zeichen von Gerät2 gelesen
      If Tsbyte <> 0 and Gelesen2 = 0 Then
         If Tsbyte = 13 Then
            Incr It_sc
            Bt_sc(it_sc) = 0
            Decr It_sc
            Gelesen2 = 1
         Elseif Tsbyte > 31 Then                            'Nach Gültige Ascii Zeichen prüfen (Keine Befehlszeichen)
            If 19 > It_sc Then                              'Max 19 Zeichen einlesen
               Incr It_sc
               Bt_sc(it_sc) = Tsbyte
            Else
               St_sc = ""
               It_sc = 0
            End If
         Else
            St_sc = ""
            It_sc = 0
         End If
      End If

'*****************************
' Hier hat Gerät1 vorrang gegenüber Gerät3
'*****************************

      Tsbyte = Inkey(#1)                                    'einzelnes Zeichen von lesegerät1 gelesen
      If Tsbyte = 0 And Readtrans = 0 Then
         Tsbyte = Inkey(#3)                                 'einzelnes Zeichen von lesegerät3 gelesen
      Elseif Tsbyte <> 0 Then
         If Readtrans = 0 Then
            St_tr = ""
            It_tr = 0
         End If
         Readtrans = 2
      End If
      If Tsbyte <> 0 Then
         If Tsbyte = 13 Then
            If It_tr = 11 And Tr_voll = 0 Then
               Tr_voll = 1
               B_tr(12) = Bt_tr(11)
               Bt_tr(11) = 0
               Trannum = 0
               If Readtrans = 0 Then Trannum = 1
               S_tr = St_tr
            End If
            St_tr = ""
            It_tr = 0
         Elseif 71 > Tsbyte And Tsbyte > 47 Then            ' Und es zwischen Ascii 0 und Ascii F/f liegt
               If 11 > It_tr Then
                  Incr It_tr
                  Bt_tr(it_tr) = Tsbyte
               Else
                  St_tr = ""
                  It_tr = 0
               End If
         End If
      End If
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.