Forum: Mikrocontroller und Digitale Elektronik UART mit Logik schalten


von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

wie Ihr im angehängtem Bild sehen könnt möchte ich mit einem zweiten 
Atmega8 die UART Leitungen schalten um später mehrere UART-Geräte an dem 
UART-Port vom Atmega8 2/2 anzuschließen, sodass immer "gesteuert" ein 
Gerät verbunden werden kann.

Ich habe bereits über folgende Möglichkeiten gelesen:

separater UART Multiplexer Baustein
Logik Gatter
Controller mit mehreren UARTS
Selbstbau Dioden UND-Gatter

trotzdem würde ich es gerne so machen wie auf dem Bild gezeigt. Diese 
Variante wäre dann auch einfach erweiterbar. Aufgebaut habe ich es 
bereits. Beide Atmegas funktonionieren unabhängig voneinander 
einwandfrei. Der UART Atmega (läuft 16 MHz) sendet und empfängt über das 
Terminalprogramm. Der Logik Atmega (läuft mit 4Hhz) reagiert mit der 
UND-Logik wenn man VCC auf die Eingänge gibt. Aber im Verbund klappt es 
nicht.

Meine Fragen:

1. Kann das überhaupt funktionieren, wenn ja wie?

2. Muss ich vielleicht mit Transistoren arbeiten?

3. Müssen alle unbenutzten Pins vom einem Port vorsichtshalber auf Masse 
gelegt werden?

von Dietrich (Gast)


Lesenswert?

Hallo,

ich würde das mit Logik-ICs machen:
- Senderichtung mit einem Data Selector/Multiplexer
- Empfangsrichtung gar nicht: alle Hören alles mit
  (der über ein Logiksignal den RX auswählt, kann ja
  direkt p/SW seine UART Ein- und Ausschalten)
Wenn Du das unbedingt mit µC machen willst, musst Du
nur schnell genug (d.h. immer wider) den entsprechenden
Eingang auf den Ausgang schalten. Von dieser Zeit, die
die Schleife braucht um das Signal abzubilden, hängt es
ab, bis zu welcher Baudrate das ganze noch geht...

Gruß
Dietrich

von Tom (Gast)


Lesenswert?

Danke für die Antwort, aber...

wie gesagt ich möchte das mit uC machen, dass ist dann variabel 
erweiterbar ohne noch einen IC nachzulöten. Der Logik Atmega könnte ja 
auch mit 16MHz laufen, dass ist doch dann ausreichend.

"- Empfangsrichtung gar nicht: alle Hören alles mit"

meinst du damit das man die TX Leitung des uC ohne Probleme 
zusammenschalten kann mit allen RX Leitungen der Empfängergeräte? Bis zu 
wie vielen Teilnehmern soll dass klappen?

Danke
Tom

von Tim R. (vref)


Lesenswert?

Also das mit einem "Logik Atmega" zu machen halte ich ja für vollkommen 
übertrieben.
Guck dir mal das Teil hier an: SN74CBTLV3251

Wenn du davon 4 Stück auf dein Layout draufhaust, kommst du mit 5 
Steuerleitungen (3 Adressleitungen, 2 Outputenables) und deinen 2 TX/RX 
Leitungen am "Atmega8 2/2" aus.
Daran kannst du bis zu 16 UARTs anschließen.

Wenn das nicht reicht:
Für je 8 weitere In/Outs kommen einfach 2 weitere SN74CBTLV3251 + eine 
weitere Output Enable Leitung dazu.

von Dietrich (Gast)


Lesenswert?

Tom schrieb:
> meinst du damit das man die TX Leitung des uC ohne Probleme
> zusammenschalten kann mit allen RX Leitungen der Empfängergeräte? Bis zu
> wie vielen Teilnehmern soll dass klappen?

Das musst Du halt mal ausrechnen:
- wie viel Strom braucht ein Eingang?
- wie viel Strom kann ein Ausgang treiben?
Das am besten getrennt für High und Low.
Die Daten findest Du im Datenblatt des Prozessors.
Im Zweifel braucht Du noch ein Gatter oder ähnliches
als Treiber (Verstärker).

Gruß
Dietrich

von Tom (Gast)


Lesenswert?

Danke für die Antworten.

