Hallo zusammen. Ich habe folgendes Problem: Ein bestehendes System, dass Daten über eine Strecke von bis zu 2km überträgt, schafft eine Baudrate von max 4800Baud. Die Software die nun eingesetzt werden soll ist auf eine Baudrate von 9600Baud beschränkt. (Wie hirnrissig vom Programmierer). Ich kann beide Systeme nicht ändern, möchte aber versuchen die Baudrate anzugleichen. Daten werden nur in einer Richtung übertragen und zwar immer nur vom Empfänger zum PC/Software. Es kommen pro Sekunde maximal 10 Datensätze je 20 Byte an. Wann der Datensatz ankommt ist egal, solange das nicht um mehr als 2 Sekunden verschoben ist. Meine Idee. Ich empfange einen Datensatz mit 4800Baud und speichere Ihn in einem Puffer. Wenn der Datensatz komplett empfangen wurde sende ich ihn an einer anderen Schnittstelle mit 9600Baud aus. Müsste jeder kleine Tiny schaffen können. (idealerweise 2x Hardware-UART). Meine Frage an euch. Kann das funktionieren, oder hab ich etwas nicht bedacht? Gibts dafür eventuell auch andere Lösungen? MfG Hias
Ein 8052 kann das mit EINEM Uart. Ein gebräuchliches Derivat wäre AT89C52 bzw. AT89S52. Dann gäbe es dazu noch die S53, wenns n bisschen mehr Speicherplatz braucht, oder ein S8252/S8253, wenns einen internen EEPROM haben soll. Desweiteren gibts Low-Pin-Count-Derivate, z.B. AT89C2051 usw. Natürlich gibts das Zeug nicht nur von ATMEL, auch von Philips usw. Bzgl. der Lösung mit nur einem UART des 8052, man kann den Timer 2 als Baudratengenerator nur für Tx, nur für Rx oder für beides einstellen. Timer 1 kann also z.B. die 4800er Baudrate erzeugen, Timer 2 für 9600 Bd. Du brauchst nicht mal puffern, da die Daten ja langsamer kommen, als du sie wegschickst... Sollte also kein großer Aufwand sein... Falls du vor 8052ern zurückschreckt, ich kann leider im Moment nicht sagen, ob der AVR das auch kann... Ralf
Ich persönlich würde einen AT Mega 162 nehmen. Der ist zwar recht überdimensioniert, aber er ist günstig, leicht zu bekommen, und durch seine 2 Hardware UARTs wird die Software sehr einfach. Stefan
Ralf wrote: > Du brauchst nicht mal puffern, da die Daten ja langsamer kommen, als du > sie wegschickst... Hallo! Danke für deine Antwort. Angenommen ich habe eine Datensatz mit 20Byte, dann ist es der Software egal, wie lange der Abstand zwischen den einzelnen Byte ist, solang in der richtigen Baudrate, oder? Wenn das so ist verstehe ich dass ich keinen Puffer brauch. Wenn nicht, bräuchte ich bitte Aufklärung. Ich denke dass das wohl jeder µC können wird. Ich hab noch einen 90S2313 daliegen. Der hat ein Hardware UART (zum empfangen) und zum senden verwende ich ein Software UART. Dann brauch ich doch nur jedes empfangene Byte (Interrupt) an die 2. Schnittstelle übergeben. Ist das wirklich so einfach? Hias
Naja, das mit der Zeit zwischen den einzelnen Bytes lässt sich nur durch Einblick in den Quellcode der Software einwandfrei beantworten. Wenn kein TimeOut vorhanden ist, in dem ALLE Daten vorhanden sein müssen, ist es egal, ob du das erste Byte heute und das letzte in zwanzig Jahren schickst... Was ich dir aber garantiert sagen kann (und damit bist du auf der sicheren Seite), ein AT89xx bzw. AVR hat auf jeden Fall genügend RAM, um die paar Bytes, die jede Sekunde kommen, zu puffern, damit du einen kompletten Satz abschicken kannst, sofern es nicht über 100 Zeichen auf einmal werden... Ralf
Nachtrag: Ob dein 90S2313 genügend RAM hat, weiss ich nicht, ist was älteres, oder? Komme aus der 8052-Ecke, daher meine Unwissenheit. Bevor ich jetzt geschlagen werde, ich werd demnächst auch mal mit nem AVR spielen :-) Ralf
Richtig. Allerdings ist eine Software UART etwas aufwändiger, passt aber natürlich lockerst in z.B. einen 90S2313. Baudratenquarz sollte unbedingt dran (der 90S2313 geht eh nicht ohne Quarz). Stefan
Hallo! So heute mal des ganze umgesetzt. Von PC zu PC klappt das ganze mit den unterschiedlichen Baudraten ohne Fehler. Hab gerade 1000 Byte übertragen /1000 empfangen. Leider funktioniert das ganze in der Umgebung wo es mal hin soll noch nicht einwandfrei. Das Problem liegt wohl an der Funkübertragung. Ich kann die Daten mit dem Hyperterminal einwandfrei empfangen. H-Term z.B. lest gar nichts ein, genauso wenig mein µC. Irgendwas kann das Hyperterminal was ich bis jetzt nicht berücksichtigt habe. In der Anleitung der Funkübertragung steht nichts über das Protokoll oder die Übertragung, nur das dies von 2400Baud bis 4800Baud ohne Protokoll erfolgt. Wo ist also der Unterschied, und was kann man da tun? Hias
Werden die Handshake leitungen verwendet? oder sind sie im alten stecker miteinander verbunden?
Im Stecker sind 4/6/8 gebrückt. Das Orginalkabel der Funkanlage ist nur 2 polig. Daten und Masse. Von dem her glaube ich das kein Handshake verwendet wird. Hat irgendjemand eine andere Idee?? Hias
Hallo Matthias, durch Aneinanderreihung einiger Subroutinen ist das Problem auch entsprechende Deiner Idee wirklich sehr einfach zu lösen. 1. UART-Baudrate auf 4800bps einstellen 2. im internen RAM die Startadresse für die Datenablage wählen 3. ankommende Daten ab Startadresse in internes RAM schreiben; beenden wenn 20 Zeichen eingelesen oder z.B. <CR> erkannt wurde 4. UART-Baudrate auf 9600bps einstellen 5. Startadresse für Datenablage im internen RAM erneut anwählen 6. beginnend ab Startadresse 20 oder alle Zeichen bis <CR> erkannt wurde auslesen 7. Sprung nach 1. PS Wenn die einzelnen Strings mit einer feststehenden Zeichensequenz ( Header ) beginnen, dann dürfte es empfehlenswert sein, zwischen 2. und 3. auch noch eine Suchschleife für diesen Header einzufügen. Ich habe so etwas jedenfalls schon häufig mit 8051 kompatiblen Prozessoren ( z.B. AT89C2051 ) realisiert und auf diese Weise z.B. von GPS-Empfängern stammende NMEA-Daten speed-konvertiert. Die Mimik verarbeitet also ganz einfach die dem seriellen Prozessoreingang ( hier: P3.0 ) mit 4800bps zugeführten Daten und gibt sie am seriellen Ausgang ( hier P3.1 ) wieder mit 9600bps aus. Probleme in Form von Unterschlagung einzelner Protokolle könnte es allenfalls dann geben, wenn neue Daten bereits vor Beendigung der vorherigen Ausgabe eintreffen. Klaus
Danke Klaus. Ich hab ja bereits die Hardware am laufen. Teste ich das ganze von PC zu PC funktioniert das ganze einwandfrei. Leider und das ist mein Problem, kann ich keine Daten mit dem µC empfangen. Auch wenn ich den Funkempfänger direkt an den PC anschließe bekomme ich nur mit Hyperterminal eine Ausgabe, H-Term zeigt nichts an (nicht ein empfangenes Byte). Darin liegt wohl eine parallele zum µC. Der Empfangsinterrupt wird auch bei ihm nicht einmal ausgelöst. Aber warum ist das so? Was kann Hyperterminal, was H-Term und mein µC nicht können???? Hias
Hallo Matthias, dann vermute ich, daß die einzelnen Stringenden von Deiner uC-Software nicht erkannt werden. Es gilt also festzustellen, ob und ggf. welche Steuerzeichen der Empfänger hierbei liefert. Wenn Du mit HyperTerminal auswertest, werden die Strings dann fortlaufend oder jeweils beginnend in einer neuen Zeile geschrieben? ... oder ist zwischen den dargestellten Strings vielleicht sogar noch eine Leerzeile eingefügt? Abhängig von dieser Darstellung lassen sich Rückschlüsse auf die am Stringende übermittelten Steuerzeichen schliessen. Dabei sollte man auch noch wissen, ob das automatische Anfügen von <CR><LF> am Zeilenende vorher in den Einstellungen von HyperTerminal aktiviert wurde. Wenn ich ein vergleichbares Problem habe, dann benutzte ich anstelle von HyperTerminal ein von irgendwo stammendes kleines Terminalprogramm, das zusätzlich auch eine Hex-Darstellung der empfangenen Zeichen erlaubt. Hierbei sieht man auch, was zwischen den einzelnen Strings passiert ( bzw. nicht passiert ) und damit in der Regel auch sehr schnell die Ursachen für auftretende Schwierigkeiten. Als unlängst wegen einer Lapalie abgemahnter böser "Copyrightverletzer" fällt es mir allerdings schwer, das Programm hier allgemein zur Verfügung zu stellen. PS: Um der Problemlösung näher zu kommen, könnte man versuchsweise auch erst einmal nur die Einlese- und Ausleseroutinen für einzelne ASCII-Zeichen in einer gemeinsamen Schleife durchlaufen lassen. Dann müssten immerhin die seriell ankommenden Zeichen wieder ( mit der gleichen Datenrate ) am seriellen Ausgang erscheinen. Wenn dass klappt, dann könnte man das Ganze auf die Verarbeitung kompletter Strings erweitern und danach als 3. Schritt erst mit unterschiedlichen Ein- und Ausgabedatenraten arbeiten. Klaus
Hallo, ich denke mal ein Link zu posten ist nicht sträflic ;-). http://www.der-hammer.info/terminal/ dieses Terminal kann die zahlen auch als bin und hex und dec anzeigen. gruß Peter
Hallo zusammen. Ich habe heute nochmal alles getestet. Folgendes Ergebnis: Ich kann jetzt mit beliebigen Terminalprogrammen, per RS232 die gesendeten Daten, die per Funk übertragen werden, empfangen. Das geschieht ohne Fehler auch auf eine Strecke von über 1km. Das einzigste was nicht funktioniert, ist das Auslösen eines Interrupts in meinem µC (90S2313). An was könnte das liegen? Auszug aus dem Code:
1 | ISR (SIG_UART_RECV) // Empfangsinterrupt |
2 | {
|
3 | LEDon(); |
4 | unsigned char recv; |
5 | |
6 | recv=UDR; //Zeichen vom Register holen |
7 | uart_putc (recv); //Zeichen zurücksenden |
8 | time =0; |
9 | return; |
10 | }
|
11 | |
12 | void inituart(void) |
13 | {
|
14 | UCR = (1<<RXEN)|(1<<RXCIE); //Enable Receiver,Transmitter, Receiver-Interrupt)´ |
15 | UBRR = 103; //Setting for 4800Baud |
16 | }
|
UART wird initialisiert, und Globalinterrupts aktiviert. Das komische dabei ist, dass ich die Daten die ich mittels PC (wiederum durch ein Treminalprogramm) sende(mit 4800Baud) einwandfrei mit dem µC empfange und weitergeben kann. Schließe ich das ganze an die Funkanlage an wird der Empfangsinterrupt nicht ausgelöst. An was könnte das liegen? Hardware Handshake wird definitiv nicht verwendet, Software-Handshake scheidet ebenfalls aus, da der Funk nur per TX und Masse angeschlossen ist. Es gibt keine "Rückleitung", also nur einseitige Übertragung. MfG Hias Edit: Im UCR Register gibt es ein Bit RXB8. Muss ich das setzen? When Bit set, RXB8 is the ninth data bit of the received character. Was genau ist RXB8?
RXB8 kann man nicht setzen. Das ist das 9. Bit bei einer 9-Bit-Übertragung (1. bis 8. Bit = UDR). Hast du schon mal mit einem Oszi am AVR gemessen ob Daten anliegen. Stimmen denn die Start- und Stopbiteinstellungen beim PC und µC überein? Verwendest du vielleicht ein anderes gekreuztes Kabel?
Hallo zusammen! Ich denke, dass ich mal einen Softwarefehler ausließen kann, denn von PC zu PC funktioniert es ja. So hab ich mir mal die Hardware angeschaut. Zwei Dinge sind mit dabei aufgefallen: Verkleinere ich die Elkos der externen Beschaltung des MAX232 dann empfange ich zumindest etwas, wenn auch das nur Müll ist. Ich habe die Elkos von 10µF auf 1µF verkleinert. Passen diese Werte nun, oder soll ich auf 0,1µF gehen? Kann es eventuell am Quarz liegen? Ich verwende ein normales Quarz mit 8 MHz. Muss ich ein Baudratenquarz verwenden? Hias
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.