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?
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
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
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.
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
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?
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?
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 | }
|
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.