Forum: Mikrocontroller und Digitale Elektronik Baudraten Verdoppelung


von E. M. (hias)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von E. M. (hias)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von E. M. (hias)


Lesenswert?

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

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Werden die Handshake leitungen verwendet? oder sind sie im alten stecker 
miteinander verbunden?

von E. M. (hias)


Lesenswert?

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

von gpsklaus (Gast)


Lesenswert?

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

von E. M. (hias)


Lesenswert?

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

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

Softhandshake? (XON/XOFF)

von gpsklaus (Gast)


Lesenswert?

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


von Peter (Gast)


Lesenswert?

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

von E. M. (hias)


Lesenswert?

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?

von E. M. (hias)


Lesenswert?

keiner ne idee?

von Andreas W. (Gast)


Lesenswert?

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?

von E. M. (hias)


Lesenswert?

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
Noch kein Account? Hier anmelden.