Forum: Mikrocontroller und Digitale Elektronik Denkanstoß - BER Berechnung


von Timo (Gast)


Lesenswert?

Hallo zusammen,

ich empfange mit einem µC (Renesas M32C) (über den UART) meine gesendete 
Zeichen, welche von einem 2. µC gesendet werden.

Bsp:
10101010 | 10101010 | 01010101 | 01010101 | 01010101
einschwing - preamble - data      data        data

(dies wird zum bsp. alle 5ms gesendet)


Mein programm war zuerst so geschrieben, dass die ersten beiden zeichen 
ignoriert werden und erst danach ein bitvergleich stattfindet.

Ich möchte aber die Zeichen nicht einfach ignorieren
zum Bsp:
1. Zeichen ignorieren
2. Zeichen auswerten, wenn ja dann bitvergleich, wenn nein dann wieder 
auf neuen anfang warten oder so ...

Ich weiß grad nicht wie ich genau auf den neuen anfang warten soll.
Immoment ist es so:

if(empfanges Zeichen == 0xAA)
 // Bitvergleich
else
 // 3 Zeichen einlesen und verwerfen

Aber das genau so ein Käse...

Vielleicht hat von euch schon jemand etwas in der <Richtung programmiert 
und kann mir einen Denkanstoß geben.

Gruß Timo

von Karl H. (kbuchegg)


Lesenswert?

Bei deinem Problem würde es sich anbieten einen Zeichenzähler
als 'Schmalspur-Statemachine' einzusetzen

als Pseudo-Code
1
  Zaehler = 0
2
3
  while( 1 ) {    // die klassische main-Hauptschleife
4
5
    if( Zeichen empfangen ) {
6
7
      if( Zaehler == 0 ) {     // müsste das das Einschwingzeichen sein?
8
        if( Zeichen == 0xAA ) // ist es richtig ?
9
          Zaehler++;       
10
      }
11
12
      else if( Zaehler == 1 ) {    // das muesste jetzt die Preambel sein
13
        if( Zeichen == 0xAA )      // ist sie richtig ?
14
          Zaehler++;
15
        else
16
          Zaehler = 0;             // nein: zurück an Anfang
17
      }
18
19
      else {                       // Zeichen 2 bis 4: Daten
20
        if( Zaehler == 4 )         // Wenns das letzt Datenzeichen war
21
          Zaehler = 0;             // dann muss wieder das Einschwingzeichen
22
                                   // kommen
23
        mach was mit den Zeichen
24
      }
25
    }
26
  }

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich würde es mit einem kleinen Automatenrealisieren:

state = 0;
1
while(true) {
2
 zeichen = recive();
3
 
4
 switch (state)
5
  case 0:
6
   if (zeichen == 0xAA) 
7
    state = 1
8
   break
9
10
  case 1:
11
   if (zeichen == 0xAA) 
12
    bitergleich(zeichen)
13
    state = 2
14
   else
15
    state=0
16
   break
17
  case 2:
18
   savedata(zeichen)
19
   if (datenende)
20
    state = 0
21
  break;
22
}
ist jezt natürlich pseudocode aber prinzip sollte klar sein.

Mist und der Karlheinz war schneller :( wein

von Peter D. (peda)


Lesenswert?

Wenn "einschwing" das bedeutet, wie es heißt, d.h. daß das Byte 
korrumpiert sein kann, dann ist die UART hoffnungslos am Arsch.

Für die UART sind nur solche Zeichen zum Synchronisieren erlaubt, die 
außer dem Startbit keine weiteren 1-0 Flanken enthalten, z.B. 0xF0 ist 
o.k.


Peter

von Timo (Gast)


Lesenswert?

Hallo zusammen,
ja die beiden codebsp sind klar und daran hab ich auch gedacht ..
nur hab ich das problem, dass direkt das erste zeichen bei der 
funkübertragung nicht immer zu 100% ankommt und die erste 10101010 als 
11101010 erkannt wird .. und da liegt hauptsächlich mein problem.

weil dadurch verliere ich ein haufen pakete.

der versuchsaufbau ist dafür da die bitfehlerrate der funkstrecke zu 
testen

gruß

von Peter D. (peda)


Lesenswert?

Timo wrote:
> nur hab ich das problem, dass direkt das erste zeichen bei der
> funkübertragung nicht immer zu 100% ankommt und die erste 10101010 als
> 11101010 erkannt wird .. und da liegt hauptsächlich mein problem.

Ja, das ist ja genau meine Rede.
Die UART hat keine Nase, womit sie riechen kann, was die Daten sind.
In der Technik muß man immer eindeutige Signale einsetzen.

Nimm 0xF0 zur Synchronisation und dann klappts auch.


Peter

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.