Hallo! Also ich bin noch relativ neu hier und muss erstmal sagen, dass ich hier schon viele Infos gefunden habe, die mir sehr weitergeholfen haben. Dafür schonmal herzlichen Dank! Jetzt habe ich mal eine Frage: Ich benutze einen ATmega8. Es gibt dort einen "sub" der in keinem Fall gestört werden darf, daher schalte ich vorher die interrupt ab und danach wieder an. Was passiert denn nu, wenn in dem Moment ein Byte über den USART (am PC) ankommt und nicht schnell genug verarbeitet werden kann, bis das nächste byte eintrifft (bei 115200 baud ist ja nich viel zeit zwischen den bytes)? merkt der PC das irgendwie, und wartet dann? Kann er ja eigentlich nicht, wenn nur RX und TX genutzt werden, oder? Man müsste doch dann das RTS und CTS nutzen, oder? Während die Interrupts abgeschaltet sind ist CTS low, so dass der PC weiß, dass der µC nicht bereit ist. Ist meine Überlegung richtig? Oder gibt es da noch sub-Signale die der USART selber über die TX leitung schickt um zu sagen "verstanden" oder "nicht verstanden"? Wenn es zu Datenverlust kommen kann: Wie könnte man das verhindern? Habt ihr da eine Idee? Vielen Dank für eure Antwort schonmal im Vorraus! Andi
Hallo, der übliche Weg ist, den RX-Interrupt nicht zu sperren, sondern die Daten nur flott beiseite zu schaffen (dauert vielleicht 1-2us) und schnell zurück zu springen. Generell ist es nicht schön, Interrupts lange zu sperren, das bringt dir für jede weitere Änderung oder Erweiterung des Programms das gleiche Risiko, dass die Reaktionen nicht schnell genug sind. Was du über RTS/CTS vermutest, ist richtig. Das gleiche ohne zusätzliche Signale wäre Xon/Xoff (auch Software-Handshaking genannt). Das macht der Mega8 aber beides nicht heimlich, das wäre Deine Aufgabe, wenn du das so haben willst.
Zunächst mal danke für die schnelle Antwort! Um konkreter zu werden: Es soll ein DMX-Interface werden. Ich muss ja ein DMX-Signal nach RS485-Standard erzeugen. Soweit so gut, dann müsste ich die Interrupts ja eigentlich nur während des Senden eines Bytes unterbrechen... zwischen stoppbit und nächstem byte kann ich da schnell den Interrupt ausführen? Die Kiste wird mit 16MHz laufen, also wird das wahrscheinlich noch nicht mal eine µs dauern... Zu der anderen Möglichkeit: Ich habe ja noch ein paar Ports frei... Da könnte ich doch den CTS an einen dranhängen und auf low setzen, wenn der PC nicht senden darf, oder? Das müsste dann ja auch gehen, oder? Dann noch eine Frage zum Takt: 16MHz, es wird ja mit Hilfe dieses Takts ein RS485-Signal erzeugt, weshalb der ja wahrscheinlich ziemlich genau sein sollte, oder? Was sollte ich da am besten als Taktgeber nehmen? Reicht ein RC-Glied oder Quarz oder sollte es ein Oszillator sein? Gruß Andi
Hardware-Handshaking ist gut und Sinnvol, wenn da noch Leitungen frei sind, meist hat der PC mehr Luft und genügend Puffer, so daß es da eher nicht problematisch wird. Du solltest Deinem Atmel möglicht viel Reserve einräumen, weil ein verpaßtes oder verhunztes DMX-Signal ist schlimmer, glaube ich. Als Taktgenerator in jedem Fall einen möglichst temperatustabilen Quarz einsetzen. Ach ja, und der Schnittstellen-Converter sollte auch genügend Speed verkraften können (der zwischen PC und Interface), sonst gibt´s da Trouble mit verrauschten Bits.
Was meinst du mit genügen Speed? Welchen Converter würdest mir da empfehlen? Aber meine Logik war richtig? Wenn ich dem PC das senden steuern will ist die Logik: CTS=0 senden verboten und CTS=1 senden erlaubt Wie ist das mit dem dem Interrupt verarbeiten zwischen zwei Bytes? Wird das vom RS485-Protokoll toleriert? Weißt du das zufällig?
Da fällt mir noch was ein: Zur Generierung des DMX-Signals... das könnte ja auch der USART machen... der wird aber ja vom PC belegt! Gibt es einen ähnlichen µC, der 2 USARTS hat? Nur so eine Idee...
Gibt es eigentlich einen Hardware UART im DIP-Gehäuse? Ich hätte gern bis zu 4 oder 8 UARTS an einem AVR...
Natürlich. Von ziemlich vielen Herstellern sogar: Motorola 6850 (benötigt externen Baudratengenerator) Rockwell 6551 (interner Baudratengenerator) Exar 68681 (zwei Schnittstellen, int. Baudrate) Intel 8250 (der "Urvater" der seriellen Schnittstelle, wie sie in PCs verbaut wird, int. Baudrate) National Semiconductor 16450 (Nachfolger 8250), 16550 (mit Sende- und Empfangsfifos) Von letzteren gibt es auch Zwei- und Vierfachausführungen im PLCC-Gehäuse, das mit entsprechenden Sockeln auch in handlötbare Dimensionen kommt, 16552 und 16554, Hersteller ist unter anderem TI. Reichen die?
Von Philips gibt es auch einen achtfach USART - SCC2698 - im PLCC84 Gehäuse. Beim Anschauen des Preises bitte festhalten! Bei Segor z.B. 48 Euro. Also besser mehrere 2- oder 4-fach Bausteine nehmen. Dieter
Hallo, seit wann kann man bei einer RS485-Schnittstelle mit RTS/CTS protokoll arbeiten? Wenn ich die Sepz. richtig im Kopf habe, wird als Verbindung eine Leitung mit 2 Adern benutzt, von Steuerleitungen wie bei RS232 ist da nirgendwo die Rede. mfg Gast
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.