Die Multiplexer Idee hatte ich mir auch schon überlegt, aber wie gesagt 
möchte ich die Schaltung mit den Bauteilen, die ich hier zu Hause habe 
fertig stellen und nicht noch wieder was bestellen.
Desweiteren sollen die Geräte nicht nur zum uC UART senden und empfangen 
sondern man soll sie so verschalten können, dass sie sich auch 
untereinander "unterhalten" können.
Wenn die uC Lösung klappt, könnte ich rumexperimentieren. Was ich bisher 
ausprobiert habe funktioniert leider nicht. Sobald ich einen Controller 
Eingang mit der TX Leitung vom RS232 verbinde ist der Pegel fast 0V im 
Vergleich zum normalen RX Pin sind dort nach dem Verbinden 5V. Wenn ich 
mit den internen Pullupwiderständen arbeite klappts auch nicht.

Jemand noch eine Idee?

von Daniel -. (root)


Lesenswert?

Tom schrieb:
> trotzdem würde ich es gerne so machen wie auf dem Bild gezeigt. Diese
> Variante wäre dann auch einfach erweiterbar. Aufgebaut habe ich es
> bereits. Beide Atmegas funktonionieren unabhängig voneinander
> einwandfrei. Der UART Atmega (läuft 16 MHz) sendet und empfängt über das
> Terminalprogramm. Der Logik Atmega (läuft mit 4Hhz) reagiert mit der
> UND-Logik wenn man VCC auf die Eingänge gibt. Aber im Verbund klappt es
> nicht.

Dh Logik Atmega empfängt und sendet zuverlässig ohne Probleme?
Bis zu welcher Baudrate funktioniert das?
Ausserdem würde mich die Implementierung interessieren ..
Geht die RX-Leitung auf ext. int0 Eingang des Logik Atmega?
Wenn ja, dann müsste man in der Interruptroutine die UND-Verknüpfung 
realisieren (if ..) und direkt auf einen anderen Pin ausgeben.
(zum RX des UART Atmega).
Die TX-Leitung des UART Atmega geht auf ext. int1 des Logik Atmega,
und wenn da die Freigabe vorhanden ist, geht es über ein Pin zum
MAX232 raus?

von Tom (Gast)


Lesenswert?

Der Logik Atmega hat lediglich dieses kleine Programm drauf für ein 
einziges "und", ob das zu einfach gedacht ist, man sich die Pegel kaputt 
macht oder die Baudrate verfälscht wird weiß ich nicht. Deswegen frage 
ich ja hier nach.

Das was du da aufgreifst: keine Ahnung!

erstmal muss ein Signal mal durchgereicht werden und dann mal sehen...
1
#include <avr/io.h>
2
3
int main (void) //main funktion
4
{
5
DDRC = 0b11011111; //alle Pins als Eingang definiert außer PC5 0=Ausgang 1=Eingang
6
PORTC = 0b00000000; //Pullups deaktiviert 
7
PORTC &= ~(1<<PC5); // fuer die Initialisierung low setzen.
8
9
while(1)
10
{
11
  
12
  if ( (PINC & (1<<PINC4)) && (PINC & (1<<PINC2)) ) //wenn PINC4(TX leitung von RS232) und PINC2(Atmega 2/2) high sind tue was
13
    {
14
  PORTC |= (1<<PC5); //setze PC5 high
15
16
  }
17
18
PORTC &= ~(1<<PC5); //setze PC5 low
19
20
   
21
}
22
return 0;
23
}

von Stefan E. (sternst)


Lesenswert?

Tom schrieb:
> Der Logik Atmega hat lediglich dieses kleine Programm drauf für ein
> einziges "und"

Das passt ja hinten und vorne nicht.

1)
1
DDRC = 0b11011111; //alle Pins als Eingang definiert außer PC5 0=Ausgang 1=Eingang
Das ist genau verkehrt herum.

2)
Deine aktuelle "Logik" ist diese:
Mindestens einer der Eingänge auf Low -> Ausgang auf Low
Beide Eingänge auf High -> Rechtecksignal am Ausgang

von Dietrich (Gast)


Lesenswert?

Tom schrieb:
> while(1)
> {
>   if ( (PINC & (1<<PINC4)) && (PINC & (1<<PINC2)) ) //wenn PINC4(TX leitung von 
RS232) und PINC2(Atmega 2/2) high sind tue was
>   {
>   PORTC |= (1<<PC5); //setze PC5 high
>   }
>
> PORTC &= ~(1<<PC5); //setze PC5 low
>
> }

Außer dem, was Thomas geschrieben hat, setzt Du PC5 sofort wieder auf 
low
(die letzte Zeile ist außerhalb der if-Abfrage und wird immer 
ausgeführt!)
:-((

Gruß
Dietrich

von Dietrich (Gast)


Lesenswert?

Dietrich schrieb:
> Außer dem, was Thomas geschrieben hat,

Blödsinn: erstens war es Stefan und zweitens hat er es ja
schon erwähnt ("Rechteck").

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.